1、微信公众号接口认证方案
1.1 认证流程
1)官方配置Token验证
- Token不在网络中传递
2)开发一个Token验证接口
- Token及其它参数拼接并字典排序再做sha摘要计算
- 微信定期调用此接口来验证身份正确性
- 通过摘要验证判断请求来源微信(Token配置在微信平台,固而判断来源)
3)通过appid secret获取access_token
4)所有业务URL直接拼接access_token
5)针对报文安全可以设置加密模式,使用在平台配置的AESkey进行加密
1.2 参考代码
以下是官方提供的php demo
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
以下是chatgpt直接把php转成java的代码:
private boolean checkSignature() {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String token = TOKEN;
String[] tmpArr = {token, timestamp, nonce};
Arrays.sort(tmpArr);
String tmpStr = String.join("", tmpArr);
tmpStr = sha1(tmpStr);
if (tmpStr.equals(signature)) {
return true;
} else {
return false;
}
}
https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
1.3 小结
微信公众号接口认证方案即是基于oauth2的token认证机制
接口安全认证的核心在于:
1、定期的Token验证
2、接口全部在https基础下请求
3、access_token具有时效性
4、AES增加安全系数
其实不难看出微信公众号的核心思想就是Oauth2认证协议。不过在基础上增加了定期Token验证的机制来保证请求的来源是微信。
2、微信支付接口认证方案
2.1 认证流程
微信公众平台开发概述 | 微信开放文档
1)在微信官方配置并获取
a、appid mchid(商户id)
b、api key(API v3密钥)即AES-256-GCM 对称加密密钥。
c、商户API证书(商户的证书是通过下载微信证书申请工具进行申请的)
d、微信支付平台证书即平台的公钥证书用于加密业务接口的敏感报文。
2)生成签名值(发送请求时:客户端使用自己的私钥签名数据,让服务器验签。服务器响应的报文与会签名,并建议客户端回收报文后也进行验签。)
a、签名结构体
HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
b、使用商户API私钥(merchantPrivateKey)对以上数据进行SHA256 with RSA然后生成
Base64编码字符串。
3)生成HTTP头中的Authorization数据,Authorization由认证类型和签名信息两个部分组成
a、认证类型,目前为WECHATPAY2-SHA256-RSA2048
b、签名信息
-
- 发起请求的商户(包括直连商户、服务商或渠道商)的商户号mchid
- 商户API证书序列号serial_no,用于声明所使用的证书
- 请求随机串nonce_str
- 时间戳timestamp
- 签名值signature
4)使用带Authorization的HTTP请求,调用业务接口
2.2 参考代码
import okhttp3.HttpUrl;
import java.security.Signature;
import java.util.Base64;
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";
}
https://wechatpay-api.gitbook.io/wechatpay-api-v3/
2.3 小结
微信支付接口认证方案即是基于数字签名的技术方案。数字签名借助于数字证书可保证通信的身份与数据不被篡改。
p.s.如果考虑数据的安全微信支付也支持对报文进行AES-256-GCM对称加密。
3、总结
- 微信公众号接口认证方案即是基于oauth2的token认证机制
- 微信支付接口认证方案即是基于数字签名的技术方案
======================================
如果文章对你有帮助,请不要忘记加个关注、点个赞!