安全相关
- 为确保数据的真实性和完整性,支付平台和商户都需要对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适用!!!