WechatPay-API-v3接口规则

目录

1、官方文档

2、下面是Java 接入过程:

3、敏感信息加解密

4、demo参考

5、回调通知解密算法(AEAD_AES_256_GCM)


1、官方文档

https://wechatpay-api.gitbook.io/wechatpay-api-v3/

2、下面是Java 接入过程:

第一步: 阅读微信支付分给的接口规则 说明: https://wechatpay-api.gitbook.io/wechatpay-api-v3/

第二步: 微信支付API v3要用第三方CA的证书 所以涉及到 API证书升级

新接入商户请参考什么是API证书?如何获取API证书?。

已经接入并使用微信支付颁发证书的商户请参考微信支付API证书升级指引(技术人员)。
API v3已不支持使用微信支付颁发的证书。
商户升级API证书时,需要完成三个步骤:

①:商户号的超级管理员到商户平台升级证书,获取到权威CA颁发的API证书。 (查看指引)

②:超级管理员将权威CA颁发的API证书(共包含三个文件: 证书pkcs12格式、证书pem格式、证书密钥pem格式)转交给技术人员。

③:技术人员用新证书文件替换服务器上原微信支付颁发的API证书,无需对现有系统进行代码修改。

(注意)这里升级API证书不影响原有的 API 密钥 代码不需要做改动直接替换 apiclient_cert.p12文件即可

第三步: 拿到API证书和密钥文件.

第四步: 引入微信支付API v3的Apache HttpClient装饰器: GitHub 地址

​ 注意: 微信支付API v3的Apache HttpClient扩展,实现了请求签名的生成和应答签名的验证。如不想使用次封装客户端 可自己实现 签名和应答解密过程.

相关maven依赖

<dependency><groupId>com.xiaomi.wechatpay-apiv3</groupId><artifactId>wechatpay-apache-httpclient</artifactId><version>0.1.6</version>
</dependency>

第五步: 请求微信支付分API前准备

   //微信支付商户开通后 微信会提供appidpublic String appId;//微信支付商户开通后 微信会提供appSecretpublic String appSecret;//商户号public String mchId; //32位的api密钥,微信商户平台-账户设置-安全设置-api安全 密钥 用于拉起支付签名public String partnerkey;//openId 是微信用户针对公众号的标识,授权的部分这里不解释public String openId;//微信支付成功后异步通知地址 必须要求80端口并且地址不能带参数public String notifyUrl;//微信支付成功后同步通知地址 必须要求80端口并且地址不能带参数public String returnUrl;//证书apiclient_cert.p12文件位置 可加载public String certPath;//微信支付分 分配的服务 IDpublic String serviceId;//v3接口 CA证书 apiclient_key.pem私钥内容 public String privateKey;//v3接口 CA证书 apiclient_cert.pem证书内容public String certificate;// APIv3密钥 32 位public String AES_KEY = "xxx"; //商户证书序列号 CA证书 可查看微信商户平台-账户设置-安全设置-api安全密钥public String  MC_HSERIAL_NO = "xxxxx"; 

3、敏感信息加解密

https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/min-gan-xin-xi-jia-mi

使用AES-256-GCM,对回调中的关键信息进行加密保护

建议从Verifier中获得微信支付平台证书,或使用预先下载到本地的平台证书文件中

X509Certificate wechatpayCertificate = verifier.getValidCertificate();

privateKey 为 v3接口 CA证书 apiclient_key.pem私钥内容
将String类型的privateKey 转化为PrivateKey类型

PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));

4、demo参考

构建httpClient,需要设置微信支付平台证书。

CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, merchantPrivateKey).withWechatpay(wechatpayCertificates) // 加载证书.build();

在第一次下载平台证书时,按照下述方法临时"跳过”应答签名的验证

CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, merchantPrivateKey).withValidator(response -> true) // NOTE: 设置一个空的应答签名验证器,**不要**用在业务请求.build();

get请求

