支付宝网页支付(签名) - Go语言中文社区

支付宝网页支付(签名)


请求流程中,签名部分是重要的一部分。

也是初学者不容易理解的部分。

最终请求支付宝的链接为:

https://openapi.alipaydev.com/gateway.do?参数1=...&参数2=...&sign_type=RSA2&sign=mZsBK....(很长)

说简单点即是:支付宝网关?必要的参数&签名参数

那么,为什么加签名呢?

作用:确认数据完整性,防止数据传输中被拦截篡改数据。

原理:1/为了更好的说明,假设必要的参数为price=1&num=2;

2/如果只这么请求,就有半路拦截篡改数据的风险;

3/那么,我们把price=1&num=2按照一定规则,生成一个字符串'jifu2387',把这个字符串命名为sign,带进参数里。

4/变为www.zhifubao.com?a=1&b=2&sign='jifu2387'

5/支付宝收到请求后,提取出必要参数a=1&b=2,通过算法将a=1&b=2和sign='jifu2387',做验签(不用关心怎么验签的,总之那边拿到数据和签名,它就能验签),如果验签成功,才会发起交易操作。

6/那么疑问来了,我们通过a=1&b=2生成'jifu2387'的规则,和支付宝那边通过验签的规则,必然有一定的联系。

7/老版本是md5加密,我们和支付宝使用一样的规则即md5。但如果拦截数据,修改数据并使用MD5模仿我们发起请求,仍然有可能。

8/新版已废除md5,使用RSA加密(RSA,RSA2)只是生成方法不同,实质一样。

9/RSA分为公钥和私钥,我们通过官方下载的签名工具,同时生成公钥私钥,注意它俩之间有一定的对应关系。

10/私钥商户自己保留,别人包括支付宝也是不知道的。公钥要上传到支付宝。

11/回到最初的发送支付请求,生成sign签名,就需要使用我们的私钥了,这样生成一个别人无法揣测的字符串,因为私钥只有商家知道(而且还挺长2048个字符)。支付宝用我们上传的公钥,通过算法和我们的签名作比对。可以说签名的生成和验证过程相当复杂。

12/支付宝完成交易后,通知商户,分异步通知和同步通知,这里不多说,异步通知里,我们一样要对支付宝返回的参数(带有签名,这个签名是支付宝生成的),进行对参数的验证(防止返回途中被篡改),如同支付宝验证我们的参数一样。

13/商家请求支付宝,支付宝对商家的参数进行验证;支付宝请求商家,商家同样对支付宝的参数进行验证。

14/那么商家对支付宝发送的参数怎么验证呢?

15/商家上传公钥的时候,支付宝会自动给商家返回一个支付宝公钥,估计支付宝也同时生成了公钥和私钥,把公钥发送给我们,而私钥用来生成发送给我们的签名。

16/这样来看,无论是支付宝验证我们,还是我们验证支付宝,都是一摸一样的。

17/不难理解,我们要使用支付宝公钥,通过算法对返回的数据(剔除签名的数据)和签名进行验签。

end;

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yt_php/article/details/80522303
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-04 14:47:00
  • 阅读 ( 1369 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