记一次支付宝支付的功能开发

背景:

公司需要增加一项支付宝PC端的收款功能

解决:

使用的支付宝官方文档中的电脑网站支付->统一收单下单并支付,当然,我们的支付宝账号需要开通该产品。官方API连接:https://opendocs.alipay.com/open/028r8t?pathHash=8e24911d&ref=api&scene=22。调用流程如下:
在这里插入图片描述

一、其中1.1对支付宝发起支付请求时,返回的是一个HTML文本,我们后端拿到文本后返回给前端,前端将表单进行提交,将会新生成一个支付宝二维码收银台。

二、其中6,是支付完成后要跳转的界面,会有个5S的跳转缓冲时间,期间支付宝会发起7:异步通知,我们同步通知和异步通知都要写,来确保支付通知不会丢失。

● 用户确认支付后,支付宝通过 get 请求 returnUrl(商户入参传入),返回同步返回参数。
● 交易成功后,支付宝通过 post 请求 notifyUrl(商户入参传入),返回异步通知参数。
● 接收到支付成功通知,必须进行验签,这个官方已经封装好了

Map<String, String> paramsMap = ... //将异步通知中收到的所有参数都存放到map中
    boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //调用SDK验证签名
    if(signVerified){
        // TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
    }else{
        // TODO 验签失败则记录异常日志,并在response中返回failure.
    }

三、同步或者异步通知验签成功后,还必须再次校验数据的正确性

  1. 商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号。
  2. 判断 total_amount 是否确实为该订单的实际金额(即商家订单创建时的金额)。
  3. 校验通知中的 seller_id(或者 seller_email) 是否为 out_trade_no 这笔单据的对应的操作方(有的时候,一个商家可能有多个 seller_id/seller_email)。
  4. 验证 app_id 是否为该商家本身。
    上述 1、2、3、4 有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。
    只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。

四、异步通知返回应遵守返回要求

成功应该返回success,如果支付宝收到的应答不是 success,支付宝会认为通知失败,会通过一定的策略定期重新发起通知。通知的间隔频率为:4m、10m、10m、1h、2h、6h、15h。不遵守规范,如果用户支付多次,这样会造成“ABA”问题,导致订单在某段时间状态不正常。

五、需要注意并发问题

支付成功后的同步通知、异步通知、以及异步通知失败后的重试,可能会造成并发,导致订单数据不正常的问题。这里我是同步通知、异步通知的支付成功的处理逻辑中加了out_trade_no维度的分布式锁,并进行了订单的幂等性校验(判断这笔订单的支付状态是否为已支付)。

总结:整体难度不高,安全性(消息摘要防篡改、数字签名确定发送方)支付宝官方已经替我们考虑了,我们只需要按照文档规范就可以保证支付的安全。需要注意的就是1、验签成功后,还要按照文档进行支付通知的逻辑验证;2、同步、异步通知需要加锁,防止并发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值