本博客主要讲解以下两点:支付宝的三种支付流程
1.所有支付逻辑处理均在服务器上完成,现已消除。
原理是电商App将所有信息提交给电商服务器,然后电商服务器与支付宝服务器进行交互。
2、所有支付逻辑处理都是由电商APP调用手机上的支付宝客户端,然后支付宝客户端与支付宝服务器交互进行处理。
原理是电商APP向电商服务器发送请求,然后电商服务器生成订单信息。
然后返回电商APP。电商APP进行支付时,需要判断用户是否有支付宝客户端。
如果没有,则无法付款,并提示用户下载支付宝。如果是,请致电支付宝客户端进行付款。
支付宝服务器将支付成功的数据反馈给电商APP和电商服务器。
3.所有支付逻辑处理均在电商APP本身处理,但必须集成支付宝。
SDK,也称为JAR包,这种方式最常用
原理:电商应用向服务器发送请求。电商服务器生成订单信息后,返回给电商APP。
在电商APP上支付时,只需调用与支付宝集成的智能SDK,智能SDK即可完成支付。
支付宝服务器将支付成功的数据反馈给电商APP和电商服务器。
无论哪种模型都涉及三个重要信息
1. 订单数据
2、用户账户密码
3、电商服务器支付宝账号及电商服务器IP地址
要知道的事情:
支付成功后,支付宝向电商APP和电商服务器发送通知的原因是:
主要是给电商用户支付成功的提醒。电子商务服务器用于
立即发货
支付宝服务器向电商服务器发送通知频率:2m、10m、10m、1h、2h、6h、15h
如果支付宝服务器向电子商务服务器发送了7条通知,但电子商务服务器没有告诉支付宝服务器“我收到了”,支付宝会将钱退回到用户的支付宝中。该规则与三次握手原理类似。记得把电商服务器获取到的数据告诉支付宝服务器。
在支付宝的智能SDK中,
最重要的课程是
最重要的方法是 pay() 方法
RSA加密算法原理
众所周知,支付宝采用RSA算法进行数据加密。
RSA加密算法中只用到了素数、互素数、指数运算、模运算等一些简单的数学知识。因此,我们也需要了解这些概念。
素数
素数,又称质数,是指大于1且不能被除1和整数本身以外的其他自然数整除的自然数。这个概念我们在初中甚至小学都学过,这里就不做过多解释了。
相对质数
百度百科上的解释是:公因数仅为1的两个数称为互质数。 ;维基百科上的解释是:co-,又称co-。如果N个整数的最大公因数为1,则称这N个整数互质。
判断互质数的常用方法主要有以下几种:
两个不同的质数必须是互质的。例如,2 和 7、13 和 19。
如果一个数是质数,而另一个数不是它的倍数,则这两个数互质。例如,3 和 10、5 和 26。
两个相邻的自然数互质。比如15、16。
两个相邻的奇数互质。比如49和51。
如果较大者是素数,则两个数互质。比如97、88。
小数是素数,两个不是小数倍数的数是互质的。例如 7 和 16。
2 和任意奇数互质。例如 2 和 87。
1既不是质数也不是合数。它与任何自然数互质。例如1和9908。
欧几里得除法。
指数运算
指数运算也称为幂计算,计算结果称为幂。 nm 指的是n 本身乘以m 次。将 nm 视为幂的结果称为“n 的 m 次方”或“n 的 m 次方”。其中,n称为“底数”,m称为“指数”。
模运算
模运算是余数运算。 “模块”是“Mod”的音译。与模运算密切相关的一个概念是“同余”。从数学上讲,当两个整数除以同一个正整数并得到相同的余数时,则这两个整数全等。
如果两个整数a和b除以正整数m得到的余数相等,则称a和b模m同余,表示为:a == b (mod m);读作:a 与 b 模 m 全等,或者,a 和 b 模 m 全等。例如:26 == 14 (mod 12)。
公钥和私钥生成
假设您想通过不可靠的介质接收来自 Bob 的私人消息。她可以通过以下方式生成公钥和私钥:
随机选择两个大素数p和q,p不等于q,计算N=pq。
根据欧拉函数,求r = (p-1)(q-1)
选择一个小于r的整数e,找到e相对于模r的模逆元素,并将其命名为d。 (模反元素存在当且仅当 e 和 r 互质)
//如果两个正整数a和n互质,那么可以求出整数b使得ab-1能被n整除,或者ab除以n的余数为1。此时b称为“ a 的模负元素”。
销毁p和q的记录。 //销毁的目的是为了防止根据pq得到N
(N,e) 是公钥,(N,d) 是私钥。将她的公钥 (N,e) 传递给 Bob 并隐藏她的私钥 (N,d)。
您还可以使用工具来生成:
使用可以生成RSA的密钥对,即公钥和私钥(官网:)
RSA特点:用公钥加密的字符串只能用私钥解密(记住用公钥加密的字符串不能用公钥解密)
RSA特点:用私钥加密的字符串只能用公钥解密(记住用私钥加密的字符串不能用私钥解密)
加密消息
假设Bob想要发送消息m,并且他知道结果N和e。他用一开始约定的格式,将m转换成小于N的整数n。比如,他可以将每个单词转换成单词的代码,然后将这些数字连接在一起,形成一个数字。如果他的消息很长,他可以将消息分成几个段落,然后将每个段落转换为n。使用以下公式,他可以将 n 加密为 c:
ne ≠ c (mod N)
计算c并不复杂。 Bob 计算出 c 后,他可以将其传递给 。
解密消息
收到 Bob 的消息 c 后,您可以使用她的密钥 d 对其进行解码。她可以使用以下公式将 c 转换为 n:
cd ≠ n (mod N)
得到n后,她就可以恢复原来的信息m。
解码的原理是:
cd ≠ ne·d(mod N)
且 ed = 1 (mod p-1) 和 ed = 1 (mod q-1)。可以用费马小定理证明(因为p和q是素数)
ne·d == n (mod p) 和 ne·d == n (mod q)
这说明(因为p和q是不同的素数,所以p和q互质)
ne·d == n (mod pq)
签名留言
RSA 还可用于对消息进行签名。如果A想要向B传递一条签名消息,那么她可以为她的消息计算一个哈希值( ),然后用她的密钥(key)加密该哈希值,并将这个“签名”添加到后面的消息中。该消息只能使用她的公钥来解密。 B获得消息后,可以使用A的公钥解密哈希值,然后将此数据与自己为消息计算的哈希值进行比较。如果两者匹配,那么他就可以知道发送者持有 A 的密钥,并且消息在传播路径中没有被篡改。
您的公钥与支付宝公钥交互:
当您在支付宝官网创建应用程序时,支付宝会要求您将您的公钥提供给支付宝,支付宝也会将其公钥提供给您。
加密和解密支付信息时:
首先对信息进行加密,然后使用支付宝的公钥对其进行加密,最后使用您的私钥对支付信息进行加密,然后将其发送到支付宝服务器。
同理,解密时:
首先获取支付宝的加密字符串,然后用自己的私钥解密,再用支付宝的公钥解密,最后利用解密获取支付信息;
最后一张图是为了帮助理解服务器如何使用RSA算法加密数据进行交互(可能有点难看,请见谅)
参考: