签名

签名

通信协议

服务器采用HTTP 协议作为通信协议,采用POST请求方式。

数据协议

数据格式:响应消息的内容,须采用utf-8 字符编码。

签名计算

  • 将所有参数中,除了sign之外的非空参数,按照key升序排序,然后按key=value&key2=value2...格式拼接, 得到待签名串。

(客户端创建订单时参数不要为空,若无则设置默认值1。)

  • 将上述得到的字符串,拼接上 &secretKey=【密钥】。

PS:(登录认证时,密钥使用分配的appKey;支付回调时,密钥使用分配的secretKey)

  • 对上面得到的最终签名串做md5计算(32位,大写)。
  • 参考签名代码
public static String sign(Map<String, String> params, String secret) {
    Map<String, String> sortedParams = new TreeMap<>(params);
    StringBuilder sb = StringUtils.getStringBuilder();
    for (Map.Entry<String, String> param : sortedParams.entrySet()) {
        String value = param.getValue();
        String key = param.getKey();
        if ("sign".equalsIgnoreCase(key)) {
            continue;
        }
        //空值不参与签名 例如【extra=""】不参与签名
        if (value != null && value.length() > 0) {
            sb.append(param.getKey()).append("=").append(value).append("&");
        }
    }
    sb.append("secretKey").append("=").append(secret);
    String signStr = sb.toString();
    String sign = EncryptUtils.md5(signStr).toUpperCase();
    logger.info("SignString: {} sign: {}", signStr,sign);
    return sign;
}

签名示例

appID=10001&cpOrderID=11111&currency=CNY&extra=1&orderID=1111111111111&orderTime=1111111111&price=1&productID=1&roleID=1&serverID=1&timestamp=1111111111&secretKey=AppSecret 6C2D6F001804229616000FDF574406F5

results matching ""

    No results matching ""