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

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT施sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值