啰嗦几句:微信支付v3版接口麻烦吗?在对接微信支付v3接口时,本来是一件很简单的事情,其实微信支付v3接口并不是很复杂,但是微信团队的管理很混乱,给我们开发者带来了巨大的麻烦。

微信支付v3版接口对接麻烦-问题出在了哪?

  • 其一:微信支付的版本较多,没有形成一个统一管理说明;
  • 其二:微信v3支付,没有一个完整的说明文档,文档都很分散;
  • 其三:微信支付官方文档看似很详细,其实很多关键点都没说明白,新手看着就很头疼;

下面详细的说一下微信支付v3接口的开发

这个版本整合微信官方文档,以微信小程序开发为基础,大家按步骤点开链接查看操作。

对接微信支付API v3

前提:商户号已注册好,准备就绪。
  • 接入前准备

    注意:操作过程中产生的APIv3秘钥记录下来,有的后面会用到。 例如 API v3秘钥:B3AQsC17C6UFooIRCAaXRUvaq8PInN60

    微信商户平台接入说明文档

    [微信商户平台](https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml)



    说明:这个是小程序版,如果是其他平台可以在左侧找对应目录

    注意:这个流程走下来你会拿到一个压缩文件类似下图



    图:这个压缩文件里有三个证书(解压后如下图),三个证书文件拷贝到你的开发平台里,使用方式继续往下看

  • 扫码进入商户平台的入口

    微信商户平台

    [微信商户平台](https://pay.weixin.qq.com)

    说明:使用管理者的微信扫码进入,进入后台根据上面的说明进行操作。如果没有注册可以直接走注册流程。注册流程这里不讲解。

  • 扫码小程序后台的入口

    微信小程序后台

    [微信小程序后台](https://mp.weixin.qq.com/)

    注意:如果没有申请小程序可以进入这里看怎么申请

    申请小程序说明

  • 小程序后台开通微信支付并绑定商户平台说明

    小程序后台开通微信支付并绑定商户平台说明

    [小程序后台开通微信支付并绑定商户平台说明](https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml)

    注意:查看说明中最后的【5.配置应用】进行操作

  • 获取商户API证书序列号(merchantSerialNumber)

    进入证书查看网站

    [进入证书查看网站](https://myssl.com/cert_decode.html)



    说明:上传证书文件:apiclient_cert.pem,点击查看证书,里面会有个序列号,复制出来。下载微信支付平台证书会用到。

    例如:

    证书序列号:54776TTTF8F77EXXX3641FAB5F940FII11C65347

  • 下载微信支付平台证书方法

    微信支付平台证书下载工具

    [微信支付平台证书下载工具](https://github.com/wechatpay-apiv3/CertificateDownloader)

    说明:在这里下载 CertificateDownloader.jar 文件,按照里面的文档操作即可

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

官方完整命令如:

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

我的操作例如:

java -jar CertificateDownloader.jar -k B3AQsC17C6UFooIRCAaXRUvaq8PInN60 -m 1901174254 -f apiclient_key.pem -s 54776TTTF8F77EXXX3641FAB5F940FII11C65347 -o file

注意:1.操作前 CertificateDownloader.jar 和 apiclient_key.pem 文件在同一个目录 。并且在这个目录中进入cmd命令工具。cmd命令工具中显示的目录就是CertificateDownloader.jar所在目录。

例如:

文件-CertificateDownloader.jar 路径:D:\WXCertUtil\cert\CertificateDownloader.jar
文件-apiclient_key.pem 路径:D:\WXCertUtil\cert\apiclient_key.pem
cmd中路径:D:\WXCertUtil\cert>

注意:2.命令中 -o file 只是个文件夹,命令执行后会在下面路径中生成一个微信支付平台证书文件。把这个证书也复制到你的平台中,和上面三个证书放在一个位置方便管理。

例如:

D:\WXCertUtil\cert\file\wechatpay_3A4AF69999DF01F39BB08C21C1C29B6AA17C074N.pem

至此,所有微信支付v3的准备工作已就绪,接下来,使用微信官方SDK开发接入微信支付v3。

Java平台接入微信支付v3接口

更多平台看官方文档

微信支付 APIv3 Java SDK

微信支付 APIv3 Java SDK,里面有详细说明

github 地址:https://github.com/wechatpay-apiv3/wechatpay-java

注意:开发可以根据这里的说明操作就好了,下面我写一下可能大家不理解的点。

com.github.wechatpay-apiv3:wechatpay-java

代码中的配置-例如:

  /** 商户号 */
public static String merchantId = "1901174254";
/** 商户API私钥路径 */
public static String privateKeyPath = "apiclient_key.pem";
/** 商户证书序列号 */
public static String merchantSerialNumber = "54776TTTF8F77EXXX3641FAB5F940FII11C65347";
/** 微信支付平台证书路径 */
public static String wechatPayCertificatePath = "wechatpay_3A4AF69999DF01F39BB08C21C1C29B6AA17C074N.pem";
/** 微信支付 APIv3 密钥 */
/** 如果微信支付平台证书,已经下载好了,apiV3Key 就不需要了 */
public static String apiV3Key = "B3AQsC17C6UFooIRCAaXRUvaq8PInN60";

如果微信支付平台证书,已经下载好了,github里这个代码就不用看了。

package com.wechat.pay.java.service;

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAConfig;
import com.wechat.pay.java.service.certificate.CertificateService;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.List; /** 下载微信支付平台证书为例 */
public class QuickStart { /** 商户号 */
public static String merchantId = "";
/** 商户API私钥路径 */
public static String privateKeyPath = "";
/** 商户证书序列号 */
public static String merchantSerialNumber = "";
/** 微信支付平台证书路径 */
public static String wechatPayCertificatePath = "";
/** 微信支付 APIv3 密钥 */
public static String apiV3Key = ""; public static void main(String[] args) {
Config config =
new RSAConfig.Builder()
.merchantId(merchantId)
.privateKeyFromPath(privateKeyPath)
.merchantSerialNumber(merchantSerialNumber)
.wechatPayCertificatesFromPath(wechatPayCertificatePath)
.build();
CertificateService certificateService = new CertificateService.Builder().config(config).build();
List<X509Certificate> certificates =
certificateService.downloadCertificate(apiV3Key.getBytes(StandardCharsets.UTF_8));
}
}

支付的第一步:微信支付前需要拿到预支付id(prepayId),才能支付,所有支付的第一步是预支付

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
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.PrepayResponse; public class JsapiExample {
public static void main(String[] args) {
Config config =
new RSAConfig.Builder()
.merchantId(merchantId)
.privateKeyFromPath(privateKeyPath)
.merchantSerialNumber(merchantSerialNumber)
.wechatPayCertificatesFromPath(wechatPayCertificatePath)
.build(); JsapiService service = new JsapiService.Builder().config(config).build(); PrepayRequest request = new PrepayRequest();
Amount amount = new Amount();
amount.setTotal(100);
request.setAmount(amount);
request.setAppid("wxa9d9651ae******");
request.setMchid("190000****");
request.setDescription("测试商品标题");
request.setNotifyUrl("https://notify_url");
request.setOutTradeNo("out_trade_no_001");
Payer payer = new Payer();
payer.setOpenid("oLTPCuN5a-nBD4rAL_fa********");
request.setPayer(payer); PrepayResponse response = service.prepay(request);
System.out.println(response.getPrepayId());
}
}

还需要知道的:微信平台给的用户openid,并不是一个用户的唯一ID,不能多个小程序同时使用。也就是说,在小程序A中拿到的用户openid 和 在小程序B中拿到的用户openid 是不一样的。

最新文章

  1. java web学习总结(二十六) -------------------JSP属性范围
  2. testng 教程之使用参数的一些tricks配合使用reportng
  3. mysql数据库的基本操作
  4. js 取得 Unix时间戳(Unix timestamp)
  5. 验证码在IE中不刷新
  6. 配置JDK和TOMCAT
  7. java调用.net asmx服务
  8. wireshark不仅仅是用来抓包分析网络的;
  9. 解析一下rtmp协议比较难懂的地方
  10. Problem G: Keywords Search
  11. 非root用户搭建hadoop伪分布式
  12. 包建强的培训课程(3):App竞品技术分析
  13. 仿豆瓣网(电脑版网页)HTML+CSS实现
  14. 浏览器根对象window之值为数值的属性
  15. Linux 最常用的20条命令
  16. mybatis-mysql小优化
  17. Popular Cows
  18. IOS开发学习笔记037-九宫格代码实现
  19. 解决ListView滑动时出现黑边的问题
  20. JavaScript 层

热门文章

  1. Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库
  2. Excelize 2.4.0 正式版发布, 新增 152 项公式函数支持
  3. MQ系列5:RocketMQ消息的发送模式
  4. spring项目中starter包的原理,以及自定义starter包的使用
  5. Order Siblings by 排序
  6. Docker安装Openresty总结
  7. 群晖-使用docker套件部署Prometheus+Grafana
  8. day38-IO流05
  9. Dapr 证书过期了怎么办? 别慌,有救!
  10. 微信小程序开发总结-怀庄酒业投票活动