> 文档中心 > 微信Native支付接入教程(2022简洁版)

微信Native支付接入教程(2022简洁版)


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();    }  }  

 简单单五步搞定微信支付,不懂的可以评论区留言,我会一一回复。

喜欢我的文章作品的话,记得点赞加收藏哈!,我会定时更新的。。