第三方支付的对接
前言
第三方支付对接最核心的概念首先就要搞清前台通知和后台通知(异步通知)
前台通知:譬如支付宝支付完成后,第三方会主动跳转回商户页面,这个地址由电商平台传递给支付宝方,支付宝方支付完后回主动跳转回这个地址,这属于前台通知,用于增加用户体验,而且支付宝只会执行一次,如果中间过程,用户付款完后立刻关闭掉页面,则不会再次跳转到电商平台指定的地址,因此用这个地址作为更新电商平台流水记录及订单状态更改不安全
后台通知:后台通知也是由第三方发起,当用户支付完成之后,地址也是由电商平台在调用支付过程中,传递给第三方平台,这个地址用于接收第三方平台的响应,当支付成功后,第三方会回调这个地址,当第三方回调后,电商平台响应其指定的成功参数值,则第三方平台就不会再通知,如果回调过程失败,则第三方会以一定的频率时间请求回调地址,直至响应成功。
1.支付宝对接
支付宝开发api平台
官方地址:https://docs.open.alipay.com/api
主要接口如下:
1.PC端支付宝下单
2.手机端支付宝下单
3.交易查询
4.退款
5.退款查询
6.转账
7.对账单下载
支付宝对接必备参数:appId,privateKey(私钥),publickey(公钥),加密算法(RSA 和RSA2)
开发者可登陆开发者平台中心,申请沙箱环境,平台会提供给你对应的参数,然后,可进行模拟支付,注意:推荐使用RSA2算法,沙箱提供的一般是RSA算法的签名,正式环境一般推荐的是RSA2
注意事项:
正式环境的签名本地可调试接口是否能调通,但是页面成功到支付宝页面,需要域名绑定,等于说正式上线了,必须指定其正式域名才能正常调用出支付宝。
2微信对接
微信支付api地址:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1
1.微信扫码支付
2.微信手机H5对接
3.交易查询
4.退款
5.退款查询
6.转账
7.对账单下单
微信支付必备参数:appid, mchId,mchKey,keypath(双向证书地址)
注意:微信对接下单,双向证书不是必须,但是退款是必须
微信也可以整沙箱环境,但是搭建过程没有支付宝方便,需要请求接口获取对于沙箱的密钥
微信扫码支付实现过程,调用微信,生成一个二维码,同时可以利用websocket技术监听二维码状态,当用户扫码支付完成后,可以在微信异步通知的地方调用发送websocket消息的方法,前端页面监听到消息,则可执行关闭二维码及执行后续逻辑。当然单机环境下,异步响应的工程及发送websocket的相关代码部署在同一台服务器,但是正式环境一般是集群环境,譬如由2台机器A,B,本地环境一般都是通过ip来连接websocket协议,外网环境一般不会暴露其ip,二是通过域名,利用域名使用websocket协议,可通过nginx转发,加入相关配置即可,说回到原里那个问题,正式环境集群的话,假设客户端生成二维码监听连接的是服务器A,但是微信支付完成后,第三方异步通知的是B服务器,这时,会出现扫描完但是客户端没收到成功的消息,导致二维码没有关闭,关于这个问题,后续会给出解决方案。
微信H5支付:调用成功会返回一个url地址,注意需要多传递一个ip地址,这个ip地址必须是客户端地址,如果经过nginx服务器转发,拿到的ip地址可能不是真正的客户端ip地址,这时调用微信就会失败。而且微信支付只能在外网手机环境测试,必须和域名绑定,可在官网平台添加,回调地址后面可以拼写一个回调地址,当微信支付完成后或者不支付退出,都会返回这个页面,因此这个页面不能作为更新订单状态的url,只是是一个查询页面,譬如支付完或者不支付都跳转到订单详情页,再加载这个页面最好延迟一会,因为这个时候如果支付了,则异步通知里面可做订单状态更改,如果没有付钱则显示待付款,因为无法保证其异步通知比跳转先执行,另一种做法就是跳回到一个之前提交订单的页面,显示出一个弹框,周边置灰,让用户自己去判断是否付钱,这时可有用户点击确认来主动查询第三方来判断是否支付成功,成功则更新状态,不成功则不更新
微信支付:可能会遇到退款异步通知的地方解密退款应答参数时报错,一般是jre下面这两个包的版本不一致导致,可通过jre官网下载对于的jar包就好