一、主要参数:
交易类型,货币类型,时间,时间戳,商户订单号,交易金额
支付模式:
(1)付款码支付---用户展示付款码
(2)Native支付---商户生成支付二维码
(3)JSAPI支付---在微信中打开H5,唤起支付
(4)APP支付---第三方APP直接调用SDK支付
(5)H5支付---通过浏览器唤起微信支付
(6)小程序支付---在小程序中只能使用此方式
二、基础配置
appid,appsecret 微信公众号或开放平台的唯一标识
mch_id 微信支付分配的商户收款账号
key 交易过程生成签名的密钥
三、调用要求
(1)使用HTTPS,使用API证书:apiclient_cert.p12是商户证书文件
(2)请求和接收数据均需要校验签名
(3)必须严格按照API的说明进行一单一支付,一单一红包,一单一付款,在未得到支付系统明确的回复之前不要换单,防止重复支付或者重复付款
(4)先判断协议字段返回,再判断业务返回,最后判断交易状态
交易成功判断条件: return_code、result_code和trade_state都为SUCCESS
返回状态码(return_code) 此字段是通信标识,非交易标识,交易是否成功需要查看trade_state来判断
业务结果(result_code)
交易状态(trade_state)
SUCCESS--支付成功 REFUND--转入退款 NOTPAY--未支付 CLOSED--已关闭
REVOKED--已撤销(刷卡支付) USERPAYING--用户支付中
PAYERROR--支付失败(其他原因,如银行返回失败) ACCEPT--已接收,等待扣款
四、主要交互
A.商户端调用统一下单接口请求订单(支付订单)
pay/unifiedorder 统一下单
先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后,生成交易串调起支付
B.商户端调起微信支付,发起支付请求
pay/closeorder 关闭订单
商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;
系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口
C.商户端接收支付通知
notify_url 支付通知回调地址
(1)notify_url的代码处理逻辑不能做登录态校验。
该链接是通过【统一下单API】中提交的参数notify_url设置。通知url必须为直接可访问的url,不能携带参数。公网域名必须为https
(2)商户系统收到支付结果通知,需要在5秒内返回应答报文,否则微信支付认为通知失败,后续会重复发送通知。
支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。
(3)同样的通知可能会多次发送给商户系统,商户系统必须能够正确处理重复的通知。如果已处理过,直接给微信支付返回成功。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,密钥尽可能提高通知的成功率,但微信不保证通知最终能成功(通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)。
(4)商户侧对微信支付回调IP有防火墙策略限制的,需要对以下IP段开通白名单
幂等性处理
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
D.商户端查询支付结果
pay/orderquery 所有微信支付订单的查询,支付异常时(未收到支付通知或其他直接异常)
pay/refundquery 提交退款申请后,通过调用该接口查询退款状态
五、退款
pay/refund 申请退款
当商户申请的退款有结果后(退款状态为:退款成功、退款关闭、退款异常),微信会把相关结果发送给商户,商户需要接收处理,并返回应答。
特别说明:退款结果对重要的数据进行了加密,商户需要用商户密钥进行解密后才能获得结果通知的内容在申请退款接口中上传参数“notify_url”以开通该功能。如果链接无法访问,商户将无法接收到微信通知。通知url必须为直接可访问的url,不能携带参数。公网域名必须为https
六、完整流程示例
商户系统商品订单 和 微信支付系统支付订单
Part-A 商户系统下单,并创建预付单
1.平台下单,发起支付 点击商户系统立即购买按钮
2.生成平台订单
3.请求下单接口,创建订单
4.生成预付单
5.返回预付单标识
6.生成带签名支付信息
Part-B 发起支付,输入密码,完成支付
7.发起支付 点击商户系统支付按钮
8.调起微信支付 弹出支付框
9.发起支付请求
10.验证支付授权权限
11.返回支付授权
12.确认支付,输入密码 用户输入支付密码并确定
13.提交授权
14.验证授权
Part-C 通知商户,反馈结果,发送支付凭证消息
15.异步通知平台支付结果 支付完成,商户系统等待支付系统通知
16.报错支付通知
17.返回告知成功接收处理 商户系统处理完成,并通知支付系统
18.返回支付结果,并发微信消息提醒
Part-D 商户展示支付结果
19.支付状态查询
20.调用查单接口,查询支付结果
21.返回支付结果
22.展示支付信息