Appearance
签名认证
为了防止请求在传输过程中被篡改,所有接口调用都必须包含签名(sign)参数。
1. 提交防篡改
签名算法
签名生成规则如下: sha256(fieldname1=value&fieldname2=value2 + 提交防止篡改密钥)
步骤说明
- 筛选:获取所有请求参数,剔除
sign字段,剔除值为空的参数。 - 排序:按照参数名的 ASCII 码从小到大排序(字典序)。如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推。
- 拼接:将排序后的参数以
key=value的形式用&字符连接起来。 - 运算:在拼接后的字符串末尾直接拼接(注意不是用&连接)您的
secretKey,然后进行 SHA-256 运算。
示例
待签名参数:
properties
amount=1
currency=USD
appKey=1755517027810275330
mcOrderId=qsCSDndIiU
notifyUrl=https://sample.com/api/gateway/test/notify
returnUrl=demo://sample.com
version=V167cd58e88b8875078b411fca65fafb66拼接后的字符串(假设密钥为 secretKey): amount=1&appKey=1755517027810275330¤cy=USD&mcOrderId=qsCSDndIiU¬ifyUrl=https://sample.com/api/gateway/test/notify&returnUrl=demo://sample.com&version=V167cd58e88b8875078b411fca65fafb66secretKey
Java 代码示例:
java
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SignUtils {
public static String sign(String paramsUrlStr, String secretKey) {
// paramsUrlStr 是已经按照key=value&key=value排序并拼接好的字符串
return sha256(paramsUrlStr + secretKey);
}
public static String sha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] encodedHash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder(2 * encodedHash.length);
for (byte b : encodedHash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString().toUpperCase(); // 通常转为大写,请根据实际情况调整
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}注意:生成的签名通常为 32 位或 64 位十六进制字符串,请参考具体接口要求(示例中为
3FC8F7C8E7E5DBAFC7208830372FC0AD)。
2. 响应防篡改
响应如果成功,data 字段不为空,且会有 sign 字段返回。商户系统应验证此签名以确保响应未被篡改。
验签规则
取响应 JSON 中的 data 字段内容,按照与请求签名相同的规则(筛选、排序、拼接)进行处理。
sha256(fieldname1=value&fieldname2=value2 + 响应防止篡改密钥)
- 筛选并排序:同请求签名。
- Java后端sign生成代码:同请求签名。
3. 响应数据结构
接口返回的数据格式统一为 JSON。
失败响应样例
json
{
"code": 500,
"msg": "Sign签名校验失败",
"success": false
}成功响应样例
json
{
"code": 200,
"msg": "操作成功",
"data": {
"orderId": "1763141618176012290",
"mcOrderId": "n93N6XwKo3",
"sign": "7C97A2EC600C4F714E3E00049090DE48"
},
"success": true
}重要:务必注意仅当
code为200时,才表示业务接口成功返回。其他值均为失败,失败原因请查看msg字段。