一篇文章讲明白微信支付,适合第一次接通微信支付的同学

一篇文章讲明白微信支付,适合第一次接通微信支付的同学

微信的支付文档,看似很全,实际则特别分散,可能在公司里经常微信支付的工具类有和相关参数已经有人告知并且写好了,大部分同学尽管调用就可以了,但是对于刚上手想0-1接通微信支付,还是有很多困难的。这篇文章一次性讲清v3版本的API支付

1.maven依赖

<dependency>
     <groupId>com.github.wechatpay-apiv3</groupId>
     <artifactId>wechatpay-java</artifactId>
     <version>0.2.6</version>
</dependency>  
复制代码

2.微信支付基本参数解释

1.MACHID:微信支付商户号,参数经常也表示为merchantId

2.privateKeyPath:商户API证书的路径(文章下面会细讲API证书)

3.API_SERIAL_NO:也被称作merchantSerialNumber,是API证书的序列号(下面会细讲怎么获得)

4.certPath:wechatPayCertificatesFromPath()方法需要的参数,可以理解为微信支付平台证书,这个和API证书是不一样的

5.callback_url:微信支付回调咱们系统的接口地址,回调接口会返回用户的支付结果,具体看微信的回调接口文档

6.APPID:这个指微信公众号或者小程序的appid,微信支付必须要有公众号或者小程序(目前必须是这样的)

简单介绍完这些参数后,开始详细解释这些参数是从哪里获取的

1.MACHID

2.privateKeyPath:管理证书,根据提示操作即可,具体参考:微信API证书及其密钥

根据上述操作生成证书,下载到本地是一个证书压缩包,解压后,压缩包里面的内容是这样的:

public static final String privateKeyPath = "/Users/camel/cert/1610157505_20230310_cert/apiclient_key.pem";//API证书密钥路径,指的就是这个证书里的apiclient_key.pem路径
复制代码

3.商户证书序列号的获取

public static final String API_SERIAL_NO = "xxxxxxxxxxC9203xxxxxx6C632";
复制代码

账户中心--->API安全--->管理证书页,可以看到证书的序列号,或者访问证书解析网站:https://myssl.com/cert_decode.html ,上传文件选择图3中的apiclient_cert.pem证书

4.微信平台证书生成

 public static final String certPath = "/Users/camel/cert/1610157505_20230310_cert/file/wechatpay_5A4BE90F6551D7F8CD853CB65016E005237849E9.pem";
复制代码

•下载微信支付平台证书方法微信支付平台证书下载工具微信支付平台证书下载工具说明:在这里下载 CertificateDownloader.jar 文件,按照里面的文档操作即可

•注意:我的操作说明,我是把下载好的 CertificateDownloader.jar 文件,放在了解压证书的目录里(图3)。这样我取mchPrivateKeyFilePath这个值的时候就可以直接写证书文件名,不用写路径了。

官方完整命令如:

java -jar CertificateDownloader.jar -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath} -c ${wechatpayCertificateFilePath}
复制代码

我的实际操作命令如下:就会生成图3中多出来的file文件夹,/Users/camel/cert/1610157505_20230310_cert/file/wechatpay_5A4BE90F6551D7F8CD853CB65016E005237849E9.pem,wechatpay_5A4BE90F6551D7F8CD853CB65016E005237849E9.pem就是微信支付平台证书,也是程序真正需要的

java -jar CertificateDownloader.jar -k YUCONG12340924834535984954958948 -m 1610157505 -f apiclient_key.pem -s 6217F9226ABFACF3B183E6C9203475E3A446C632 -o file
复制代码

5.callback_url,微信支付结果的回调地址配置地方:

至此,微信支付的相关底层参数介绍完毕

6.以二维码支付为例,测试demo如下

  //下面的静态参数要仔细看下面的解释,否则只会调用别人写好的方法,压根学不会0-1接入微信支付
    public static final String MACHID = "1610xxxx";
    public static final String APPID = "wx9aa9xxx7fxxxxxx";
    public static final String API_SERIAL_NO = "xxxxxxxxxxC9203xxxxxx6C632";
    public static final String privateKeyPath = "/Users/camel/cert/1610157505_20230310_cert/apiclient_key.pem";
    public static final String certPath = "/Users/camel/cert/1610157505_20230310_cert/file/wechatpay_5A4BE90F6551D7F8CD853CB65016E005237849E9.pem";
    public static final String callback_url = "https://xxxxxx.com/wx/callback";

public static void main(String[] args) {
        try {
            // 初始化商户配置,在实际业务中,config最好全局变量创建一次就好,频繁创建config会报异常
            RSAConfig config = new RSAConfig.Builder()
                    .merchantId(MACHID)
                    // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
                    .privateKeyFromPath(privateKeyPath)
                    .merchantSerialNumber(API_SERIAL_NO)
                    .wechatPayCertificatesFromPath(certPath)
                    .build();
            // 初始化服务
            NativePayService service = new NativePayService.Builder().config(config).build();
            String orderNumber = IdGeneratorUtils.genDateUniqueId("MA", 16);
            log.info("orderNumber={}", orderNumber);
            PrepayRequest request = new PrepayRequest();
            Amount amount = new Amount();
            amount.setCurrency("CNY");
            amount.setTotal(1);
            request.setAmount(amount);
            request.setDescription("测试下单001");
            request.setOutTradeNo(orderNumber);
            request.setNotifyUrl(callback_url);
            request.setAppid(APPID);
            request.setMchid(MACHID);
            PrepayResponse response=service.prepay(request);
            log.info("result={}", JsonTools.object2Json(response));
        } catch (HttpException e) { // 发送HTTP请求失败
            log.error("1111111={}", e);
            // 调用e.getHttpRequest()获取请求打印日志或上报监控,更多方法见HttpException定义
        } catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500
            log.error("222222222={}", e.getResponseBody());
            // 调用e.getResponseBody()获取返回体打印日志或上报监控,更多方法见ServiceException定义
        } catch (MalformedMessageException e) { // 服务返回成功,返回体类型不合法,或者解析返回体失败
            log.error("3333333333={}", e);
            
            // 调用e.getMessage()获取信息打印日志或上报监控,更多方法见MalformedMessageException定义
        } catch (Exception e) {
            log.error("未知异常:{}", e);
        }


    }
复制代码

上述简单的代码,就可以实现微信的预下单,response会返回二维码的微信链接(咱们需要用第三方二维码工具,将微信链接转成二维码),response返回结果如下:

{
  "code_url": "weixin://wxpay/bizpayurl?pr=AQAsbYzzz"
}
//需要用第三方二维码生成工具weixin://wxpay/bizpayurl?pr=AQAsbYzzz生成二维码,在此不做赘述,生成的二维码文件返回给前端,或者前端根据code_url生成二维码展示到页面上,然后就可以扫码支付了
复制代码

更多丰富的支付逻辑基本都和这个差不多,可以参考下边demo

微信支付SDK DEMO

 

至此,微信支付结束,希望能帮到大家

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章