签名规约
# 签名规约
pingpong checkout API v2通过验证签名来保证请求的真实性和数据的完整性。
# 签名规约
签名方式目前支持 MD5 和 RSA 两种签名方式。可通过请求报文中的 signType 来确定使用哪种方案。
签名类型 | 描述 |
---|---|
MD5 | 表示选择 MD5 算法,商户使用 Salt 对报文进行摘要签名和验签 |
SHA256 | 表示选择 SHA256算法,商户使用 Salt 对报文进行摘要签名和验签 |
# 请求签名
商户需要使用自身的私钥对消息体中关键数据的组合进行签名。没有携带签名或者签名验证不通过的请求,都不会被执行,并返回错误。
请求参数都应该trim,加签应该在trim之后
请求签名是部分加签后,加签规则参考以下的请求签名范围
以下为PingPongPay API v2与调用方约定的请求加签参数列表
参数名 | 描述 |
---|---|
clientId | PingPong商户号,当请求参数中没有传入clientId,不加入签名 |
accId | PingPong商户店铺号 |
amount | 交易金额 |
currency | 交易币种 |
transactionId | PingPong交易流水号 |
merchantTransactionId | 商户交易流水号 |
shopperResultUrl | 商户自定义接收重定向的结果 URL |
notificationUrl | 由商户自定义本次交易结果通知的地址 |
signType | 加签类型 |
# 请求签名范围
1. 加签以每个接口的请求参数为基础。
2. 在加签参数列表的请求参数参与加签
3. 请求参数中没有,加签参数列表有,不参与加签
4. 请求参数中有,加签参数列表没有,不参与加签
5. 综上:
设待加签参数集合C
设请求参数集合A
设加签参数集合B
则 C=A∩B 取两者交集
# 应答签名
对于签名验证成功的请求,PingPong支付API v2会对应答进行签名。为了保证安全性,应对应答进行验签。
sign 字段不参与签名
# 异步通知签名
异步通知必须验证PingPong支付签名,确认请求来自PingPongServer,避免被恶意攻击。
所有参数值不为空(即值不等于 null 且 trim 后值不为空字符串)的参数参加签名。
sign 字段不参与签名。
# 签名串组装
字典序:按首字母进行排序;
queryString:用'=' 进行参数名和参数值(trim 后的值)的拼接,用'&'进行多 个参数之间的拼接,即 key1=val1&key2=val2&key3=val3
对参数名按字典序排序后,按照queryString方式组装。
签名秘钥(salt)放入签名串的位置为: 签名串的开头 , 即{salt}key1=val2&key2=val2&key3=val3
# 计算签名串
推荐使用SHA256签名方式,安全度高于MD5
# sha256签名示例
$salt = "F78BC96A55548B2319EE68E0";
$signContent ="accId=2018092714313010016291&amount=1.08¤cy=USD&merchantTransactionId=PShop20220420150847PP¬ificationUrl=http://www.example.com/&shopperResultUrl=https://test-pay.pingpongx.com/qa/result.html&signType=SHA256";
$contentStr = $salt.$signContent;
$sign = hash("sha256", $contentStr);
$hash = strtoupper($hash);
echo($hash);
//$sign输出 22BF18D4C604D295CB496A0696729D25B366A80AE0CE00958424BC95CB3B1667
2
3
4
5
6
7
//import org.apache.commons.codec.digest.DigestUtils;
String salt = "F78BC96A55548B2319EE68E0";
String signContent = "accId=2018092714313010016291&amount=1.08¤cy=USD&merchantTransactionId=PShop20220420150847PP¬ificationUrl=http://www.example.com/&shopperResultUrl=https://test-pay.pingpongx.com/qa/result.html&signType=SHA256";
String contentStr = salt.concat(signContent);
String sign = DigestUtils.sha256Hex(contentStr.getBytes("UTF-8")).toUpperCase();
System.out.println("sign = " + sign);
//输出 sign = 22BF18D4C604D295CB496A0696729D25B366A80AE0CE00958424BC95CB3B1667
2
3
4
5
6
7
8
// Make sure to add code blocks to your code group