URIBuilder uriBuilder =   new URIBuilder(USER_SERVICE_STATE_URL);uriBuilder.setParameter("service_id", yourServiceIdxxx);uriBuilder.setParameter("appid", yourAppIdxxx);uriBuilder.setParameter("openid", userOpenIdxxx);
CloseableHttpResponse response=null;try {HttpGet httpGet = new HttpGet(uriBuilder.build());httpGet.addHeader("Accept", "application/json");// NOTE: 建议指定charset=utf-8。低于4.4.6版本的HttpCore,不能正确的设置字符集,可能导致签名错误response = getHttpDefaultClient().execute(httpGet);if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){String result = EntityUtils.toString(response.getEntity());// 返回json格式:return JSONObject.parseObject(result);}else {String result = EntityUtils.toString(response.getEntity());// 返回json格式:log.info("微信支付V3 url={} result={} responseEntity={}",uriBuilder.build(), result,JSON.toJSONString(response.getEntity()));}} catch (Exception e) {log.error("微信支付V3 请求url={}异常 ",uriBuilder.build());}finally {if(null!=response){response.close();}}

post请求

HttpPost httpPost = new HttpPost(PAYSCORE_PAYAFTER_ORDERS_URL);StringEntity reqEntity = new StringEntity(JSONObject.toJSONString(payAfterOrdersModel), ContentType.create("application/json", "utf-8"));httpPost.setEntity(reqEntity);httpPost.addHeader("Accept", "application/json");httpPost.addHeader("Content-Type", "application/json");CloseableHttpResponse response = httpClient.execute(httpPost);try {if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){String result = EntityUtils.toString(response.getEntity());// 返回json格式:log.info("微信支付V3 url={} result={} ",url,result);return JSONObject.parseObject(result);}else {String result = EntityUtils.toString(response.getEntity());// 返回json格式:log.info("微信支付V3 url={} result={} response.getEntity()={}",url,result,JSON.toJSONString(response.getEntity()));}} catch (Exception e) {log.error("微信支付V3 请求url={} 参数={} 异常 e={}",url, JSON.toJSONString(json),e.getMessage());}finally {response.close();}

官方DEMO参考: https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient/blob/master/src/test/java/com/wechat/pay/contrib/apache/httpclient/HttpClientBuilderTest.java

5、回调通知解密算法(AEAD_AES_256_GCM)

我们已一个实际接口为例,进行讲解:

下面我们对resource部分进行解密,解密算法如下:

package com.wsw.sdk.utils;import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;public class WxAPIV3AesUtil {static final int KEY_LENGTH_BYTE = 32;static final int TAG_LENGTH_BIT = 128;private final byte[] aesKey;public WxAPIV3AesUtil(byte[] key) {if (key.length != KEY_LENGTH_BYTE) {throw new IllegalArgumentException("无效的ApiV3Key,长度必须为32个字节");}this.aesKey = key;}public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)throws GeneralSecurityException, IOException {try {Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");SecretKeySpec key = new SecretKeySpec(aesKey, "AES");GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);cipher.init(Cipher.DECRYPT_MODE, key, spec);cipher.updateAAD(associatedData);return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8");} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {throw new IllegalStateException(e);} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {throw new IllegalArgumentException(e);}}
}

调用示例:

//解密回调信息byte[] key = SystemConst.WX_KEY.getBytes("UTF-8");WxAPIV3AesUtil aesUtil = new WxAPIV3AesUtil(key);String decryptToString = aesUtil.decryptToString(assc.getBytes("UTF-8"),noce.getBytes("UTF-8"),cip);

