USEEPAY
  1. 签名指导
USEEPAY
  • 全球收单
    • 域名说明
    • 集成流程说明
    • 生产账户启用
    • UseePay出口IP说明
    • 签名指导
      • 签名
      • 验签
      • demo
    • 沙盒测试资源
      • 测试卡号
      • 信用卡测试案例
      • 退款测试案例
      • 本地化测试案例
      • ApplePay&& Google Pay测试用例
    • 跳转式收银台接口
      • 跳转收银台paymentMethod参数说明
      • 支付/预授权
    • 内嵌式收银台接口
      • 0.0.1-只支持信用卡
        • 内嵌收银台快捷支付
        • 内嵌收银台新版本更新说明
        • 内嵌收银台对接说明
      • 新版-支持信用卡+AP+GP
        • 内嵌收银台2.0.0版本说明
      • create token 创建JSSDK所需的token
    • 订单通用接口
      • 退款Refund
      • 查询Query
      • 预授权撤销(Void)
      • 预授权完成(Capture)
    • 本地化支付
      • 本地化汇总
      • 本地化接口
        • 便利店支付
          • konbini
            • konbini 收银台模式
            • konbini api模式
          • payeasy
            • payeasy api 模式
            • payeasy 收银台模式
        • 分期付款Pay Later
          • Klarna产品介绍
          • Klarna direct
          • Klarna Redirect
        • 电子钱包
          • Alipay
            • Alipay Direct 文档
            • alipay_cn/alipay_hk direct 文档
          • Wechat-HK
            • 扫码支付
              • 扫码支付
              • direct
                • 扫码支付 Server To Server模式
              • redirect
                • 扫码支付收银台模式(wechat_native)
            • Jsapi支付下单接口
              • 小程序支付
              • 微信公众号支付
              • Jsapi支付下单接口
            • H5支付
              • H5支付
          • Google Pay
            • GoogePay Test card
            • Google Pay 对接可能遇到的问题
            • redirect
              • 跳转式GooglePay收银台
            • api
              • Google Pay API对接
              • Googlepay API 支付
          • applepay
            • ApplePay 扩展
            • ApplePay API
              • ApplePay API接入流程
              • ApplePay API接入流程备份
              • ApplePay Merchant Identifier
              • ApplePay支付
              • ApplePay商户Session
            • applepay cashier
              • applepay 跳转收银台
          • applepay&googlepay内嵌
            • 1.0.0 内嵌方式对接 (建议使用“内嵌方式对接2.0.0”版本)
            • 内嵌方式对接2.0.0
        • 银行转账
          • pix
          • Giropay
            • Giropay_Redirect
            • Giropay_Direct
          • sofort
            • sofort_Redirect
            • sofort_Direct
          • bancontact
            • bancontact_Redirect
          • Ideal
            • Ideal_Redirect
            • Ideal_Direct
          • boleto
            • boleto_Direct
        • 本地化Card
        • Cash(Ticket)现金支付
          • oxxo
          • boleto
          • Cash Common
      • 支付方式(国家/地区)
        • 荷兰
        • 巴西
        • 墨西哥
        • 中国香港
        • 日本
        • 德国
        • 奥地利
        • 西班牙
        • 波兰
        • 意大利
        • 哥伦比亚
        • 比利时
        • 瑞士
    • 通用对象参数和规范说明
      • 参数对象说明(过期)
      • 业务结果码(ResultCode)
      • 错误码(ErrorCode)
      • 金额和货币单位
      • 国家信息参考
      • 对象模型
        • userInfo
        • shippingAddress
        • goodsInfo
        • billingAddress
        • deviceInfo
        • transactionInfo
    • 通知接口说明
      • 交易通知
        • 同步通知
        • 异步 webhook版本升级
        • webhook
      • 拒付
        • 拒付webhook
    • 物流接口
      • 物流信息上送
        • 物流信息上传2.1
        • 物流信息上传(已废弃)
      • 物流信息查询
        • 物流信息查询2.1
        • 物流信息查询(已废弃)
    • 拒付接口
      • 拒付流程说明
      • 拒付查询
    • SFTP
      • SFTP
    • 常见问题
      • 支付和预授权的区别
    • demo
    • 插件安装指导
      • magento插件支付安装
        • Wechat/Alipay/UseePay Payments
    • 订阅
      • 订阅文档
  • 产品说明
    • 收银台
    • 内嵌式收银台
    • Server To Server 直连
  • FAQ
    • 集成和认证
    • 常见问题解答
    • ueeshop配置常见错误
    • ApplePay常见问题
  1. 签名指导

签名

签名#

UseePay 使用签名-验签名机制来防止数据传输的过程中被篡改。目前 API 集成 UseePay 支持两种签名方式: MD5, RSA。无论是 MD5 还是 RSA 方式, sign 和 value trim后为空的 key-value 都不参与签名计算过程!

MD5#

生成MD5密钥#

在 UseePay 商户后台的配置中心->密钥管理中点击获取MD5密钥
image.png

生成MD5签名规则#

1,按照ASCII码生序对请求的 payload 进行排序
2,按第一步获取的结果,进行key-value 遍历, 对 value trim 后不为空的 key-value 使3,用 URL 键值对的格式进行拼接(key1=value1&key2=value2...),
第2步取到字符串, 拼接上 &pkey=商户的MD5密钥, 然后对该字符串进行MD5, 得到的值即为签名值

MD5签名生成示例#

RSA#

生成商户RSA密钥对#

注意: RSA的格式为 1024 PKCS8
访问如 http://www.metools.info/code/c80.html 生成密钥对:
image.png

上传商户RSA公钥#

注意, 请将公钥字符串中的首行(-----BEGIN PUBLIC KEY-----)与尾行(------END PUBLICK KEY-----)删除, 然后将中间部分格式化成一行粘贴进去
image.png

保存 UseePay RSA 公钥#

在上图中, 你需要保存 UseePay RSA 公钥, 请求的响应数据, UseePay 会使用 UseePay 的 RSA 私钥进行签名, 并返回 sign 值, 你需要使用 UseePay RSA 公钥进行验签

生成RSA签名规则#

1,按照ASCII码生序对请求的 payload 进行排序
2,按第一步获取的结果,进行key-value 遍历, 对 value trim 后不为空和 key 不为 3,sign 的 key-value 使用 URL 键值对的格式进行拼接(key1=value1&key2=value2...),
对第2步取到字符串, 用之前生成的商户 RSA 密钥进行签名做 base64, 获取 sign 值

RSA签名生成示例#

// Node.js 示例导入了 node-rsa
const NodeRSA = require('node-rsa')

function getPayload(){
    payload['version'] = '1.0'
    payload['autoRedirect'] = false
    payload['transactionId'] = ORDER_ID_IN_YOUR_SYSTEM
    payload['transactionType'] = 'pay'
    payload['transactionExpirationTime'] = 14400
    payload['appId'] = YOUR_APP_ID
    payload['amount'] = 1234
    payload['currency'] = 'USD'
    
    const userInfo = {
        userId: USER_ID_IN_YOUR_SYSTEM,
        phoneNo: USER'S_PHONE_NO,
        email: USER'S_EMAIL,
        IP: USER'S_IP
    }
    const billingAddress = {}
    billingAddress['houseNo'] = CUSTOMER'S_HOUSE_NO
    billingAddress['email'] = CUSTOMER'S_EMAIL
    billingAddress['phoneNo'] = CUSTOMER'S_PHONE_NO
    billingAddress['firstName'] = CUSTOMER'S_FIRST_NAME
    billingAddress['lastName'] = CUSTOMER'S_LAST_NAME
    billingAddress['street'] = CUSTOMER'S_STREET
    billingAddress['postalCode'] = CUSTOMER'S_POSTAL_CODE
    billingAddress['city'] = CUSTOMER'S_CITY
    billingAddress['state'] = CUSTOMER'S_STATE
    billingAddress['country'] = CUSTOMER'S_COUNTRY // ISO 3166-1-alpha-2
    payerInfo['billingAddress'] = billingAddress
    payload['userInfo'] = JSON.stringify(userInfo)
    
    const payerInfo = {
        paymentMethod: 'credit_card',
        authorizationMethod: 'cvv'
    }
    payload['payerInfo'] = JSON.stringify(payerInfo)
    
    const orderInfo = {
        subject: ORDER_SUBJECT_IN_YOUR_SYSTEM,
    }
    const goodsInfo = Array()
    goodsInfo.push(
      {
        id: SKU_ID_IN_YOUR_SYSTEM,
        name: PRODUCT_NAME,
        price: PRICE,
        quantity: QUANTITY,
        url: PRODUCT_LINK,
        image: IMAGE_OF_PRODUCT
      },
      {    
        id: SKU_ID_IN_YOUR_SYSTEM,
        name: PRODUCT_NAME,
        price: PRICE,
        quantity: QUANTITY,
        url: PRODUCT_LINK,
        image: IMAGE_OF_PRODUCT
      },
    )
    const shippingAddress = {}
    shippingAddress['houseNo'] = CUSTOMER'S_HOUSE_NO
    shippingAddress['email'] = CUSTOMER'S_EMAIL
    shippingAddress['phoneNo'] = CUSTOMER'S_PHONE_NO
    shippingAddress['firstName'] = CUSTOMER'S_FIRST_NAME
    shippingAddress['lastName'] = CUSTOMER'S_LAST_NAME
    shippingAddress['street'] = CUSTOMER'S_STREET
    shippingAddress['postalCode'] = CUSTOMER'S_POSTAL_CODE
    shippingAddress['city'] = CUSTOMER'S_CITY
    shippingAddress['state'] = CUSTOMER'S_STATE
    shippingAddress['country'] = CUSTOMER'S_COUNTRY // ISO 3166-1-alpha-2
    orderInfo['goodsInfo'] = goodsInfo
    orderInfo['shippingAddress'] = shippingAddress
    payload['orderInfo'] = JSON.stringify(orderInfo)
    
    payload['signType'] = 'RSA'
    payload['merchantNo'] = YOUR_MERCHANT_NO
    payload['notifyUrl'] = ASYNC_NOTIFY_URL
    payload['echoParam'] = ECHO_PARAM
    payload['sign'] = calcRSA(payload)

}

function calcRSA(payload) {
  const data = Object.keys(payload)
    .sort()
    .reduce((obj, key) => {
      obj[key] = payload[key]
      return obj
    }, {})
  var str = ''
  Object.keys(data).forEach((key) => {
    if (data[key] != '' && key != 'sign') {
      str = str + key + '=' + data[key] + '&'
    }
  })
  str = str.substr(0, str.length - 1)
  return new NodeRSA(YOUR_RSA_PRIVATE_KEY, 'pkcs8-private').sign(
    Buffer.from(str),
    'base64',
  )
}
修改于 2023-10-18 06:34:27
上一页
UseePay出口IP说明
下一页
验签
Built with