支付模块
功能介绍:
1.支付宝对接
2.支付回调
3.查询支付状态
学习目标:
1.熟悉支付宝对接核心文档,调通支付宝支付功能官方Demo
2.解析支付宝SDK对接源码
3.RSA1和RSA2验证签名及加解密
4.避免支付宝重复通知和数据校验
5.natapp外网穿透和tomcat remote debug
6.生成二维码,并持久化到图片服务器
7.支付宝回调,会放在request中,再从request中取出来,放在map中,再对map进行处理,打印的日志就是map中的内容
接口:
1./order/pay.do 支付订单
入参:orderNo,要支付的订单号
返回值:将持久化到ftp服务器上的二维码(通过nginx反向代理解析出来的url)和orderNo返回
2./order/query_order_pay_status.do 查询订单
入参:orderNo,要查询的订单号
用户付款后,收到支付宝确认成功的一个回调,就可以实时查到这个订单是否已经付款成功。
3./order/alipay_callback.do 支付宝回调
将回调地址/order/alipay_callback.do配置在项目中,以及支付宝官方配置,参数是ServerletRequest,从中拿到各种参数,并进行RSA2的签名
一些重要的官方文档:
1.沙箱登录
https://openhome.alipay.com/platform/appDaily.htm
2.沙箱环境使用说明和如何使用沙箱环境
3.当面付产品介绍、扫码支付接入指引、当面付快速接入、当面付接入必读、当面付进阶功能、当面付异步通知-仅用于扫码支付、当面付SDK&DEMO
4.服务端SDK
https://docs.open.alipay.com/54/103419
5.生成RSA密钥
https://docs.open.alipay.com/291/105971
6.线上创建应用说明
https://docs.open.alipay.com/200/105310
沙箱调试环境:
授权回调地址:线上url,这里我是申请了的nat,在我们发起请求时,要把这个url作为参数传给服务器。
AES密钥:在传输数据时,进行加密,支付宝通过AES密钥,对数据进行解密。
内部生成一个订单号,即选完商品后提交订单的那个操作;然后向支付宝请求预下单信息,里面包括外部订单号(out_trade_number,是针对支付宝来说的,但其实是我们的内部订单号)、验签、公钥等;然后,支付宝返回二维码信息(http协议的信息),拿到信息后可以利用工具生成二维码,以base64的方式传给前端,或以图片的形式持久化到ftp服务器,然后以http协议(nginx反向代理)的形式传给前端;支付宝钱包扫码后,会收到两次支付宝回调信息,第一次是支付宝返回的支付详情,第二次是在输入完密码后的账单详情。
支付宝扫码支付重要的字段:
关键入参:
参数名称 | 参数说明 |
out_trade_no | 用户订单号,需要保证不重复 |
total_amount | 订单金额 |
subject | 订单标题 |
store_id | 商户门店编号 |
timeout_express | 交易超时时间 |
关键出参:
参数名称 | 参数说明 |
qr_code | 订单二维码图片地址 |
其他重要字段:
参数名称 | 参数说明 |
trade_status | 交易目前所处的状态 |
total_amount | 本次交易支付的订单金额,单位为元 |
receipt_amount | 商家在交易中实际收到的款项,单位为元 |
buyer_pay_amount | 用户在交易中支付的金额,单位为元 |
交易状态说明:
枚举名称 | 枚举说明 | 触发条件描述 | 触发条件默认值 |
WAIT_BUYER_PAY | 交易创建,等待卖家付款 | 交易创建 | false(不触发) |
TRADE_CLOSED | 未付款交易超时关闭,或支付完成后全额退款 | 交易关闭 | false(不触发) |
TRADE_SUCCESS | 交易支付成功 | 支付成功 | true(触发) |
TRADE_FINISHED | 交易结束,不可退款 | 交易完成 | false(不触发) |
支付宝扫码支付重要细节:
1.主动轮询和回调的区别
2.避免单边账
3.同步请求的加签和验签
加签方法(如果不用SDK调用,推荐用该方法加签):
/* params 请求支付宝生成订单时的参数,参数列表,key是参数名称,value是参数值 privateKey 加签私钥 charset 加签字符集,统一用utf-8 */ String AlipaySignature.rsaSign(Map<String, String> params, String privateKey, String charset);
验签方法(同步请求时,如果不用SDK调用,推荐用该方法验签):
/* content 待验签字符串 sign 签名值 publicKey 验签公钥 charset 验签字符集,统一用utf-8 */ boolean AlipaySignature.rsaCheckContent(String content, String sign, String publicKey, String charset);
4.回调的验证(签名、金额、订单号、订单状态、交易状态、商户id)
5.过滤掉重复的通知
6.一定要验证并确保可接受的异步通知是支付宝发出的
验签方法(例如异步通知的时候,用户需要用到验签方法):
/* params 支付宝的回调参数,参数列表(包括待验签参数和签名值sign),key是参数名称,value是参数值 publicKey 验签公钥 charset 验签字符集,统一用utf-8
返回boolean类型,根据这个来判断是否接受这个异步通知 */ boolean AlipaySignature.rsaCheckV2(Map<String, String> params, String publicKey, String charset);
7.回调请求的返回
商城给支付宝的返回数据。给支付宝返回时,应在response中把"success"放进去,返回的规则:
程序执行完后必须打印输出"success"(不包含引号),如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟,一般情况下,25小时内完成8次通知。(通知的间隔频率一般是:4m,10m,1h,2h,6h,15h)。
支付宝扫码支付对接技巧:
1.回调的调试方式
支付宝怎么调到我,因为支付宝是在网络中的,所以至少我应该是可以上外网的。所以有以下几种方案:
1)路由器设置开放本地到外网(不推荐)
2)外网远程debug:例如当前商城部署在阿里云上,阿里云对外是有一个固定的ip或域名,回调地址设置成阿里云的这个服务器,然后保证本地代码和阿里云上的代码是一致的,然后开放一个远程debug的端口,在本机进行远程debug。这样在支付宝送回请求时,可以在本地进行debug。注意:(1)保持远端代码版本和本地代码保持一致。(2)及时关闭开放的debug端口。
3)内网穿透(natapp)
通过这个natapp软件,可以得到一个外网可以访问的域名,访问这个域名与访问本机是一样的。