微信小程序后端java服务商分账实现
最近公司申请微信服务商,需要给第三方提供支付、分账功能。
商户调用服务商统一支付
首先,服务商小程序支付,基本与普通商户小程序支付一致
支付使用服务商统一下单接口:微信官方文档地址https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=9_1
这里的商户号是服务商的商户号,小程序appid是商家的appid,子商户号是商家的商户号且商家是服务商的特约商户需要授权。
这两个openid建议使用sub_openid,商户小程序的唯一openid。
最重要的参数,传Y才能进行分账。
服务商分账
服务商分账有两种接口:单次分账和多次分账
微信官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_1&index=1
多的不说直接上代码:
引入maven 依赖
<dependency>
<groupId>org.jodd</groupId>
<artifactId>jodd-core</artifactId>
<version>5.1.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.55</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.8.0</version>
</dependency>
分账请求类
package com.linli.pay.service.pay.req;
import lombok.Data;
@Data
public class WxSharingOrderRequest {
/**
* 服务商商户号
*/
private String mch_id;
/**
* 子商户号
*/
private String sub_mch_id;
/**
* 服务商appid
*/
private String appid;
/**
* 子商户appid
*/
private String sub_appid;
/**
* 随机字符串
*/
private String nonce_str;
/**
* 签名
*/
private String sign;
/**
* 签名类型(只支持HMAC-SHA256)
*/
private String sign_type;
/**
* 微信订单号
*/
private String transaction_id;
/**
* 商家订单号
*/
private String out_trade_no;
/**
* 商户分账单号(同一个单号多次提交只算一次)
*/
private String out_order_no;
/**
* 商户分账金额(小于等于订单金额*(1-手续费)*最大分账比例)
*/
private Integer amount;
/**
* 分账接收方列表(单次分账不能即是支付商户又是接收商户,多次分账没有限制)
*/
private String receivers;
}
分账返回类
package com.linli.pay.service.pay.resp;
import lombok.Data;
@Data
public class WxSharingOrderResp {
//返回状态码,通信标识,SUCCESS/FAIL
private String return_code;
//返回信息,通信标识OK
private String return_msg;
//业务结果,交易标识,SUCCESS/FAIL
private String result_code;
//错误代码
private String err_code;
//错误代码描述
private String err_code_des;
//商户号
private String mch_id;
//子商户号
private String sub_mch_id;
//公众账号id
private String appid;
private String sub_appid;
//随机字符串
private String nonce_str;
//签名
private String sign;
//微信支付订单号
private String transaction_id;
//商户分账单号(商户订单号)
private String out_order_no;
//商户分账单号
private String order_id;
}
分账接收方
package com.linli.pay.service.pay.req;
import lombok.Data;
@Data
public class WxSharingReceiversVO {
/**
* 分账接收方类型
*/
private String type;
/**
* 分账接收方帐号
*/
private String account;
/**
* 分账金额
*/
private Integer amount;
/**
* 分账描述
*/
private String description;
}
application.yml配置类
wx:
mini:
keyPath: classpath:cert/apiclient_cert.p12 # 商户p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
busAppId:
busMchId:
busMchKey:
busSubAppId:
busSubMchId:
package com.linli.pay.config.wx;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "wx.mini")
public class WxMiniPayProperties {
/**
* apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
*/
private String keyPath;
/**
* 服务商appid
*/
private String busAppId;
/**
*服务商商户号
*/
private String busMchId;
/**
* 服务商商户密钥
*/
private String busMchKey;
/**
* 调起支付的小程序APPID
*/
private String busSubAppId;
/**
* 微信支付子商户号
*/
private String busSubMchId;
@Bean(name = "wxBusMiniPayService")
public WxPayService wxBusMiniPayService() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(StringUtils.trimToNull(this.busAppId));
payConfig.setMchId(StringUtils.trimToNull(this.busMchId));
payConfig.setMchKey(StringUtils.trimToNull(this.busMchKey));
payConfig.setSubAppId(StringUtils.trimToNull(this.busSubAppId));
payConfig.setSubMchId(StringUtils.trimToNull(this.busSubMchId));
payConfig.setKeyPath(StringUtils.trimToNull(this.keyPath));
// 可以指定是否使用沙箱环境
payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
service实现类
/**
* 单次分账
* @param data
* @return
*/
public WxSharingOrderResp oncePaySharing(WxSharingOrderRequest data)throws