通过阅读本篇文章,你可以了解到数字签名技术,了解支付宝接口的签名和验签的流程
签名
某些情况下(例如用户扫码支付成功时),支付宝会给商户系统发送异步通知。在发送异步通知时,支付宝会对通知参数进行签名,并将 “签名字符串 sign” 作为通知参数发送给商户系统。支付宝签名的步骤是:
技术是为了解决问题而生的,进行数字签名的目的是:
- 确保信息是由签名者发送的。防止有人冒充支付宝向商户系统发送异步通知;
- 确保信息自签名后 到 收到为止,信息未被修改过。防止有人篡改请求参数的值。
如果商家设置的通知地址为 https://api.xx.com/receive_notify.htm,对应收到的通知示例如下:
https://api.xx.com/receive_notify.htm? total_amount=2.00&buyer_id=2088102116773037&body=大乐透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00¬ify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA2&charset=utf-8¬ify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0& sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=& gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838¬ify_id=4a91b7a78a503640467525113fb7d8bg8e1 、拼接 “待签名字符串”
支付宝对要发送的通知参数进行签名的第一步是:拼接 “待签名字符串”。
2、调用签名方法 sign()
支付宝对要发送的通知参数进行签名的第二步是:调用签名算法对应的签名方法 sign(),生成签名字符串 sign。
调用签名算法对应的签名方法时,需要提供以下几个参数:待签名字符串 content、字符编码方案 charset(UTF-8、GBK)和 签名者的私钥 privateKey。签名方法 sign() 的处理逻辑如下:
3、拼接完整的请求 URL
支付宝对要发送的通知参数进行签名的第三步是:拼接完整的请求 URL。
验签
验签的全称是:验证指定内容的签名是否正确。
商户系统收到支付宝发送的异步通知后,商户系统需要对支付宝发送的通知参数进行验签处理。商户系统验签的步骤是:
1、拼接 “待验签字符串”
对支付宝发送的通知参数进行验签的第一步是:拼接 “待验签字符串”。
2、取出签名字符串 sign
对支付宝发送的通知参数进行验签的第二步是:从通知返回的参数列表中,取出签名字符串 sign。
3、调用验签方法 verify()
对支付宝发送的通知参数进行验签的第三步是:调用签名算法对应的验签方法 verify(),根据验签方法 verify() 的返回结果判定是否验签通过。
调用签名算法对应的验签方法时,需要提供以下几个参数:待验签字符串 content、字符编码方案 charset、签名字符串 sign 和 签名者的公钥 publicKey。验签方法 verify() 的处理逻辑如下:
验签成功后,商户系统根据通知参数进行业务处理。
参考资料
自行实现签名 - 支付宝文档中心 (alipay.com)
自行实现验签 - 支付宝文档中心 (alipay.com)