微信支付分账功能接入一
添加分账接收方
文档描述和注意事项
注意:文档分为 v2 v3版本不同版本存在差异:
1、当前使用的v2版本接口文档:查阅文档https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_3&index=4
2、v3版本接口文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_8.shtml
3、统一下单调用微信创建订单时候因为版本不用 分账标识 profit_sharing 文档描述为 Y/N,因版本不同可以测试设置为 true/false
4、添加接收方信息 参数”receiver“为JSON字符串不是直接存入JSON对象
5、接收方信息 参数 ”name“,实际为 申请商户号的营业执照名称,或者是申请人的身份证姓名。调用接口响应为 “err_code”:“INVALID_REQUEST”,“result_code”:“FAIL”,“err_code_des”:“分账接收商户全称不匹配”
6、微信商户平台必须开通 分账功能
7、签名只能HMAC-SHA256,并且注意在生成签名商户签名字符串最后要拼接 key=xxxxxx微信支付申请支付APIKEYxxxx
8、分账调用的是“单次分账”是不需要调用“完结分账”的,调用分账完成后剩余金额会自动解冻到商户平台。
微信支付签名 HMAC-SHA256
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
/**
* 微信支付签名 HMAC-SHA256
*
* @author Yang douya
* @date 2023/7/20 10:41
*/
public class HMACSHA256Util {
private static final Logger logger = LoggerFactory.getLogger(HMACSHA256Util.class);
/**
* sha256_HMAC加密
*
* @param message 消息
* @param secret 秘钥
* @return 加密后字符串
*/
public static String sha256HMAC(String message, String secret) {
String hash = "";
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
hash = byteArrayToHexString(bytes);
} catch (Exception e) {
logger.error("微信HMAC-SHA256签名 异常");
}
return hash;
}
/**
* 将加密后的字节数组转换成字符串
*
* @param b 字节数组
* @return 字符串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toLowerCase();
}
}
如有疏漏,请参与补充