diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java index 86c487a8c..288e8b933 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java @@ -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"); diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java index 24a5c3bec..168e43696 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java @@ -86,6 +86,24 @@ public interface WxEntrustPapService { */ WxWithholdResult withhold(WxWithholdRequest wxWithholdRequest) throws WxPayException; + /** + * 服务商模式的申请扣款 + *
+ * 申请扣款 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter5_8.shtml + * 请求微信发起委托扣款,扣款额度和次数由使用的签约模板限制, + * 该扣款接口是立即扣款 无延时 扣款前无消息通知。 + * + * • 特殊情况:周期扣费为通知后24小时扣费方式情况下,如果用户为首次签约(包含解约后重新签约), + * 从用户签约成功时间开始算,商户在12小时内发起的扣款,会被立即执行,无延迟。商户超过12小时以后发起的扣款,都按24小时扣费规则执行 + *+ * + * @param wxWithholdRequest the wx withhold request + * @return wx withhold result + * @throws WxPayException the wx pay exception + */ + WxPayCommonResult withholdPartner(WxWithholdRequest wxWithholdRequest) throws WxPayException; + /** * 预扣费通知 *
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java index 0b4dba893..951c1d5a8 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java @@ -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); diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java index 6be405897..ca20d0c51 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java @@ -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();