Skip to content

Commit 521d46d

Browse files
authored
🆕 #3828 【微信支付】更新商家转账 API 的请求和响应字段,同步官方文档的字段调整,新增转账场景报备信息
1 parent 84b5c4d commit 521d46d

File tree

4 files changed

+84
-19
lines changed

4 files changed

+84
-19
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/transfer/BusinessOperationTransferRequest.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import lombok.Builder;
77
import lombok.Data;
88
import lombok.NoArgsConstructor;
9+
import lombok.experimental.Accessors;
910

1011
import java.io.Serializable;
12+
import java.util.List;
1113

1214
/**
1315
* 运营工具-商家转账请求参数
@@ -37,11 +39,11 @@ public class BusinessOperationTransferRequest implements Serializable {
3739
private String outBillNo;
3840

3941
/**
40-
* 运营工具转账场景ID
41-
* 必须,用于标识运营工具转账的具体业务场景
42+
* 转账场景ID
43+
* 必须,该笔转账使用的转账场景,可前往“商户平台-产品中心-商家转账”中申请。如:1000(现金营销),1006(企业报销)等
4244
*/
43-
@SerializedName("operation_scene_id")
44-
private String operationSceneId;
45+
@SerializedName("transfer_scene_id")
46+
private String transferSceneId;
4547

