龙空技术网

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

玄明Hanko 100

前言:

如今咱们对“微信公众号开源框架”都比较关心,看官们都想要剖析一些“微信公众号开源框架”的相关资讯。那么小编也在网上搜集了一些对于“微信公众号开源框架””的相关文章,希望同学们能喜欢,同学们一起来学习一下吧!

#挑战30天在头条写日记#

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

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请求方法\nURL\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";}

2.3 小结

微信支付接口认证方案即是基于数字签名的技术方案。数字签名借助于数字证书可保证通信的身份与数据不被篡改。

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

3、总结微信公众号接口认证方案即是基于oauth2的token认证机制微信支付接口认证方案即是基于数字签名的技术方案

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

如果文章对你有帮助,请不要忘记加个关注、点个赞!

标签: #微信公众号开源框架 #微信公众号开源 #微信公众平台php demo