概述
Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。详情见开发文档。
前期准备
- 注册微信支付商户号,获取商户号 mch_id、key;
- 申请微信认证的服务号、政府或媒体类订阅号、小程序、APP、企业微信其中之一,并与商户号绑定。获取 appid。
开发步骤
Native支付可分为两种模式,商户根据支付场景选择相应模式。本文仅介绍模式二。
业务流程时序图
业务流程说明:
(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。
统一下单
SDK
API 详见统一下单API。
下载官方 SDK ,或通过 maven 获取依赖。推荐使用后者。
<!-- wxpay-sdk -->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
SDK 中集成了一个 WXPayConfig.java 的接口,我们需要写一个实现类,存放配置信息。
public class WXPayConfigImpl implements WXPayConfig {
// 设置证书,没有的话注释掉
// private byte[] certData;
// public WXPayConfigImpl() throws Exception {
// String certPath = "/path/to/apiclient_cert.p12";
// File file = new File(certPath);
// InputStream certStream = new FileInputStream(file);
// this.certData = new byte[(int) file.length()];
// certStream.read(this.certData);
// certStream.close();
// }
// set appid
public static void setAppId(String appId) {
WXPayConfigImpl.appId = "";
}
// set mch_id
public static void setMchId(String mchId) {
WXPayConfigImpl.mchId = "";
}
// set key
public static void setKey(String key) {
WXPayConfigImpl.key = "";
}
public InputStream getCertStream() {
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
// 异步通知地址
public String getNotifyUrl() {
return "http://www.xxx.com/wxNotify";
}
public int getHttpConnectTimeoutMs() {
return 8000;
}
public int getHttpReadTimeoutMs() {
return 10000;
}
// IWXPayDomain getWXPayDomain() {
// return null;
// }
}