一、支付概念
现在有的支付机构:
支付宝、微信支付、京东支付、银联支付、小米支付、百度钱包、平安支付。
整个支付体系的流程都是大同小异的。
聚合支付平台。
二、支付架构整个流程
支付包整个支付流程:
1、 网站提交参数到支付宝接口
2、在支付宝接口中,支付结果会通知给蚂蚁课堂。
在支付这个开发中会遇到很多问题:
1、安全方面:
加密方式:
使用https
加签:防止数据被篡改
加密手段:使用md5、base64、des、sha1
对称加密:base64、des、
非对称加密:rsa:公钥和私钥的互换
支付宝使用加签+非对称加密rsa
2、支付回调的时候幂等问题
怎么保证接口的幂等性问题。
支付宝怎么把支付结果通知给网站?
1、支付通知结果有两种一种是同步通知(同步回调)、一种是异步通知。
同步通知主要是展示给用户看的支付宝的支付结果。不会去处理订单的状态的更改。
支付宝同步通知主要是展示作用的。本地浏览器做重定向的操作。
异步通知主要是:主要是支付宝服务器使用httpclient技术调用网站的接口进行通知。会有补偿机制。
需要解决的问题:在网络延迟的情况下,如何解决支付回调幂等性的问题?
答:使用全局ID.
双重通知+补偿机制。这上面是最简单版本的分布式事务解决方案。解决双方事务 一致性的问题。
在http协议通讯的时候怎么解决分布式事务问题?
答:如支付宝的支付流程,通过异步通知+补偿机制+自动重试机制来解决分布式事务的问题。
三、支付宝沙箱环境
沙箱环境地址https://openhome.alipay.com
1、要在沙箱环境中配置自己的私钥和公钥,私钥就自己记下来就行
2、下载沙箱环境的运行demo
四、安全加密方式
1、安全加密分为
单向加密:不可逆的加密,MD5、
对称加密:base64 、des
对称加密是可逆的,既可以加密出来,又可以拿到密文后解密出来
非对称加密: 在支付系统中用的很多。
RSA公钥和私钥(最安全的加密方式)需要做公钥和私钥的互换。
支付宝:
网站首先生成一对公钥和私钥,网站使用私钥进行加密,如果要进行解密需要拿到公钥来进行解密。
相当于:网站本地生成一对密钥对,自己拥有私钥,把公钥给支付宝。支付宝拿公钥进行解密。
代码:
如果使用了私钥进行加密了,就要用公钥进行解密
如果使用公钥进行加密了,就要使用私钥进行解密。
五、支付宝Demo环境的运行
六、支付宝流程源码分析
里面的return_url:是在同步接口中的回调地址
notiify_url是在异步接口中,回调的地址。
封装成了一个POST提交的代码
把参数封装成表单的方式,然后再后台以POST方式进行提交给支付宝服务器。
<form name="punchout_form" method="post" action="https://openapi.alipaydev.com/gateway.do?charset=utf-8&method=alipay.trade.page.pay&sign=msqdFnggfRIH9eZf56MzSJvY%2BXVFF5b61rH17TmRZb80RLfQoiRt3INFZnpwEiE2IPJlz9DbWbkKNk8XrAPzu%2FACpjdDGLVKxqgY6gqOpFl2xSqnY2EI0tXKMizoM5kONoIEabdrqMXyh12aPnWrUM4PRgqMz1jrywuJwlzVQ%2F9takpzT1V70cdrNLqBDzs2tjz4BBygGg1yxYOtSWmdSngtTzwWJAo8O0mdUguOep6Yxsq2I%2B2DPhJEoRNPHc00kNzaUgxCuYKYXmuf6BSsadBaAz5%2FhErsw1M43tgCKgZiMYimSer1NUogO0ys%2FD3SnOsiqZrbxcKTTCQj4G9A2Q%3D%3D&return_url=http%3A%2F%2Fkgqfxi.natappfree.cc%2Freturn_url.jsp¬ify_url=http%3A%2F%2Fkgqfxi.natappfree.cc%2Fnotify_url.jsp&version=1.0&app_id=2016092300575828&sign_type=RSA2×tamp=2019-01-22+15%3A15%3A09&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json">
<input type="hidden" name="biz_content" value="{"out_trade_no":"201912215649914","total_amount":"0.01","subject":"测试","body":"","product_code":"FAST_INSTANT_TRADE_PAY"}">
<input type="submit" value="立即支付" style="display:none" >
</form>
<script>document.forms[0].submit();</script>
支付过后,会产生异步通知和同步通知,再进行验签后如过成功了就会返回。
没有成功会有重试机制。