安全相关

  • 为确保数据的真实性和完整性,支付平台和商户都需要对Request/Response数据进行签名验证。
  • 如下过程:贯穿创建新支付交易、支付请求、支付结果查询、支付结果通知、关联支付交易过程始终;
  • 调用支付平台api时,如果返回数据包含重要信息,则支付平台先对返回信息使用支付平台RSA私钥进行签名,再对返回信息 用商户RSA公钥进行加密,商户在收到返回结果时,需要先使用商户RSA私钥对加密内容进行解密后,再进行验签。

签名数据构造规则

传递请求数据时,需要按照支付平台要求对请求参数进行签名:

  • 1.除创建订单外,其他请求或返回的签名

全部参数需要按照字母升序进行排序,然后拼接为JSon字符串,对拼接后的Json字符串使用RSA私钥进行签名,没有赋值的非必填字段不参与签名,security_type和Sign字段不参与签名;

  • 2.创建订单签名

选取部分参数按照字母升序进行排序, 并添加head部分(head字段也参与排序,head中的内容也需要按照字母进行升序排列)。拼接后的Json字符串示例如下:

    {
      "callback_url": "callback_url",
      "head": {
        "compress_type": "0",
        "language": 0,
        "merchant_id": "656848",
        "request_id": "305386041580326912",
        "service_name": "CreatePayOrder",
        "time_stamp": "1552976171741",
        "version": "1"
      },
      "merchant_id": "20079",
      "merchant_url": "merchant_url",
      "notify_url": "notify_url",
      "out_trade_id": "gbt305386039277654016Sii",
      "pay_amount": 2,
      "pay_currency": "CNY",
      "pay_expire": 30,
      "pay_type": 1,
      "product_subject": [
        {
          "channel_goods_code": 2,
          "channel_goods_desc": "",
          "channel_goods_img": 0,
          "channel_goods_price": "2",
          "channel_goods_subject": "测试礼包001",
          "channel_goods_sum": "1"
        }
      ],
      "request_id": "305386041580326912",
      "service_name": "CreatePayOrder"
    }

对拼接后的Json字符串使用RSA私钥进行签名。

注意事项

  • 值为空的非必传参数不参与签名,也不需要传递。
  • 签名字段和传输字段赋值应保持一致,需要注意空格、换行等特殊字符。
  • 传输的字符集目前为UTF-8。
  • 目前本接口仅支持SHA1withRSA签名算法。
  • 数据RSA签名或加密后需要再进行Base64编码为字符串后再进行赋值和传输
  • 需要签名的字段不包含security_type及sign字段
  • 请求报文超长处理:分段加解密:key:【1024】位、每个明文长度用64字节、共分8段;

生成密钥工具

https://docs.open.alipay.com/291/105971

注意:用工具生成密钥时,密钥格式一定要选JAVA适用!!!