国破山河在,城春草木深。
1 前言
在之前的文章中,分享了一些加 RSA 解密的内容,在本文中将分享一些关于支付宝的对接,主要涉及对接的流程以及过程中遇到的坑和注意事项。对于支付宝的对接,官方提供了对应的 sdk, 只需要调用对应的 api ,屏蔽了加解密的内容,让开发者专注于业务开发即可,十分的 nice。
2 支付产品
支付宝开发文档非常的齐全,这里主要介绍对接支付的场景,支付宝对应的支付场景主要有 以下几种方式:
# 支付宝文档地址
https://opendocs.alipay.com/open/03lo17?pathHash=2a9f174b
# 支付宝产品介绍
1 当面付
一般应用在线下场景中,使用扫码或者付款码的方式进行支付,资金立即到账。
2 App 支付
一般是在手机端 App、小程序中进行支付,可以直接打开支付宝App进行支付。
3 手机网站支付
一般是在 H5 场景、或者浏览器中进行使用,对支付宝进行访问授权并进行支付。
4 电脑网站支付
一般是在电脑浏览器中进行付款,资金可以立即到账。
3 支付环境准备
在开始对接开发之前,需要先创建应用并审核,开通对应的支付产品,将应用和产品进行绑定最后下载支付宝公开发平台密钥工具,生成公私钥或者证书,在本文中,使用的是证书模式。
如上图所示,生成CSR文件,即红框中的内容,上传 CSR文件至开发平台密钥设置,可以得到三个证书文件,即图中的三个 crt 文件。
准备好对应的证书文件之后,就可以进行代码的开发,首先需要引入对应的 sdk 。
com.alipay.sdk
alipay-sdk-java
4.31.65.ALL
创建配置文件,需要创建 AlipayClient , 这里提供了两种方式,一种是公私钥的方式,另外一种中证书的方式,这里推荐使用证书的方式,第一是证书比公私钥的方式安全一些,另外证书方式可以解决 subject 字段为中文时,支付宝验签失败的情况(这个问题困扰了作者很久,在公私钥的场景下,怎么处理都不行,换了证书的方式就解决了)。
4 接口调用
在准备好了环境之后,就可以进行场景的对接。这里主要展示几个常用的场景,当面付、pc网页支付、手机网页支付、订单查询、订单退款、支付回调通知等几个场景。
4.1 pc 网页支付
在 pc 网页支付中,需要传入的基本参数包括回调地址、订单号、支付金额、订单标题等,调用接口会返回一个 form 表单,返回给前端后,会自动提交表单,跳转到支付宝的网页支付页面。
4.2 wap 网页支付
手机网站支付是用户在移动端网页的环境进行支付,当选择支付宝支付时,浏览器会自动跳转到支付宝App或者网页进行支付。和 pc 网页大体相同,在提交订单后,会返回一个 form 表单,浏览器前端提交表单跳转到支付宝进行支付。
4.3 当面付
和网页支付不同,当面付是一种即时支付并到账的用户付款方式,主要是用户下单调用支付宝当面付接口,返回的是一个支付连接,将支付连接通过二维码转换工具,转换成二维码展示到前端,用户打开支付宝App 扫描二维码即可完成支付。
4.4 关闭订单
当订单超支付超时时,需要修改订单状态,在修改状态之前,需要调用支付宝提供的关单接口。这里需要提醒一下,业务的订单是记录的应用业务信息,在调用支付时,需要记录对应的支付信息,毕竟一笔订单可能有多个支付单,支付单要和业务订单分开。订单闭关需要传入的参数是应用侧的订单号。
4.5 订单退款
既然有用户的支付,就要有用户的退款,否则会造成业务的不闭环,不同于用户的支付,用户退款接口是统一的。退款和关闭订单传递的参数都比较简单,只需要传入应用测的单号即可。
4.6 订单查询
在查询订单时,传递的参数比较简单,只需要传入商户侧的订单号或者支付宝返回的支付单号即可。
4.7 订单通知
在所有的支付场景中,都要传递一个支付回调地址,用于接受订单支付的结果,在接收到结果后,需要先对结果进行验签,验签成功后进行业务的处理。
5 总结
对接支付场景, 不同于日常的应用开发,是涉及到用户的资金,一旦处理不好就会导致客诉和资损,都是会造成不可挽回的损失。接触到第三方的开发,可以学习到其它编码规范以及开发技巧,跳出自己增删改查的日常工作,可以说是具有挑战性的,也是自我提升和进益的途径和抓手。在本文中,介绍了支付宝常用的对接场景,如果大家感兴趣,作者会在后续的文章中更新微信支付的对接方式,欢迎大家的点赞关注。此外,本文中所涉及的代码已经上传到 github, 欢迎大家 stars, 项目 github 地址 springboot-auth。