查看原文
其他

微信支付分账,就是这么简单!

爪哇笔记 2022-09-26

产品介绍

直连商户分账主要用于商户将交易成功的资金,按照一定的周期,分账给其他方,可以是合作伙伴、员工、用户或者其他分润方。

使用场景举例

  • 员工奖励:零售、餐饮等行业中,当销售人员销售完成后,达到可奖励的条件,可以通过分账,将销售奖励分给员工。

  • 管理资金到账时间:在酒店行业中,利用分账功能中的“冻结/解冻“能力,当用户预订/入住酒店时,交易资金先冻结在酒店的账户中,当用户确认消费离店后,再利用“分账“功能中的”分账完结“解冻资金到酒店的账户中。这样可以避免用户退款时商户账户资金不足的情况。

  • 分润给合作伙伴:在与他方合作的情况下,可以用“分账”功能,将交易资金分给合作伙伴,例如物流合作商。

相信不少小伙伴都推荐过一些IT培训的课程,比如你推荐成功以后,你会收到一笔佣金,其实他们也是使用了微信的分账功能。

产品特点

  • 分账方:交易收款方,这里指直连商户本身

  • 分账接收方:接收资金的一方,可以是商户,可以是个人

代码集成

对于分账微信提供了不少接口,比如,添加分账接收方、删除分账接收方、请求单次分账、请求多次分账、完结分账等等,具体可以去查看官网文档。

这里需要注意的是,分账接口不再是MD5加密,而是使用了HMAC-SHA256加密。上一坨伪代码:

/**
* 绑定分账账号
* @param allocation
* @param config
*/

public void addWx(Allocation allocation, WxPayConfig config){
try {
String key = config.getApiKey();
SortedMap<String, String> packageParams = new TreeMap<>();
wxPayUtil.commonParams(packageParams,config);
packageParams.put("sign_type",SystemConstant.SIGN_HMAC);
JSONObject receiver = new JSONObject();
receiver.put("type",allocation.getAccountType());
receiver.put("account",allocation.getAccount());
receiver.put("name",allocation.getName());
receiver.put("relation_type", RelationType.HEADQUARTER.getCode());
packageParams.put("receiver",receiver.toJSONString());
String sign = PayCommonUtil.createSign(packageParams, key, SystemConstant.SIGN_HMAC);
packageParams.put("sign", sign);
String requestXML = PayCommonUtil.getRequestXml(packageParams);
String resXml = HttpUtil.postData(WxPayUrl.PROFIT_SHARING_ADD_URL, requestXML);
Map map = XMLUtil.doXMLParse(resXml);
String returnCode = (String) map.get("return_code");
if(SystemConstant.SUCCESS.equalsIgnoreCase(returnCode)){
String resultCode = (String) map.get("result_code");
if(!SystemConstant.SUCCESS.equalsIgnoreCase(resultCode)){
String errCodeDes = (String) map.get("err_code_des");
log.error("微信分账绑定失败:{}",errCodeDes);
throw new RrException("微信分账绑定失败");
}
}else{
String returnMsg = (String) map.get("return_msg");
log.error("微信分账绑定(通信)失败:{}",returnMsg);
throw new RrException("微信分账绑定失败");
}
} catch (Exception e) {
e.printStackTrace();
log.error("绑定微信支付账号异常:{}",e.getMessage());
throw new RrException("微信分账绑定失败");
}
}

加密方式:

/**
* HmacSHA256 加密
*/

public class HMACUtil {

public static String HMACSHA256(String data, String key){
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3);
}
return sb.toString().toUpperCase();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}

需要注意的是,在调用下单的逻辑中,需要新增以下逻辑:

/**
* 是否分账,并且为sign加密参数
* 业务数据请自行关联,比如分账接收方数据
* 这个在微信支付成功以后,自动或者手动调用分账会用到
*/

if(分账){
packageParams.put("profit_sharing",SystemConstant.Y);
}

支付成功之后,调用分账接口,微信建议在支付回调成功1分钟后或30天内调用分账接口。

截图

参考

https://paycloud.vip/docs/

https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=26_1

END -
1.3 万亿条数据查询,如何做到毫秒级响应?
分享六个经典的 SpringBoot 开源项目
一套通用的后台管理系统,赚钱就靠它了!
SpringBoot 开发案例之接入腾讯云短信
推荐一款基于 Java 的身份证号码识别系统
分享一个支付大屏实时监控数据平台
推荐一款清爽的实时监控大屏附安装教程
微信支付收银台功能上线了
支付宝支付新版 SDK 上线,让支付触手可及
太厉害了!我用 Nginx 提升系统10倍性能
牛逼,CTO点名要搞个灰度发布系统

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存