相关文章
1、介绍
微信有多种支付产品,如付款码支付、公众号支付、H5 支付、小程序支付、Native 支付、APP 支付等。其中公众号支付、小程序支付最为常用。
微信官方产品介绍
微信支付接入有两种模式:
- 直联模式:对接微信官方接口
- 间联模式:通过第三方支付公司,费率低、支持灵活结算。
2、微信直联接入准备
2.1、域名
准备一个域名,必须要有 https 证书,并且 icp 备案了。
2.2、微信公众号
-
申请微信公众号
公众号分为服务号与订阅号。一定要申请服务号,订阅号不支持支付,个人不支持申请服务号。 -
微信认证
微信公众号需要微信认证,才能使用支付相关的功能。微信认证服务审核费300元/次/年。 -
获取AppId与AppSecret
AppId、AppSecret为微信公众号的开发者ID与密钥,获取微信openId需要用到。 -
配置网页授权域名
获取微信openId需要配置网页授权域名。
-
开发者需要先到公众平台官网中的 设置与开发 => 公众号设置 => 功能设置 => 网页授权域名 的配置选项中,修改网页授权域名;
-
填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
-
授权回调域名配置规范为全域名,比如需要网页授权的域名为:
www.qq.com
,配置以后此域名下面的页面http://www.qq.com/music.html
、http://www.qq.com/login.html
都可以进行OAuth2.0鉴权。但http://pay.qq.com
、http://music.qq.com
、http://qq.com
无法进行OAuth2.0鉴权。如何配置下载文件,可参考此链接 微信公众号网页授权域名设置 。
2.3、微信商户
2.3.1、申请微信商户
接入微信支付,需要申请一个微信商户。
申请微信商户
2.3.2、设置支付授权目录
- 支付授权目录说明
-
普通商户最后请求拉起微信支付收银台的页面地址我们称之为“支付授权目录”,例如:
https://www.weixin.com/pay.php
的支付授权目录为:https://www.weixin.com/
。 -
普通商户实际的支付授权目录必须和在微信支付商户平台设置的一致,否则会报错“当前页面的URL未注册:”。
-
支付授权目录设置说明
登录【微信支付商户平台—>产品中心—>开发配置】,设置后一般5分钟内生效。
-
支付授权目录校验规则说明
- 如果支付授权目录设置为顶级域名(例如:
https://www.weixin.com/
),那么只校验顶级域名,不校验后缀; - 如果支付授权目录设置为多级目录,就会进行全匹配,例如设置支付授权目录为
https://www.weixin.com/abc/123/
,则实际请求页面目录不能为https://www.weixin.com/abc/
,也不能为https://www.weixin.com/abc/123/pay/
,必须为https://www.weixin.com/abc/123/
。
3、微信直联技术对接
业务流程图
重点步骤说明:
步骤3 用户下单发起支付,商户可通过 JSAPI下单 创建支付订单。
步骤8 商户可在微信浏览器内通过 JSAPI调起支付API 调起微信支付,发起支付请求。
步骤15 用户支付成功后,商户可接收到微信支付支付结果通知支付结果通知API 。
步骤20 商户在没有接收到微信支付结果通知的情况下需要主动调用查询订单API 查询支付结果。
4、获取微信用户OpenID
5、Java接入
5.1、java demo下载(包含直联、间联)
5.1、微信直联Java代码
这里只提供下单的测试代码,订单查询、退款、回调等相关代码,请查看java demo。
5.1.1、maven引用
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.15</version>
</dependency>
5.1.2、测试类
import com.alibaba.fastjson.JSON;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAPublicKeyConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.payments.jsapi.model.Amount;
import com.wechat.pay.java.service.payments.jsapi.model.Payer;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
import org.junit.Test;
/**
* 微信直联测试
*/
public class WechatDirectTest {
//微信JSAPI测试
@Test
public void jsapi(){
Config config = getWechatConfig();
// 构建service
JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build();
PrepayRequest request = new PrepayRequest();
Amount amount = new Amount();
//金额转分
amount.setTotal(1);
request.setAmount(amount);
request.setAppid("公众号或小程序appId");
Payer payer = new Payer();
payer.setOpenid("用户openId");
request.setPayer(payer);
request.setMchid("微信商户号");
// 设置订单标题
request.setDescription("测试");
// 设置商户订单号
request.setOutTradeNo(System.currentTimeMillis() + "");
String label = "微信-JSAPI下单接口";
try {
System.out.println(label + " 请求参数:" + JSON.toJSONString(request));
// 调用下单方法,得到应答
PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);
System.out.println(label + " 返回参数:" + JSON.toJSONString(response));
} catch (Exception e) { // 发送HTTP请求失败
System.err.println(e);
}
}
/**
* 初始化商户配置
*/
private Config getWechatConfig(){
//使用微信新的公钥模式(新入网的,强制使用这种模式)
RSAPublicKeyConfig.Builder builder = new RSAPublicKeyConfig.Builder()
.merchantId("") //微信商户号
.publicKeyId("") //微信公钥ID
.publicKeyFromPath("") //微信公钥证书路径
.merchantSerialNumber("") //微信证书序列号
.privateKeyFromPath("") //微信私钥证书路径
.apiV3Key(""); //微信API V3密钥
return builder.build();
}
}