支付宝支付流程学习分析

最近公司需要开发支付宝支付,以前只是简单了解了一下流程,现在照着蚂蚁金服提供的API文档和DEMO学习一下,做一个简单的学习总结

首先搭建环境

  1. 需要登录https://openhome.alipay.com/platform/home.htm蚂蚁金服开放平台
  2. 进到沙箱环境
  3. 配置对应的公钥及私钥(蚂蚁金服使用的是RSA2非对称加密算法,这里就不过多提及,蚂蚁金服提供密钥生成工具,只需要按照指引生成密钥,将公钥复制到网站中即可)
  4. 在开发文档中心下载DEMO,我这里用的是Java版的
  5. 下载好demo后,导入自己的IDE,并且配置好AlipayConfig的参数(应用appId,商户私钥,支付宝公钥以及同步和异步回调地址,其他的默认即可)

流程分析

此demo的大部分接口代码是用JSP文件来完成的,实际上就是servlet,先看看蚂蚁金服官方的流程图
支付流程

  • 首先访问我们的地址(可以使用NetApp等软件将内网穿透),即跳转到index页面
    index付款表单
    商品的价格显示,页面处理等逻辑在真正开发中是由我们操作

  • 现在看看具体的页面代码如下
    index付款表单
    在这里我只展示了付款的表单,其他交易查询等逻辑一样,就不一一展示

我们发现在表单中action指定的是alipay.trade.page.pay.jsp这个页面,我们点开这个文件

  • 打开alipay.trade.page.pay.jsp这个文件,发现其实这里就是在写java代码,实际就是起到一个接口的作用,因为tomcat可以直接解析jsp文件
    alipay.trade.page.pay代码
    在这里,程序拿到我们配置的参数和刚刚页面传递过来的参数,进行配置传送,其中最主要的就是alipayClient.pageExecute(alipayRequest).getBody()这句代码,实际上这里就是将请求参数以及配置参数利用这个方法进行加密处理,然后传递到阿里后台

  • 我们再来看看这是如何实现的,首先获得result这个结果(sign签名参数是拼接在url之后的,所以会进行编码,为了方便阅读,我将其进行了解码以及缩略)

<form name="punchout_form" method="post" action="https://openapi.alipay.com/gateway.do?charset=utf-8
&method=alipay.trade.page.pay
&sign=签名
&return_url=我们的同步回调地址
&notify_url=我们的异步回调地址
&version=1.0
&app_id=hkvdci7532%40sandbox.com
&sign_type=RSA2×tamp=2019-02-18+10%3A55%3A54
&alipay_sdk=alipay-sdk-java-dynamicVersionNo
&format=json">
<input 
type="hidden" 
name="biz_content" 
value="{"out_trade_no":"201921810544313","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>

以上便是result的结果,看到这里,就明白了是怎么访问支付宝后台的接口了,实际上result就是一个表单,将这个表单println输出到浏览器中,浏览器便直接解析执行,最后由js代码提交表单,访问的接口是https://openapi.alipay.com/gateway.do,并且我们的页面参数是放在了json对象内

  • 蚂蚁金服后台验证签名没问题,就会响应给我们登录付款的界面
    登录付款

  • 登录的逻辑是由蚂蚁金服后台完成的,使用沙箱个人的账号密码成功登录后,跳到这个页面
    渠道付款

  • 最后蚂蚁金服在付款成功后会调用我们的同步回调页面,demo中同步回调的显示
    支付成功
    回调页面的展示
    回调页面
    查询API发现,trade_no是支付宝交易号, out_trade_no是商户订单号, total_amount是订单金额,这些是用来在我们自己页面中回显给用户的

  • 蚂蚁金服后台还需要调用我们的异步接口,在官方的API看到这样一句话
    异步通知返回值
    也就是我们需要在异步的回调接口中返回"success",否则蚂蚁金服会一直通知

为什么要需要异步回调

其实这是分布式事务的一种实现方式 --> 最大努力通知,是为了能让两边服务器的数据保持一致,因为在数据传输过程中,有很多异常的可能,比如网络中断,而最好的方式之一就是一方异步通知另一方保持数据一致,如果对方返回一个标志(比如“success”),就结束通知,否则就尽可能的通知。

这种方式也有一个问题,假如蚂蚁金服异步通知过来,我们自己的后台成功执行了业务,也return回了success,但是中间网络断了,那么蚂蚁金服还是没收到结果,还会再异步通知我们,这时我们需要保证相同的业务不要再执行了,直接返回success

这就是幂等性,无论调用多少次,返回的结果都和第一次一样,在这里我们每次收到异步调用通知后就去查询我们的数据库是否已标志该条数据,是的话直接返回success,否则继续执行业务

猜你喜欢

转载自blog.csdn.net/qq_40233503/article/details/87630564