请求流程中,签名部分是重要的一部分。
也是初学者不容易理解的部分。
最终请求支付宝的链接为:
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;
文章图片