• 微信支付、微信公众号接口认证方案


    1 微信公众号接口认证方案

    1.1 认证流程

    安全API接口认证方案 流程图模板_ProcessOn思维导图、流程图​www.processon.com/view/link/636e05a21e085317c6a688d2

    1)官方配置Token验证

    • Token不在网络中传递

    2)开发一个Token验证接口

    • Token及其它参数拼接并字典排序再做sha摘要计算

    • 微信定期调用此接口来验证身份正确性

    • 通过摘要验证判断请求来源微信(Token配置在微信平台,固而判断来源)

    3)通过appid secret获取access_token

    4)所有业务URL直接拼接access_token

    5)针对报文安全可以设置加密模式,使用在平台配置的AESkey进行加密

    1.2 参考代码

    1. private function checkSignature()
    2. {
    3. $signature = $_GET["signature"];
    4. $timestamp = $_GET["timestamp"];
    5. $nonce = $_GET["nonce"];
    6. $token = TOKEN;
    7. $tmpArr = array($token, $timestamp, $nonce);
    8. sort($tmpArr, SORT_STRING);
    9. $tmpStr = implode( $tmpArr );
    10. $tmpStr = sha1( $tmpStr );
    11. if( $tmpStr == $signature ){
    12. return true;
    13. }else{
    14. return false;
    15. }
    16. }

    1.3 小结

    安全核心在于:

    1、定时的Token验证

    2、全部接口在https基础下请求

    3、access_token具有时效性

    4、AES增加安全系数

    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 参考代码

    1. import okhttp3.HttpUrl;
    2. import java.security.Signature;
    3. import java.util.Base64;
    4. String schema = "WECHATPAY2-SHA256-RSA2048";
    5. HttpUrl httpurl = HttpUrl.parse(url);
    6. String getToken(String method, HttpUrl url, String body) {
    7. String nonceStr = "your nonce string";
    8. long timestamp = System.currentTimeMillis() / 1000;
    9. String message = buildMessage(method, url, timestamp, nonceStr, body);
    10. String signature = sign(message.getBytes("utf-8"));
    11. return "mchid=\"" + yourMerchantId + "\","
    12. + "nonce_str=\"" + nonceStr + "\","
    13. + "timestamp=\"" + timestamp + "\","
    14. + "serial_no=\"" + yourCertificateSerialNo + "\","
    15. + "signature=\"" + signature + "\"";
    16. }
    17. String sign(byte[] message) {
    18. Signature sign = Signature.getInstance("SHA256withRSA");
    19. sign.initSign(yourPrivateKey);
    20. sign.update(message);
    21. return Base64.getEncoder().encodeToString(sign.sign());
    22. }
    23. String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) {
    24. String canonicalUrl = url.encodedPath();
    25. if (url.encodedQuery() != null) {
    26. canonicalUrl += "?" + url.encodedQuery();
    27. }
    28. return method + "\n"
    29. + canonicalUrl + "\n"
    30. + timestamp + "\n"
    31. + nonceStr + "\n"
    32. + body + "\n";
    33. }

    p.s.你会发现好像都有oauth2的影子,如果你的系统没有上oauth2框架可以考虑结合微信支付或者微信公众号的方式做一个接口认证。其中核心就是摘要算法、非对称签名算法、对称加密算法。

  • 相关阅读:
    C/C++面试高频知识点八股文
    人体调优不完全指南「GitHub 热点速览 v.22.22」
    AUTOSAR规范与ECU软件开发(实践篇)10、AUTOSAR技术展望
    数据库索引这么做才有谱
    我们不一样①
    OJ题目【栈和队列】
    STM32CUBEMX_创建时间片轮询架构的软件框架
    理解Linux系统:进程信号的概念,产生,保存,处理
    rust学习-string
    深入浅出Spring Boot整合minio
  • 原文地址:https://blog.csdn.net/citywu123/article/details/127811026