diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/service/impl/WxPayServiceImpl.java b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/service/impl/WxPayServiceImpl.java index 801f783..f5e8d9d 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/service/impl/WxPayServiceImpl.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/service/impl/WxPayServiceImpl.java @@ -26,7 +26,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Service(value = "wxPayService") @@ -122,9 +124,53 @@ public class WxPayServiceImpl implements WxPayService { String businessId = ContextUtil.getProject(); CereBusinessWxpay businessWxpay = cereBusinessWxpayService.getByBusinessId(Long.valueOf(businessId)); - return wxPayStrategy.prepay(businessWxpay.getAppId(), businessWxpay.getAppAppId(), openid, + Map result = wxPayStrategy.prepay(businessWxpay.getAppId(), businessWxpay.getAppAppId(), openid, businessWxpay.getMchId(), app_notify_url, redirectUrl, ip, money, orderFormId, businessWxpay.getMchKey()); + + // 在支付成功后执行分账逻辑 + if (result != null && "SUCCESS".equals(result.get("return_code"))) { + String transactionId = result.get("transaction_id"); + String outOrderNo = "PS_" + orderFormId; // 生成分账单号 + List> receivers = new ArrayList<>(); + // 添加分账接收方信息 + Map receiver = new HashMap<>(); + receiver.put("type", "MERCHANT_ID"); + receiver.put("account", "分账接收方商户号"); + receiver.put("amount", money.multiply(new BigDecimal("0.8")).multiply(BigDecimal.valueOf(100)).intValue() + ""); + receiver.put("description", "分账给接收方"); + receivers.add(receiver); + createProfitSharing(transactionId, outOrderNo, receivers); + } + + return result; + } + + /** + * 创建分账 + * + * @param transactionId 微信支付订单号 + * @param outOrderNo 商户系统内部的分账单号 + * @param receivers 分账接收方列表 + * @return 分账结果 + * @throws Exception + */ + public Map createProfitSharing(String transactionId, String outOrderNo, List> receivers) throws Exception { + String businessId = ContextUtil.getProject(); + CereBusinessWxpay businessWxpay = cereBusinessWxpayService.getByBusinessId(Long.valueOf(businessId)); + + Map params = new HashMap<>(); + params.put("transaction_id", transactionId); + params.put("out_order_no", outOrderNo); + params.put("receivers", receivers); + + JSONObject obj = wxPayV3Util.doPostWeixinV3(WXPayV3Util.api_v3_profitsharing_ur, JSON.toJSONString(params)); + log.info("createProfitSharing result: {}", JSON.toJSONString(obj)); + + Map result = new HashMap<>(); + result.put("return_code", obj.getString("status")); + result.put("return_msg", obj.getString("message")); + return result; } @Override diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/PaymentApi.java b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/PaymentApi.java index 6091160..76dfdbf 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/PaymentApi.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/PaymentApi.java @@ -26,7 +26,10 @@ public class PaymentApi { // 文档地址 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_1&index=2 private static String getSignKeyUrl = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey"; - /** + // 分账请求URL + private static String PROFIT_SHARING_URL = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing"; + + /** * 交易类型枚举 * WAP的文档:https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1 * @author L.cm @@ -51,6 +54,12 @@ public class PaymentApi { return HttpKit.post(unifiedOrderUrl, xml); } + public static String pushProfitSharing(Map params) { + String xml = PaymentKit.toXml(params); + // System.out.println(xml); + return HttpKit.post(PROFIT_SHARING_URL, xml); + } + /** * 获取沙盒测试的key * @param params 参数map diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayUtil.java b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayUtil.java index 806c553..a02e441 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayUtil.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayUtil.java @@ -206,6 +206,10 @@ public class WXPayUtil { return generateSignature(data, key, WXPayConstants.SignType.MD5); } + public static String generateSignatureByHMACSHA256(final Map data, String key) throws Exception { + return generateSignature(data, key, WXPayConstants.SignType.HMACSHA256); + } + /** * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。 * diff --git a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayV3Util.java b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayV3Util.java index 00de9b1..95705b5 100644 --- a/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayV3Util.java +++ b/cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayV3Util.java @@ -51,6 +51,8 @@ public class WXPayV3Util { public static final String api_v3_refund_url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"; + public static final String api_v3_profitsharing_ur = "https://api.mch.weixin.qq.com/v3/profitsharing/orders"; + private String APPLICATION_JSON = "application/json"; // 你的商户私钥 private String privateKey;