🆕【微信支付】支持服务商模式的扣款服务接口

This commit is contained in:
luckyxz 2023-02-18 14:56:01 +00:00 committed by binarywang
parent b83435281d
commit 59074bae86
4 changed files with 61 additions and 0 deletions

View File

@ -62,6 +62,13 @@ public class WxWithholdNotifyResult extends BaseWxPayResult {
@XStreamAlias("is_subscribe")
private String isSubscribe;
/**
* 是否关注子商户关联的公众号
* 非必传
*/
@XStreamAlias("sub_is_subscribe")
private String subIsSubscribe;
/**
* 付款银行
*/
@ -191,6 +198,7 @@ public class WxWithholdNotifyResult extends BaseWxPayResult {
deviceInfo = readXmlString(d, "device_info");
openId = readXmlString(d, "openid");
isSubscribe = readXmlString(d, "is_subscribe");
subIsSubscribe = readXmlString(d, "sub_is_subscribe");
subOpenId = readXmlString(d, "sub_openid");
bankType = readXmlString(d, "bank_type");
totalFee = readXmlInteger(d, "total_fee");

View File

@ -86,6 +86,24 @@ public interface WxEntrustPapService {
*/
WxWithholdResult withhold(WxWithholdRequest wxWithholdRequest) throws WxPayException;
/**
* 服务商模式的申请扣款
* <pre>
* 申请扣款
* 详见<a href="https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter5_8.shtml">https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter5_8.shtml</a>
* 请求微信发起委托扣款扣款额度和次数由使用的签约模板限制
* 该扣款接口是立即扣款 无延时 扣款前无消息通知
*
* 特殊情况周期扣费为通知后24小时扣费方式情况下如果用户为首次签约包含解约后重新签约
* 从用户签约成功时间开始算商户在12小时内发起的扣款会被立即执行无延迟商户超过12小时以后发起的扣款都按24小时扣费规则执行
* </pre>
*
* @param wxWithholdRequest the wx withhold request
* @return wx withhold result
* @throws WxPayException the wx pay exception
*/
WxPayCommonResult withholdPartner(WxWithholdRequest wxWithholdRequest) throws WxPayException;
/**
* 预扣费通知
* <pre>

View File

@ -101,6 +101,16 @@ public class WxEntrustPapServiceImpl implements WxEntrustPapService {
return result;
}
@Override
public WxPayCommonResult withholdPartner(WxWithholdRequest wxWithholdRequest) throws WxPayException {
wxWithholdRequest.checkAndSign(payService.getConfig());
String url = payService.getPayBaseUrl() + "/pay/partner/pappayapply";
String responseContent = payService.post(url, wxWithholdRequest.toXML(), false);
WxPayCommonResult result = BaseWxPayResult.fromXML(responseContent, WxPayCommonResult.class);
result.checkResult(payService, wxWithholdRequest.getSignType(), true);
return result;
}
@Override
public String preWithhold(WxPreWithholdRequest wxPreWithholdRequest) throws WxPayException {
String requestParam = WxGsonBuilder.create().toJson(wxPreWithholdRequest);

View File

@ -177,6 +177,31 @@ public class WxEntrustPapServiceTest {
}
}
@Test
public void testWithholdPartner() {
String outTradeNo = "101010101";
WxWithholdRequest withholdRequest = WxWithholdRequest.newBuilder()
.attach("local")
.body("产品名字")
.contractId("202011065409471222") // 微信返回的签约协议号
.detail("产品描述")
.feeType("CNY")
//.goodsTag()
.notifyUrl("http://domain.com/api/wxpay/withhold/callback.do")
.outTradeNo(outTradeNo)
.spbillCreateIp("127.0.0.1")
.totalFee(1)
.tradeType("PAP")
.build();
try {
WxPayCommonResult wxPayCommonResult = this.payService.getWxEntrustPapService().withholdPartner(withholdRequest);
logger.info(wxPayCommonResult.toString());
} catch (WxPayException e) {
e.printStackTrace();
}
}
@Test
public void testPreWithhold() {
WxPreWithholdRequest.EstimateAmount estimateAmount = new WxPreWithholdRequest.EstimateAmount();