背景
一般公司都会有接入支付宝以及微信支付的相关需求,在这里记录一些接入过程中遇到的点
微信支付接入
微信支付的开发文档在这个地址 微信支付-开发文档,主要包含付款码支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付、刷脸支付
等。目前我接触过的是其中的JSAPI支付、Native支付、APP支付、H5支付四种,因此,这里主要讲一下这四种的区别,其他基本也是大同小异。
在接入之前可以先申请相关的账户参数,一般是一个商户号下面对应不同的应用,以及相关的密钥,具体申请流程可以参考文档中的支付账户一栏,以小程序为例
小程序账户相关参数
H5、JSAPI、NATIVE、APP等账户相关参数(同一公众号下的不同支付场景)
通用内容
针对以上的支付场景, 基本上微信的支付流程API都是类似的,因此,我们先从通用的下手。
可以通过观看对应支付类型的API列表来查看,对号入座即可,涉及内容较多,以统一下单、查询订单、关闭订单、申请退款、查询退款、支付结果通知
为例大概说明。
jsapi的api列表
小程序支付除了下图中的不同,其余可以理解为JSAPI的支付,相关地址
小程序支付与JSAPI和JSSDK的区别
统一下单
具体内容请根据业务类型查看相关的文档了解接入([微信支付-开发文档][微信])
1. 下单api差异
除了 付款码支付 以及 刷脸支付(不在该篇的讨论范围,之后谈到的都不包含),其余支付的请求api都是 https://api.mch.weixin.qq.com/pay/unifiedorder
主要的区别在于传参字段之一的交易类型【trade_type】,其对应关系如下为:JSAPI–JSAPI支付(或小程序支付)、NATIVE–Native支付、APP–app支付、MWEB–H5支付
在这中间,H5支付 的api文档里面是没有备用域名的,而其他三个(JSAPI、NATIVE、APP)存在备用域名 https://api2.mch.weixin.qq.com/pay/unifiedorder(备用域名)
2. 充值参数差异
H5支付的参数与其余的区别在于文档参数中必填 场景信息 字段
H5支付的场景信息字段描述
JSAPI的场景信息字段描述
按照我的理解,支付的统一下单可以理解为下三种:
- JSAPI、APP、NATIVE支付 – 除 交易类型 不同,其余基本相同
- H5支付 – 与 第1种 类似,需要注意,场景信息 参数必填
- 其他 – 付款码支付、刷脸支付
查询订单
查询订单的内容,不同支付类型都是相同的。应用场景如下:
- 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知
- 调用支付接口后,返回系统错误或未知交易状态情况
- 调用付款码支付API,返回USERPAYING的状态
- 调用关单或撤销接口API之前,需确认支付状态
关闭订单
不同支付类型的关闭订单基本雷同,应用场景如下:
- 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付
- 系统下单后,用户支付超时,系统退出不再受理,避免用户继续
需要注意,小程序支付没有备用域名,其余存在备用域名
接口链接:https://api.mch.weixin.qq.com/pay/closeorder
URL地址:https://api2.mch.weixin.qq.com/pay/closeorder(备用域名)见跨城冗灾方案
复制代码
申请退款
申请退款需要双向证书,证书使用
接口地址没有备用域名
注意事项:
- 交易时间超过一年的订单无法提交退款
- 微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号
- 请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次(错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次)
- 每个支付订单的部分退款次数不能超过50次
- 如果同一个用户有多笔退款,建议分不同批次进行退款,避免并发退款导致退款失败
- 申请退款接口的返回仅代表业务的受理情况,具体退款是否成功,需要通过退款查询接口获取结果。
支付结果通知
支付回调很关键,是判断一笔订单是否完成的步骤,完成并不是说为微信收到钱就可以了,还需要通知相关业务系统完成到款后的后续操作。
支付结果通知链接需要商户方提供,在统一下单接口中存在一个回调地址(notify_url),对应的就是此处微信通知的地址。需要注意,回调地址不能携带参数
不同支付方式的回调参数,类似统一下单,可以根据 **交易类型(trade_type)**区分。如果订单确认无误,需要返回微信指定的返回值
微信支付结果通知的返回值
注意:
1、同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
2、后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起多次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h – 总计 24h4m),但微信不保证通知最终一定能成功。
3、在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付【查询订单API】确认订单状态。
特别提醒:
1、商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
2、当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
3、技术人员可登进微信商户后台扫描加入接口报警群,获取接口告警信息(有一个无情的告警机器人发相关信息)。
JSAPI支付
根据图片上的简短提示信息,可以知道,主要是通过在微信浏览器中调用内置方法来实现按来实现的接入方式。
下单参数中:
trade_type – JSAPI
JSAPI接入时序图
Native支付
可以简单理解为二维码支付,下单成功之后可以获取到一个微信协议的链接,如:weixin://wxpay/bizpayurl?sr=123456
,然后自行生成二维码,让用户通过微信扫码识别。
二维码背景知识介绍:
下单参数中:
trade_type – NATIVE
NATIVE支付时序图
APP支付
下单参数中:
trade_type – APP
APP交互时序图
H5支付
在微信浏览器以外的手机浏览器中请求为微信支付的场景唤起支付。下单成功之后,微信会返回一条链接,通过
下单参数中:
trade_type – JSAPI
scene_info – 必填
H5交互时序图
问题
1. 商家参数格式有误
这种情况会有两种可能:
- 商户没有设置H5的授权域名
- 拉起H5支付的refer为空,可考虑通过一个中转页跳过去,如果是APP里面,可以在webview中手动设置