签名
签名
通信协议
服务器采用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¤cy=CNY&extra=1&orderID=1111111111111&orderTime=1111111111&price=1&productID=1&roleID=1&serverID=1×tamp=1111111111&secretKey=AppSecret 6C2D6F001804229616000FDF574406F5