WechatPay-API-v3接口规则相关推荐

  1. 微信支付API v3接口使用应用篇

    目录 前言 版本 应用 基础配置 1.申请商户API证书 2.设置接口密钥 3.下载平台证书 接口实测 微信支付API官方客户端 1.客户端 2.支付调起参数签名 3.回调通知 参考资料 前言 最近新 ...

  2. 微信实现APP下单接口(微信支付开发API V3接口调用)

    准备工作 : 有微信商户平台 : mchid:微信商户id appid:商户appid 商户证书:商户可登录微信商户平台,在[账户中心]->[API安全]目录下载证书 证书文件名 :apicli ...

  3. 一文搞懂「微信支付 Api-v3」接口规则所有知识点

    文章目录 简介 v2 与 v3 的区别 API 密钥设置 获取 API 证书 请求签名 示例代码 构造签名串 构造 HTTP 头中的 Authorization 获取证书序列号 通过工具获取 通过代码 ...

  4. 微信API v3踏坑记录

    最近对接微信认证,使用到了wechatpay api v3 相较于之前微信支付API,主要区别是: 遵循统一的Restful的设计风格 使用JSON作为数据交互的格式,不再使用XML 使用基于非对称密 ...

  5. NodeJS 基于API v3 实现微信小程序的支付

    前提 在微信商户平台成为商家,按照官网的文档进行配置,弄好下载证书,将证书复制到后端的项目上 实现过程 GitHub - yangfuhe/node-wxpay: 微信支付APIv3 for node ...

  6. 微信Native下单API v3 回调接口解密

    微信支付通过支付通知接口将用户支付成功消息通知给商户. 目录 一.定义个回调通知方法 二.官方提供的AES解密工具 三.调用工具类解密加密数据 四.值得注意的一些问题 接口说明 请求方式:POST 回 ...

  7. 微信支付API V3版本JAVA开发指南

    微信支付版本V3的Demo,在官方上下载下来,压根就是不能直接用的东西,你要想学会用,你就得一层一层的看源码,看文档,要求你事无巨细的做一个接入者. 如果接入API需要让人看源码来理解,我觉得是一件让 ...

  8. Google Maps JavaScript API V3 叠加层

    注意:以下网页中提到的 Google Maps JavaScript API 第 3 版现在是正式的 JavaScript API 版本.该 API 的第 2 版已根据我们的弃用政策正式弃用.欢迎您将 ...

  9. Google Maps JavaScript API V3的使用(四)

    Google Maps JavaScript API V3 叠加层 叠加层概述 叠加层是地图上与纬度/经度坐标绑定的对象,会随您拖动或缩放地图而移动.叠加层表示的是"添加"到地图中 ...

最新文章

  1. 这份GitHub 2.3k星的ML论文清单拿好,工作用得上
  2. JSP(1)—基础知识
  3. 前端 <table><td><tr><th>
  4. c语言字体属性,【C】 5_变量属性
  5. Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
  6. IIS6架设网站常见问题及症状答疑
  7. 云服务器ecs_阿里云ECS云服务器抢占式实例计费模式优缺点
  8. QString、QByteArray 相互转换、和16进制与asc2转换
  9. 洛谷P1018乘积最大——区间DP
  10. 【Window】使用技巧
  11. PHP根据开始、结束时间:计算开始、结束时间占当月总天数的百分比
  12. 如何强制升级索尼sony tablet s android 4.0,【S丶Tablet】教你root Tablet S 4.0.3 R5
  13. 3.PS 缩小放大、移动、选区工具
  14. 评估电源质量20M带宽限制的问题
  15. 重读经典:《The Craft of Research(1)》
  16. 角度前方交会点坐标计算完整步骤
  17. AHRS算法代码:磁力计+加计+陀螺版
  18. time_t和SYSTEMTIME之间的相互转换 【转】
  19. 听书 app,学习用途
  20. C语言作用域(可见性)和生存期

热门文章

  1. jQuery Text-to-Speech 谷歌在线语音
  2. 终于解决win7下部分软件乱码的问题
  3. 台式计算机软件打不开,电脑打开软件显示乱码的解决方法 电脑点击软件没反应怎么办...
  4. html css 布局_创建有吸引力HTML CSS动漫主题网站布局
  5. 西瓜播放器xgplayer设置自动播放
  6. PCB LAYOUT高速信号走线指南
  7. 小饶学编程之JAVA SE第一部分——二分查找法
  8. 深入理解 Mysql 锁
  9. lsdyna如何设置set中的node_list_为 Windows PowerShell 设置 User Alias (命令别名)
  10. HEAAN源码(二)