4648
/**
4749
* 用户在直连商户应用下的用户标示
@@ -86,4 +88,36 @@ public class BusinessOperationTransferRequest implements Serializable {
8688
*/
8789
@SerializedName("notify_url")
8890
private String notifyUrl;
89-
}
91+
92+
/**
93+
* 转账场景报备信息
94+
* 必须,需按转账场景准确填写报备信息,参考 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4013774588">转账场景报备信息字段说明</a>
95+
*/
96+
@SerializedName("transfer_scene_report_infos")
97+
private List<TransferSceneReportInfo> transferSceneReportInfos;
98+
99+
/**
100+
* 转账场景报备信息
101+
*/
102+
@Data
103+
@Accessors(chain = true)
104+
public static class TransferSceneReportInfo implements Serializable {
105+
private static final long serialVersionUID = 1L;
106+
107+
/**
108+
* 信息类型
109+
* 必须,不能超过15个字符,商户所属转账场景下的信息类型,此字段内容为固定值,需严格按照 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4013774588">转账场景报备信息字段说明</a> 传参。
110+
*/
111+
@SerializedName("info_type")
112+
private String infoType;
113+
114+
/**
115+
* 信息内容
116+
* 必须,不能超过32个字符,商户所属转账场景下的信息内容,商户可按实际业务场景自定义传参,需严格按照 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4013774588">转账场景报备信息字段说明</a> 传参。
117+
*/
118+
@SerializedName("info_content")
119+
private String infoContent;
120+
121+
}
122+
123+
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/transfer/BusinessOperationTransferResult.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,27 @@ public class BusinessOperationTransferResult implements Serializable {
3131
private String transferBillNo;
3232

3333
/**
34-
* 转账状态
35-
* WAIT_PAY:等待确认
36-
* PROCESSING:转账中
37-
* SUCCESS:转账成功
38-
* FAIL:转账失败
39-
* REFUND:已退款
34+
* 单据状态
35+
* 商家转账订单状态
36+
* ACCEPTED:转账已受理,可原单重试(非终态)。
37+
* PROCESSING: 转账锁定资金中。如果一直停留在该状态,建议检查账户余额是否足够,如余额不足,可充值后再原单重试(非终态)。
38+
* WAIT_USER_CONFIRM: 待收款用户确认,当前转账单据资金已锁定,可拉起微信收款确认页面进行收款确认(非终态)。
39+
* TRANSFERING: 转账中,可拉起微信收款确认页面再次重试确认收款(非终态)。
40+
* SUCCESS: 转账成功,表示转账单据已成功(终态)。
41+
* FAIL: 转账失败,表示该笔转账单据已失败。若需重新向用户转账,请重新生成单据并再次发起(终态)。
42+
* CANCELING: 转账撤销中,商户撤销请求受理成功,该笔转账正在撤销中,需查单确认撤销的转账单据状态(非终态)。
43+
* CANCELLED: 转账撤销完成,代表转账单据已撤销成功(终态)。
4044
*/
41-
@SerializedName("transfer_state")
42-
private String transferState;
45+
@SerializedName("state")
46+
private String state;
47+
48+
/**
49+
* 跳转领取页面的package信息
50+
* 跳转微信支付收款页的package信息, <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012719576">APP调起用户确认收款</a> 或者 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716430">JSAPI调起用户确认收款</a> 时需要使用的参数。仅当转账单据状态为WAIT_USER_CONFIRM时返回。<br>
51+
* 单据创建后,用户24小时内不领取将过期关闭,建议拉起用户确认收款页面前,先查单据状态:如单据状态为WAIT_USER_CONFIRM,可用之前的package信息拉起;单据到终态时需更换单号重新发起转账。
52+
*/
53+
@SerializedName("package_info")
54+
private String packageInfo;
4355

4456
/**
4557
* 发起转账的时间

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/example/BusinessOperationTransferExample.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.github.binarywang.wxpay.service.WxPayService;
99
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
1010

11+
import java.util.Arrays;
12+
1113
/**
1214
* 运营工具-商家转账API使用示例
1315
*
@@ -41,10 +43,15 @@ public void init() {
4143
public void createOperationTransferExample() {
4244
try {
4345
// 构建转账请求
46+
BusinessOperationTransferRequest.TransferSceneReportInfo reportInfo = new BusinessOperationTransferRequest.TransferSceneReportInfo();
47+
reportInfo.setInfoType("活动名称");
48+
reportInfo.setInfoContent("新会员有礼");
49+
4450
BusinessOperationTransferRequest request = BusinessOperationTransferRequest.newBuilder()
4551
.appid("your_app_id") // 应用ID
4652
.outBillNo("OT" + System.currentTimeMillis()) // 商户转账单号
47-
.operationSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING) // 运营工具转账场景ID
53+
.transferSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING) // 运营工具转账场景ID
54+
.transferSceneReportInfos(Arrays.asList(reportInfo)) // 转账场景报备信息
4855
.openid("user_openid") // 用户openid
4956
.userName("张三") // 用户姓名(可选)
5057
.transferAmount(100) // 转账金额,单位分
@@ -59,7 +66,8 @@ public void createOperationTransferExample() {
5966
System.out.println("转账成功!");
6067
System.out.println("商户单号: " + result.getOutBillNo());
6168
System.out.println("微信转账单号: " + result.getTransferBillNo());
62-
System.out.println("转账状态: " + result.getTransferState());
69+
System.out.println("单据状态: " + result.getState());
70+
System.out.println("跳转领取页面的package信息: " + result.getPackageInfo());
6371
System.out.println("创建时间: " + result.getCreateTime());
6472

6573
} catch (WxPayException e) {

weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/BusinessOperationTransferServiceTest.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.testng.annotations.BeforeClass;
88
import org.testng.annotations.Test;
99

10+
import java.util.Arrays;
11+
1012
import static org.assertj.core.api.Assertions.assertThat;
1113

1214
/**
@@ -36,18 +38,25 @@ public void testServiceInitialization() {
3638

3739
@Test
3840
public void testRequestBuilder() {
41+
42+
// 构建转账请求
43+
BusinessOperationTransferRequest.TransferSceneReportInfo reportInfo = new BusinessOperationTransferRequest.TransferSceneReportInfo();
44+
reportInfo.setInfoType("test_info_type");
45+
reportInfo.setInfoContent("test_info_content");
46+
3947
BusinessOperationTransferRequest request = BusinessOperationTransferRequest.newBuilder()
4048
.appid("test_app_id")
4149
.outBillNo("OT" + System.currentTimeMillis())
42-
.operationSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING)
50+
.transferSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING)
51+
.transferSceneReportInfos(Arrays.asList(reportInfo))
4352
.openid("test_openid")
4453
.transferAmount(100)
4554
.transferRemark("测试转账")
4655
.userRecvPerception(WxPayConstants.UserRecvPerception.CASH_MARKETING.CASH)
4756
.build();
4857

4958
assertThat(request.getAppid()).isEqualTo("test_app_id");
50-
assertThat(request.getOperationSceneId()).isEqualTo(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING);
59+
assertThat(request.getTransferSceneId()).isEqualTo(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING);
5160
assertThat(request.getTransferAmount()).isEqualTo(100);
5261
assertThat(request.getTransferRemark()).isEqualTo("测试转账");
5362
}
@@ -77,11 +86,13 @@ public void testResultClasses() {
7786
BusinessOperationTransferResult result = new BusinessOperationTransferResult();
7887
result.setOutBillNo("test_out_bill_no");
7988
result.setTransferBillNo("test_transfer_bill_no");
80-
result.setTransferState("SUCCESS");
89+
result.setState("SUCCESS");
90+
result.setPackageInfo("test_package_info");
8191

8292
assertThat(result.getOutBillNo()).isEqualTo("test_out_bill_no");
8393
assertThat(result.getTransferBillNo()).isEqualTo("test_transfer_bill_no");
84-
assertThat(result.getTransferState()).isEqualTo("SUCCESS");
94+
assertThat(result.getState()).isEqualTo("SUCCESS");
95+
assertThat(result.getPackageInfo()).isEqualTo("test_package_info");
8596

8697
BusinessOperationTransferQueryResult queryResult = new BusinessOperationTransferQueryResult();
8798
queryResult.setOperationSceneId("2001");

0 commit comments

Comments
 (0)