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;
    }
}

developers.weixin.qq.com/doc/offiacc…

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";
}

wechatpay-api.gitbook.io/wechatpay-a…

2.3 小结

微信付出接口认证计划便是根据数字签名的技能计划。数字签名借助于数字证书可确保通信的身份与数据不被篡改。

微信公众号、支付接口认证:一步步教您如何实现

p.s.如果考虑数据的安全微信付出也支持对报文进行AES-256-GCM对称加密。

3、总结

  • 微信大众号接口认证计划便是根据oauth2的token认证机制

  • 微信付出接口认证计划便是根据数字签名的技能计划

微信公众号、支付接口认证:一步步教您如何实现

======================================

如果文章对你有协助,请不要忘掉加个重视、点个赞!必回关!!!