商户接入指南 商户接入指南
  • V2
  • V3 (opens new window)
  • V2
  • V3 (opens new window)
  • 接入指南

    • 起步
    • 名词约定
    • 对接流程(必读)
    • 签名规约
      • 签名规约
      • 请求签名
        • 请求签名范围
      • 应答签名
      • 异步通知签名
      • 签名串组装
      • 计算签名串
        • sha256签名示例
    • 服务端接入流程
    • 3D集成指南V1(From提交)
    • 3D集成指南V2(风控插件)
  • 接入方案

    • 收银台模式

      • 内嵌JS-SDK
      • 跳转接入
    • 端到端模式

      • 快速开始
      • 商户收银台规范
    • 交易处理方案

      • 处理交易状态
      • 交易数据处理方案
      • 交易状态处理方案
      • 自动续费场景处理方案
    • 开源建站工具插件支持

      • Magento235
      • Woocommerce
      • OpenCart
      • Prestashop
      • ZenCart
  • APIs

    • 交易下单

      • 收银台模式
      • 端到端模式
      • 退款和预授权
      • 修改交易信息
    • 交易查询

    • 快捷支付

    • 拒付查询

    • 物流信息

    • 交易账单

    • 币种汇率

    • 商户信息

  • 附录

  • v2

签名规约

# 签名规约

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&currency=USD&merchantTransactionId=PShop20220420150847PP&notificationUrl=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
    
    1
    2
    3
    4
    5
    6
    7
     //import org.apache.commons.codec.digest.DigestUtils;
        
     String salt = "F78BC96A55548B2319EE68E0";
     String signContent = "accId=2018092714313010016291&amount=1.08&currency=USD&merchantTransactionId=PShop20220420150847PP&notificationUrl=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       
    
    1
    2
    3
    4
    5
    6
    7
    8
    // Make sure to add code blocks to your code group
    上次更新: 2022/09/07, 11:39:45
    对接流程(必读)
    服务端接入流程

    ← 对接流程(必读) 服务端接入流程→

    杭州乒乓智能技术有限公司 | Copyright © 2015-2024 All rights reserved. pay.pingpongx.com
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式