MD5 与 RSA2 两种签名方式,商户通过请求参数 signType 指定签名方式。| signType | 算法 | 商户签名密钥 | 系统验签密钥 | 系统响应签名密钥 |
|---|---|---|---|---|
| MD5 | MD5摘要 + 十六进制大写 | 开发者机构密钥(devSecret) | 同左 | 开发者机构密钥(devSecret) |
| RSA2 | SHA256WithRSA | 商户 RSA 私钥(PKCS8格式) | 开发者机构配置的商户 RSA 公钥(X509格式) | 支付系统 RSA 私钥(PKCS8格式) |
key=value& 格式逐项拼接(每项末尾保留 & 分隔符),再对拼接后的 key=value& 字符串整体按忽略大小写的字典序从小到大排序(等价于 JDK String.CASE_INSENSITIVE_ORDER),排序后依次拼接得到字符串stringA。stringA + "key=" + 密钥,对结果做 MD5 运算,并将得到的十六进制字符串所有字符转换为大写,得到 sign 值;stringA = "amount=1&appId=xxx&body=商品描述&...&wayCode=ALI_BAR&"
stringSignTemp = stringA + "key=" + 密钥
sign = MD5(stringSignTemp).toUpperCase()待签名值:amount=1&appId=6447428682ca7458118af79f&body=商品描述&channelExtra={"authCode":"284957415846666792"}&clientIp=192.166.1.132¤cy=CNY&mchNo=M1682391685&mchOrderNo=mho1694051705945¬ifyUrl=https://www.jeequan.com&reqTime=1694051706&signType=MD5&subject=商品标题&version=1.0&wayCode=ALI_BAR&key=商户密钥签名结果:924065BA077FA461A9B06D2E76E9ED3C(32位大写十六进制)stringA = "amount=1&appId=xxx&body=商品描述&...&wayCode=ALI_BAR&"
sign = Base64( SHA256WithRSA(stringA, 商户RSA私钥[PKCS8格式]) )sign 字段,商户应验证响应签名以防篡改:| signType | 系统签名方式 | 商户验签密钥 |
|---|---|---|
| MD5 | 使用开发者机构密钥(devSecret)对响应 data 按相同规则计算 MD5 | 开发者机构密钥(devSecret) |
| RSA2 | 使用支付系统 RSA 私钥对响应 data 做 SHA256WithRSA 签名 | 支付系统 RSA 公钥(由平台提供) |
支付异步通知的验签规则与响应验签一致。
UTF-8;sign 字段本身不 参与签名计算;-----BEGIN/END----- 头尾标记;