本文以微信统一支付接口模式二来进行开发
模式二与模式一相比,流程更为简单,不依赖设置的回调支付URL。商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时(也可以根据统一支付接口内提供的定义订单有效期字段进行自定义设置,但是最好不要超过微信定义的这个两小时有效期),过期后扫码不能再发起支付(再次扫描二维码时会弹出提示,订单已过期)。
业务流程时序图
业务流程说明:
(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。
根据微信官方提供的调用时序图可以看出模式二的接口需要调用微信API接口中的【统一下单API】和【查询订单API】两个接口就可以完成扫描支付这一动作。以下详细讲解这两个接口的实现步骤以及其中的坑
首先微信官方提供了接口如何调用的demo
demo下载链接:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
可以根据自己使用的开发语言下载对应的demo进行调试。我使用的是java所以下载的就是java对应的demo。
下载的demo如下图
demo导入Intellj后可以根据自己的需求进行项目目录的拆分,下面是我以springBoot项目进行拆分的目录
开发步骤:
首先根据官方示例继承WXPayConfig生成我们自己的配置文件
官方抽象类(根据自己的项目改造,下面是我改造之后的官方类):
package start.com.github.wxpay.sdk;
import java.io.InputStream;
public abstract class WXPayConfig {
/**
* 获取商户证书内容
*
* @return 商户证书内容
*/
public abstract InputStream getCertStream();
/**
* HTTP(S) 连接超时时间,单位毫秒
*
* @return
*/
public int getHttpConnectTimeoutMs() {
return 6*1000;
}
/**
* HTTP(S) 读数据超时时间,单位毫秒
*
* @return
*/
public int getHttpReadTimeoutMs() {
return 8*1000;
}
/**
* 获取WXPayDomain, 用于多域名容灾自动切换
* @return
*/
public abstract IWXPayDomain getWXPayDomain();
/**
* 是否自动上报。
* 若要关闭自动上报,子类中实现该函数返回 false