支付需要考虑场景以及常见支付方式
支付流程
需要注意的点
防止重复支付
1.比如用户支付了,但是第三方还在处理 未及时通知我们支付成功,或者我们回调服务出现问题。第三方调不通,用户发现待支付有可能重复支付。
2.所以每次生成新的支付单,拿最新的支付单直接调用第三方看是否是支付成功,如果状态是支付中(比如停留再输入密码界面),提示用户不要重复支付,如果是支付成功,触发支付成功处理逻辑
支付成功订单过期了
1.这种一般出现再临界时间支付,或者是第三方异常托太久告诉我们支付成功。
2.我们回调服务出现问题。等解决 第三方重试通知我们 我们的订单已经触发过期未支付 自动关闭了
场景1
比如订单下单 15分钟超时支付,用户14分58秒唤起支付,然后15:10秒才输完密码支付,其实在15:分钟的时候订单过期检查已经发现超时了 把订单状态改为过期未支付
1、跳到订单确认页 发现过期关闭要提示用户"订单已经过期关闭,请重新下单,如有支付将自动退款" 然后发起退款逻辑
场景2
支付成功,跳到订单确认页,第三方还是支付中 正常提示用户"您已提交订单",但是异步回调的时候 订单已经过期关闭了。则触发自动退款
常见的支付方式
app支付
1.生成订单 选择支付方式后。
2.根据订单生成支付单。调用具体支付的SDK服务端代码。传入appid、金额、 支付单号、 异步回调地址、 私钥(注:一般支付的开发者平台 一个appId都对应一个公钥和私钥,私钥自己保留加密。第三方通过公钥解密)。
4.SDK会根据私钥通过RSA生成签名。返回给前端。
5.前端APP 安装或者IOS对应的SDK使用签名唤醒支付
5.支付成功异步通知会返回支付单号回调我们的地址。我们再根据公钥、解密、则修改订单状态为支付成功。并记录第三方支付单号(后期退款需要传入 保证退款金额<=支付金额)
6.针对APP支付成功是同步感知的 他们跳到对应的支付成功页面
网页支付
1.生成订单 选择支付方式后。
2.根据订单生成支付单。调用具体支付的SDK服务端代码。传入appid、金额、支付单号 、异步回调地址、支付成功跳转的页面ur(一般会加上我们关心的参数 如支付单号)、私钥(注:一般支付的开发者平台 一个appId都对应一个公钥和私钥,私钥自己保留加密。第三方通过公钥解密)。
3.支付SDK会生成对应的支付网关url 如支付宝:www.alipay.gateway.com 后面会带着我们RAS加密后的签名
4.服务端直接返回http 302 让前端跳转到指定对应支付网关
5.跳到第三方支付网关 第三方会根据是否安装支付app 如果安装了就是唤醒支付app支付。如果没有可能就是手机短信验证码。支付成功后。第三方支付页面会302跳到回我们页面
6.当然我们也会收到异步支付成功通知
扫码支付
1.生成订单 选择支付方式后。
2.根据订单生成支付单。调用具体支付的SDK服务端代码。传入appid、金额、 支付单号、 异步回调地址、 私钥(注:一般支付的开发者平台 一个appId都对应一个公钥和私钥,私钥自己保留加密。第三方通过公钥解密)。
3.第三方会生成支付url 可以理解为跟网页支付一样的url
4.我们通过url服务端生成 二维码 或者返回前端生成二维码
5.前端开启轮训 通过支付单号查询是否支付成功
6.如果用户支付成功 轮训查询则会查询到支付成功 前端跳转到支付成功页面