Browse Source

商城原生微信支付新增分账业务逻辑

multiwx
dy-hu 2 months ago
parent
commit
75d8e89a5b
  1. 48
      cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/service/impl/WxPayServiceImpl.java
  2. 11
      cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/PaymentApi.java
  3. 4
      cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayUtil.java
  4. 2
      cereshop-app/src/main/java/com/shop/cereshop/app/pay/weixin/skd/WXPayV3Util.java

48
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<String, String> 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<Map<String, String>> receivers = new ArrayList<>();
// 添加分账接收方信息
Map<String, String> 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<String, String> createProfitSharing(String transactionId, String outOrderNo, List<Map<String, String>> receivers) throws Exception {
String businessId = ContextUtil.getProject();
CereBusinessWxpay businessWxpay = cereBusinessWxpayService.getByBusinessId(Long.valueOf(businessId));
Map<String, Object> 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<String, String> result = new HashMap<>();
result.put("return_code", obj.getString("status"));
result.put("return_msg", obj.getString("message"));
return result;
}
@Override

11
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<String, String> params) {
String xml = PaymentKit.toXml(params);
// System.out.println(xml);
return HttpKit.post(PROFIT_SHARING_URL, xml);
}
/**
* 获取沙盒测试的key
* @param params 参数map

4
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<String, String> data, String key) throws Exception {
return generateSignature(data, key, WXPayConstants.SignType.HMACSHA256);
}
/**
* 生成签名. 注意若含有sign_type字段必须和signType参数保持一致
*

2
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;

Loading…
Cancel
Save