Java接入微信支付ApiV3详细教程

1.申请商户API证书

APIv2 中,调用微信支付安全级别较高的接口(如:退款、企业红包、企业付款)

APIv3 中,调用微信支付所有接口

2.商户申请商户API证书时,会生成商户私钥,并保存在本地证书文件夹的文件apiclient_key.pem 中。私钥也可以通过工具从商户的p12证书中导出。请妥善保管好你的商户私钥文件。

3.平台证书

微信支付平台证书是指由微信支付 负责申请的,包含微信支付平台标识、公钥信息的证书。商户可以使用平台证书中的公钥进行验签。

微信支付平台证书请调用“获取平台证书接口” 获取。

4.签名生成

微信支付API v3 要求商户对请求进行签名。微信支付会在收到请求后进行签名的验证。如果签名验证不通过,微信支付API v3将会拒绝处理请求,并返回401 Unauthorized

4.1.0准备

商户需要拥有一个微信支付商户号,并通过超级管理员账号登录商户平台,获取商户API证书。 商户API证书的压缩包中包含了签名必需的私钥和商户证书。

5构造签名串

签名串一共有五行,每一行为一个参数。行尾以 \n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n

HTTP请求方法\n

URL\n 请求时间戳\n

请求随机串\n

请求报文主体\n

  • 请求方法为GET时,报文主体为空。
  • 当请求方法为POST或PUT时,请使用真实发送的JSON报文。
  • 图片上传API,请使用meta对应的JSON报文。

对于下载证书的接口来说,请求报文主体是一个空串

6.计算签名值

绝大多数编程语言提供的签名函数支持对签名数据进行签名。强烈建议商户调用该类函数,使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值。

7.设置HTTP头

微信支付商户API v3要求请求通过HTTP Authorization头来传递签名。 Authorization认证类型签名信息两个部分组成。

.认证类型,目前为WECHATPAY2-SHA256-RSA2048

2.签名信息

注:以上五项签名信息,无顺序要求。

  • 发起请求的商户(包括直连商户、服务商或渠道商)的商户号 mchid
  • 商户API证书序列号serial_no,用于声明所使用的证书
  • 请求随机串nonce_str
  • 时间戳timestamp
  • 签名值signature

Authorization 头的示例如下:(注意,示例因为排版可能存在换行,实际数据应在一行)

Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900009191",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"

8.演示代码 (JAVA)

import okhttp3.HttpUrl; 
import java.security.Signature; 
import java.util.Base64; 
// Authorization: <schema> <token>
 // GET - getToken("GET", httpurl, "")
 // POST - getToken("POST", httpurl, json) 
String schema = "WECHATPAY2-SHA256-RSA2048";
 HttpUrl httpurl = HttpUrl.parse(url); 
String getToken(String method, HttpUrl url, String body) {
 String nonceStr = "your nonce string"; 
long timestamp = System.currentTimeMillis() / 1000;
 String message = buildMessage(method, url, timestamp, nonceStr, body); 
 String signature = sign(message.getBytes("utf-8")); 
return "mchid=\"" + yourMerchantId + "\"," + "nonce_str=\"" + nonceStr + "\"," + "timestamp=\"" + timestamp + "\"," + "serial_no=\"" + yourCertificateSerialNo + "\"," + "signature=\"" + signature + "\""; 
} 
String sign(byte[] message) { 
Signature sign = Signature.getInstance("SHA256withRSA"); 
sign.initSign(yourPrivateKey); 
sign.update(message); return Base64.getEncoder().encodeToString(sign.sign()); 
} 
String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) { 
String canonicalUrl = url.encodedPath(); 
if (url.encodedQuery() != null) { 
canonicalUrl += "?" + url.encodedQuery(); } 
return method + "\n" + canonicalUrl + "\n" + timestamp + "\n" + nonceStr + "\n" + body + "\n"; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值