Skip to content

Commit 6ccfe0b

Browse files
committed
增加2025.1.15新的商家转账接口 /v3/fund-app/mch-transfer/transfer-bills
1 parent 83bd92d commit 6ccfe0b

6 files changed

Lines changed: 292 additions & 0 deletions

File tree

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.github.binarywang.wxpay.bean.transfer;
2+
3+
import com.github.binarywang.wxpay.bean.notify.OriginNotifyResponse;
4+
import com.github.binarywang.wxpay.bean.notify.WxPayBaseNotifyV3Result;
5+
import com.google.gson.annotations.SerializedName;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.io.Serializable;
10+
11+
/**
12+
* <pre>
13+
* 商家转账到零钱接口将转账结果通知用户
14+
* 文档地址:https://pay.weixin.qq.com/doc/v3/merchant/4012716434
15+
* </pre>
16+
*/
17+
@Data
18+
public class TransferBillsNotifyResult implements Serializable, WxPayBaseNotifyV3Result<TransferBillsNotifyResult.DecryptNotifyResult> {
19+
/**
20+
* 源数据
21+
*/
22+
private OriginNotifyResponse rawData;
23+
/**
24+
* 解密后的数据
25+
*/
26+
private TransferBillsNotifyResult.DecryptNotifyResult result;
27+
28+
@Data
29+
@NoArgsConstructor
30+
public static class DecryptNotifyResult implements Serializable {
31+
/**
32+
* 商户号
33+
*/
34+
@SerializedName(value = "mch_id")
35+
private String mchId;
36+
/**
37+
* 商家批次单号
38+
*/
39+
@SerializedName(value = "out_bill_no")
40+
private String outBillNo;
41+
/**
42+
* 微信批次单号
43+
*/
44+
@SerializedName(value = "transfer_bill_no")
45+
private String transferBillNo;
46+
/**
47+
* 批次状态
48+
*/
49+
@SerializedName(value = "state")
50+
private String state;
51+
/**
52+
* 转账金额
53+
*/
54+
@SerializedName(value = "transfer_amount")
55+
private Integer transferAmount;
56+
57+
/**
58+
* 批次状态
59+
*/
60+
@SerializedName(value = "openid")
61+
private String openid;
62+
63+
/**
64+
* 单据创建时间
65+
*/
66+
@SerializedName(value = "create_time")
67+
private String createTime;
68+
/**
69+
* 最后一次状态变更时间
70+
*/
71+
@SerializedName(value = "update_time")
72+
private String updateTime;
73+
/**
74+
* 错误原因
75+
*/
76+
@SerializedName(value = "fail_reason")
77+
private String failReason;
78+
}
79+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.github.binarywang.wxpay.bean.transfer;
2+
3+
import com.github.binarywang.wxpay.v3.SpecEncrypt;
4+
import com.google.gson.annotations.SerializedName;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
import java.io.Serializable;
11+
import java.util.List;
12+
13+
/**
14+
* 发起商家转账API参数
15+
*
16+
* @author allovine
17+
* created on 2025/1/15
18+
**/
19+
@Data
20+
@Builder(builderMethodName = "newBuilder")
21+
@NoArgsConstructor
22+
@AllArgsConstructor
23+
public class TransferBillsRequest implements Serializable {
24+
private static final long serialVersionUID = -2175582517588397437L;
25+
26+
/**
27+
* 直连商户的appid
28+
*/
29+
@SerializedName("appid")
30+
private String appid;
31+
32+
/**
33+
* 商户系统内部的商家单号
34+
*/
35+
@SerializedName("out_bill_no")
36+
private String outBillNo;
37+
38+
/**
39+
* 转账场景ID
40+
* 商户平台-产品中心-商家转账 申请
41+
* 佣金报酬 ID:1005
42+
*/
43+
@SerializedName("transfer_scene_id")
44+
private String transferSceneId;
45+
46+
/**
47+
* 用户在直连商户应用下的用户标示
48+
*/
49+
@SerializedName("openid")
50+
private String openid;
51+
52+
/**
53+
* 收款用户姓名
54+
*/
55+
@SpecEncrypt
56+
@SerializedName("user_name")
57+
private String userName;
58+
59+
/**
60+
* 转账金额
61+
*/
62+
@SerializedName("transfer_amount")
63+
private Integer transferAmount;
64+
65+
/**
66+
* 转账备注
67+
*/
68+
@SerializedName("transfer_remark")
69+
private String transferRemark;
70+
71+
/**
72+
* 异步接收微信支付结果通知的回调地址,通知url必须为公网可访问的url,必须为https,不能携带参数
73+
*/
74+
@SerializedName("notify_url")
75+
private String notifyUrl;
76+
77+
/**
78+
* 用户收款感知
79+
*/
80+
@SerializedName("user_recv_perception")
81+
private String userRecvPerception;
82+
83+
84+
/**
85+
* 转账场景报备信息
86+
*/
87+
@SpecEncrypt
88+
@SerializedName("transfer_scene_report_infos")
89+
private List<TransferSceneReportInfo> transferSceneReportInfos;
90+
91+
92+
93+
94+
@Data
95+
@Builder(builderMethodName = "newBuilder")
96+
@AllArgsConstructor
97+
@NoArgsConstructor
98+
public static class TransferSceneReportInfo {
99+
/**
100+
* 信息类型
101+
*/
102+
@SerializedName("info_type")
103+
private String infoType;
104+
105+
/**
106+
* 信息内容
107+
*/
108+
@SerializedName("info_content")
109+
private String infoContent;
110+
}
111+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.github.binarywang.wxpay.bean.transfer;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.io.Serializable;
8+
9+
/**
10+
* 商家转账结果
11+
*
12+
* @author allovine
13+
* created on 2025/1/15
14+
**/
15+
@Data
16+
@NoArgsConstructor
17+
public class TransferBillsResult implements Serializable {
18+
private static final long serialVersionUID = -2175582517588397437L;
19+
20+
/**
21+
* 商户单号
22+
*/
23+
@SerializedName("out_bill_no")
24+
private String outBillNo;
25+
26+
/**
27+
* 微信转账单号
28+
*/
29+
@SerializedName("transfer_bill_no")
30+
private String transferBillNo;
31+
32+
/**
33+
* 单据创建时间
34+
*/
35+
@SerializedName("create_time")
36+
private String createTime;
37+
38+
/**
39+
* 单据状态
40+
*/
41+
@SerializedName("status")
42+
private String status;
43+
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/TransferService.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,31 @@ public interface TransferService {
111111
*/
112112
TransferBatchDetailResult transferBatchesOutBatchNoDetail(String outBatchNo, String outDetailNo) throws WxPayException;
113113

114+
/**
115+
* <pre>
116+
*
117+
* 2025.1.15 开始新接口 发起商家转账API
118+
*
119+
* 请求方式:POST(HTTPS)
120+
* 请求地址:<a href="https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills">请求地址</a>
121+
*
122+
* 文档地址:<a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716434">发起商家转账API</a>
123+
* </pre>
124+
*
125+
* @param request 转账请求参数
126+
* @return TransferBillsResult 转账结果
127+
* @throws WxPayException .
128+
*/
129+
TransferBillsResult transferBills(TransferBillsRequest request) throws WxPayException;
130+
131+
/**
132+
* 2025.1.15 开始新接口 解析商家转账结果
133+
* 详见<a href="https://pay.weixin.qq.com/doc/v3/merchant/4012712115"></a>
134+
*
135+
* @param notifyData 通知数据
136+
* @param header 通知头部数据,不传则表示不校验头
137+
* @return the wx transfer notify result
138+
* @throws WxPayException the wx pay exception
139+
*/
140+
TransferBillsNotifyResult parseTransferBillsNotifyResult(String notifyData, SignatureHeader header) throws WxPayException;
114141
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/TransferServiceImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,22 @@ public TransferBatchDetailResult transferBatchesOutBatchNoDetail(String outBatch
8585
String result = this.payService.getV3(url);
8686
return GSON.fromJson(result, TransferBatchDetailResult.class);
8787
}
88+
89+
@Override
90+
public TransferBillsResult transferBills(TransferBillsRequest request) throws WxPayException {
91+
String url = String.format("%s/v3/fund-app/mch-transfer/transfer-bills", this.payService.getPayBaseUrl());
92+
if (request.getUserName() != null && request.getUserName().length() > 0) {
93+
String userName = request.getUserName();
94+
X509Certificate validCertificate = this.payService.getConfig().getVerifier().getValidCertificate();
95+
RsaCryptoUtil.encryptFields(userName, validCertificate);
96+
request.setUserName(userName);
97+
}
98+
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
99+
return GSON.fromJson(result, TransferBillsResult.class);
100+
}
101+
102+
@Override
103+
public TransferBillsNotifyResult parseTransferBillsNotifyResult(String notifyData, SignatureHeader header) throws WxPayException {
104+
return this.payService.baseParseOrderNotifyV3Result(notifyData, header, TransferBillsNotifyResult.class, TransferBillsNotifyResult.DecryptNotifyResult.class);
105+
}
88106
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.github.binarywang.wxpay.bean.transfer.QueryTransferBatchesRequest;
44
import com.github.binarywang.wxpay.bean.transfer.TransferBatchesRequest;
5+
import com.github.binarywang.wxpay.bean.transfer.TransferBillsRequest;
56
import com.github.binarywang.wxpay.exception.WxPayException;
67
import com.github.binarywang.wxpay.service.WxPayService;
78
import com.github.binarywang.wxpay.testbase.ApiTestModule;
@@ -73,4 +74,17 @@ public void testTransferBatchesOutBatchNo() throws WxPayException {
7374
public void testTransferBatchesOutBatchNoDetail() throws WxPayException {
7475
log.info("商家明细单号查询明细单:{}", this.payService.getTransferService().transferBatchesOutBatchNoDetail("1655447999520", "1655447989156"));
7576
}
77+
78+
@Test
79+
public void testTransferBills() throws WxPayException {
80+
TransferBillsRequest transferBillsRequest = TransferBillsRequest.newBuilder()
81+
.appid("wxf636efh5xxxxx")
82+
.outBillNo("1655447989156")
83+
.transferSceneId("1005")
84+
.transferAmount(100)
85+
.transferRemark("测试转账")
86+
.openid("oX_7Jzr9gSZz4X_Xc9-_7HGf8XzI")
87+
.userName("测试用户").build();
88+
log.info("发起商家转账:{}", this.payService.getTransferService().transferBills(transferBillsRequest));
89+
}
7690
}

0 commit comments

Comments
 (0)