1
0
mirror of synced 2026-03-23 21:18:58 +08:00

🎨 #3918 【微信支付】服务商退款(V3)请求对象补齐缺失字段 (sp_appid 和 sub_appid)

This commit is contained in:
Copilot
2026-03-10 16:07:22 +08:00
committed by GitHub
parent cd15fd7567
commit 1eeb095ead
3 changed files with 87 additions and 3 deletions

View File

@@ -11,15 +11,38 @@ import java.io.Serializable;
* 微信支付服务商退款请求
* 文档见https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_9.shtml
*
* @author Pursuer
* @version 1.0
* @date 2023/3/2
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class WxPayPartnerRefundV3Request extends WxPayRefundV3Request implements Serializable {
private static final long serialVersionUID = -1L;
/**
* <pre>
* 字段名服务商应用ID
* 变量名sp_appid
* 是否必填:是
* 类型string[1, 32]
* 描述:
* 服务商申请的公众号或移动应用appid。
* 示例值wx8888888888888888
* </pre>
*/
@SerializedName(value = "sp_appid")
private String spAppid;
/**
* <pre>
* 字段名子商户应用ID
* 变量名sub_appid
* 是否必填:否
* 类型string[1, 32]
* 描述:
* 子商户申请的公众号或移动应用appid。如果传了sub_appid那sub_appid对应的订单必须存在。
* 示例值wx8888888888888888
* </pre>
*/
@SerializedName(value = "sub_appid")
private String subAppid;
/**
* <pre>
* 字段名:退款资金来源

View File

@@ -404,6 +404,12 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
@Override
public WxPayRefundV3Result partnerRefundV3(WxPayPartnerRefundV3Request request) throws WxPayException {
if (StringUtils.isBlank(request.getSpAppid())) {
request.setSpAppid(this.getConfig().getAppId());
}
if (StringUtils.isBlank(request.getSubAppid()) && StringUtils.isNotBlank(this.getConfig().getSubAppId())) {
request.setSubAppid(this.getConfig().getSubAppId());
}
if (StringUtils.isBlank(request.getNotifyUrl())) {
request.setNotifyUrl(this.getConfig().getRefundNotifyUrl());
}

View File

@@ -0,0 +1,55 @@
package com.github.binarywang.wxpay.bean.request;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.testng.annotations.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* {@link WxPayPartnerRefundV3Request} 单元测试
*
*/
public class WxPayPartnerRefundV3RequestTest {
@Test
public void testSpAppidAndSubAppidSerialization() {
WxPayPartnerRefundV3Request request = new WxPayPartnerRefundV3Request();
request.setSpAppid("wx8888888888888888");
request.setSubAppid("wxd678efh567hg6999");
request.setSubMchid("1230000109");
request.setOutRefundNo("1217752501201407033233368018");
request.setFundsAccount("AVAILABLE");
Gson gson = new Gson();
String json = gson.toJson(request);
JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
assertThat(jsonObject.has("sp_appid")).isTrue();
assertThat(jsonObject.get("sp_appid").getAsString()).isEqualTo("wx8888888888888888");
assertThat(jsonObject.has("sub_appid")).isTrue();
assertThat(jsonObject.get("sub_appid").getAsString()).isEqualTo("wxd678efh567hg6999");
assertThat(jsonObject.has("sub_mchid")).isTrue();
assertThat(jsonObject.get("sub_mchid").getAsString()).isEqualTo("1230000109");
assertThat(jsonObject.has("out_refund_no")).isTrue();
assertThat(jsonObject.get("out_refund_no").getAsString()).isEqualTo("1217752501201407033233368018");
assertThat(jsonObject.has("funds_account")).isTrue();
assertThat(jsonObject.get("funds_account").getAsString()).isEqualTo("AVAILABLE");
}
@Test
public void testSubAppidIsOptional() {
WxPayPartnerRefundV3Request request = new WxPayPartnerRefundV3Request();
request.setSpAppid("wx8888888888888888");
request.setSubMchid("1230000109");
request.setOutRefundNo("1217752501201407033233368018");
Gson gson = new Gson();
String json = gson.toJson(request);
JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
assertThat(jsonObject.has("sp_appid")).isTrue();
assertThat(jsonObject.get("sp_appid").getAsString()).isEqualTo("wx8888888888888888");
assertThat(jsonObject.has("sub_appid")).isFalse();
}
}