我们抖音小程序,同时开通了微信担保支付,和支付宝担保支付。
小程序在测试,以及上线后,担保支付功能都是正常的,但最近几天来,总是会有 “签名错误”的问题。
一、以下是一段支付日志,“签名错误”的问题,时好时坏。
支付的订单的单号 =====> 20211122104131798720
2021-11-22 10:41:36.209 [http-nio-5004-exec-2] INFO c.houniao.hmall.service.impl.PaymentServiceBdImpl - 发起支付请求的参数 ===> {"app_id":"ttddf5ab4842cd8ce301","out_order_no":"20211122104131798720","total_amount":3,"subject":"虚行迷你香蕉","body":"虚行迷你香蕉\r\n","valid_time":900,"sign":"884006b635344c536e14fe139f82eecd","cp_extra":"20211122104131798720","notify_url":"http://2129417n5j.51mypc.cn/hmall/payment/wxPayNotify","thirdparty_id":null,"disable_msg":null,"msg_page":null}
2021-11-22 10:41:36.409 [http-nio-5004-exec-2] INFO c.houniao.hmall.service.impl.PaymentServiceBdImpl - 抖音平台响应请求response_body===>{"err_no":2000,"err_tips":"签名校验异常","data":null}
二、以下的是签名校验的代码,都是按照官网文档来的。
//----------抖音支付申请生成sign----------
// 支付密钥值
// 来源:https://microapp.bytedance.com/app/tte5fe93437ac6825301/pay
// 担保交易---->担保交易设置---->SALT
private static final String SALT = "gzgSKJ9HNKvuFcQoJCQvITK2wUw8f8bkUeOwMRjk";
// paramsMap 参数是,除发起支付请求报文体中字段sign, app_id , thirdparty_id外的其他任意字段
private String getSign(Map<String, Object> paramsMap) {
List<String> paramsArr = new ArrayList<>();
for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
String key = entry.getKey();
if (key.equals("other_settle_params")){
continue;
}
String value = entry.getValue().toString();
value = value.trim();
if (value.startsWith("\"") && value.endsWith("\"") && value.length() > 1) {
value = value.substring(1, value.length() - 1);
}
value = value.trim();
if (value.equals("") || value.equals("null")) {
continue;
}
switch (key) {
case "app_id":
case "thirdparty_id":
case "sign":
break;
default:
paramsArr.add(value);
break;
}
}
paramsArr.add(SALT);
Collections.sort(paramsArr);
StringBuilder signStr = new StringBuilder();
String sep = "";
for (String s : paramsArr) {
signStr.append(sep).append(s);
sep = "&";
}
return md5FromStr(signStr.toString());
}
private String md5FromStr(String inStr) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes(StandardCharsets.UTF_8);
byte[] md5Bytes = md5.digest(byteArray);
StringBuilder hexValue = new StringBuilder();
for (byte md5Byte : md5Bytes) {
int val = ((int) md5Byte) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
//----------------------------------------