支付签名校验的问题
1740 浏览2021年11月22日作者:User7340221097384591394

我们抖音小程序,同时开通了微信担保支付,和支付宝担保支付。

小程序在测试,以及上线后,担保支付功能都是正常的,但最近几天来,总是会有 “签名错误”的问题。

一、以下是一段支付日志,“签名错误”的问题,时好时坏。

支付的订单的单号 =====> 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();
}

//----------------------------------------
最后一次编辑于 2021 年 11 月 22 日
1 条评论

相关文章

专题推荐

热门文章

热门问答