PC网站接入支付
微信支付支持完成域名ICP备案的网站接入支付功能。PC网站接入支付后,可以通过JSAPI支付或Native支付,自行开发生成二维码,用户使用微信“扫一扫”来完成支付。本次讲解Native支付的快捷接入教程。
接入文档网站:PC网站 - 微信支付接入指引 - 微信支付商户平台
一、简介
Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。
应用场景
Native支付适用于PC网站、实体店单品或订单、媒体广告支付等场景
用户扫描商户展示在各种场景的二维码进行支付,具体操作流程如下:
步骤一 商户根据微信支付的规则,为不同商品生成不同的二维码(如图3.1),展示在各种场景,用于用户扫描购买。
步骤二 用户使用微信“扫一扫”(如图3.2)扫描二维码后,获取商品支付信息,引导用户完成支付(如图3.3)。
步骤三 用户确认支付,输入支付密码(如图3.4)。
步骤四 支付完成后会提示用户支付成功(如图3.5),商户后台得到支付成功的通知,然后进行发货处理。
二、接入微信支付前需要准备的参数
appid 微信公众号、小程序、app或开放平台的唯一标识;mchid 微信支付分配的商户收款账号;mchSerialNo:商户证书序列号; privateKey 私钥文件
apiKey3 交易过程生成签名的apiv3密钥;
三、java版本代码实现步骤
1、初始化httpClient
public CloseableHttpClient httpClient(){
String keyPath = WChantPay.keyPath;
String mchid = WChantPay.mchid;
String mchSerialNo = WChantPay.mchSerialNo;
String apiKey3 = WChantPay.apiKey3;
try{
// 加载商户私钥(privateKey:私钥字符串)
//示例:私钥存储在文件
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
new FileInputStream("C:\\Users\\Administrator\\Desktop\\1626431593_20220528_cert\\apiclient_key.pem"));
//PrivateKey merchantPrivateKey = PemUtil
// .loadPrivateKey(new ByteArrayInputStream(keyPath.getBytes("utf-8")));
// 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(mchid, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),
apiKey3.getBytes("utf-8"));
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(mchid, mchSerialNo, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier));
// 初始化httpClient
CloseableHttpClient httpC = builder.build();
return httpC;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
2、Native下单
public String CreateOrder() throws Exception{
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/native");
// 请求body参数
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode rootNode = objectMapper.createObjectNode();
//商户id
rootNode.put("mchid", WChantPay.mchid)
//小程序id
.put("appid", WChantPay.appid)
//描述
.put("description", "wudehua")
//微信通知回调地址
.put("notify_url", "http://119.29.28.29/")
//商户订单id
.put("out_trade_no", "12345671");
//如果前端直接传的是分此处不需要再转
//int round = Math.round(wxpayDetail.getTotal() * 100);
rootNode.putObject("amount")
//支付金额,单位是(分)
.put("total", 10);
objectMapper.writeValue(bos, rootNode);
httpPost.addHeader("Accept", "application/json");
httpPost.addHeader("Content-type","application/json; charset=utf-8");
httpPost.setEntity(new StringEntity(bos.toString("UTF-8")));
//完成签名并执行请求
CloseableHttpResponse response = httpClient().execute(httpPost);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) { //处理成功
System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
return EntityUtils.toString(response.getEntity());
} else if (statusCode == 204) { //处理成功,无返回Body
System.out.println("success");
return null;
} else {
System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
throw new IOException("request failed");
}
} finally {
response.close();
}
}
3、【客户端】生成支付二维码
这一步在客户端实现,可以利用qrcode.js进行实现二维码的生成;
4、查询订单
public void QueryOrder() throws Exception {
//请求URL
URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/pay/transactions/id/4200000745202011093730578574");
uriBuilder.setParameter("mchid", mchId);
//完成签名并执行请求
HttpGet httpGet = new HttpGet(uriBuilder.build());
httpGet.addHeader("Accept", "application/json");
CloseableHttpResponse response = httpClient().execute(httpGet);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
} else if (statusCode == 204) {
System.out.println("success");
} else {
System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
throw new IOException("request failed");
}
} finally {
response.close();
}
}
5、关闭订单
public void CloseOrder() throws Exception {
//请求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/sdkphp12345678920201028112429/close");
//请求body参数
String reqdata ="{\"mchid\": \""+mchId+"\"}";
StringEntity entity = new StringEntity(reqdata,"utf-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpPost.setHeader("Accept", "application/json");
//完成签名并执行请求
CloseableHttpResponse response = httpClient().execute(httpPost);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
} else if (statusCode == 204) {
System.out.println("success");
} else {
System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
throw new IOException("request failed");
}
} finally {
response.close();
}
}
简单单五步搞定微信支付,不懂的可以评论区留言,我会一一回复。
喜欢我的文章作品的话,记得点赞加收藏哈!,我会定时更新的。。