统一开放平台实现方案(访微信SDK)

news2024/11/19 3:23:18

需求分析

在互联中,我们的服务是不对外开放的,但是有先场景下我们可以对外开放,但是必须是系统所允许的用户才可以,这样做一方面保证安全,另一方面可以提升平台的能力,比如调用微信的接口必须要进行微信开发者认证,比如阿里云等等,那么我们如何实现一个自己的开放平台呢?

实现思路

平台接入流程图如下:
在这里插入图片描述
提供一个申请接入的入口,用户通过注册审核通过后获取appid和appserect得到访问应用服务的钥匙,然后通过钥匙获取访问的token.

服务端验证流程图如下
在这里插入图片描述
服务端要验证访问者是不是真实的用户,有时候还可以增加ip白名单进行拦截,具体要根据业务进行扩展,总体思路如上,返回token后,用户就可以拿着token调用服务的API,服务端可以通过aop进行接口统计等等。

服务端验证代码示例

  /**
     * 获取登录token
     *
     * @param body
     * @param request
     * @return
     */
    public String getAccessToken(String body, HttpServletRequest request) {
        log.info("body是:{}", body);
        String appid = request.getHeader("appid");
//        String secret1 = request.getHeader("secret");
        try {
            if (!StringUtils.hasText(body)) {
                throw new ServiceException("必传参数:body不能为空!");
            }
            UserApplicationEntity validAppidAndSecret = this.isValidAppidAndSecret(appid);
            if (validAppidAndSecret==null) {
                throw new ServiceException("appid/secret:验证失败");
            }
            String secret1 = validAppidAndSecret.getSecret();
//            String decode = URLDecoder.decode(body, StandardCharsets.UTF_8);
            log.info("解密后的值是:{}", body);
            String decryptBodyStr = RsaUtil.decryptStr(body, secret1);
            log.info("P{}",decryptBodyStr);
            JSONObject decryptBody = JSONObject.parseObject(decryptBodyStr);
            String secret = decryptBody.getString("secret");
            //验证appid和secret合法性
           if(!secret1.equals(secret)){
               throw new ServiceException("secret:验证失败,请联系管理员");
           }
            Date expiryDate = validAppidAndSecret.getExpiryDate();
            int compare = DateUtil.compare(expiryDate, new Date());
            if(compare<0){
                throw new ServiceException("appid/secret:已过期,请联系管理员");
            }
            //根据当前时间戳和请求时间戳验证是否盗链
            Long timestamp = decryptBody.getLong("timestamp");
            long requestInterval = System.currentTimeMillis() - timestamp;
            if (requestInterval > REQUEST_EXPIRES_TIME) {
                throw new ServiceException("时间已经超时");
            }
            //验证调用方身份合法性(验证签名)
            Optional<String> signOpt = Optional.ofNullable(request.getHeader("sign"));
            if (signOpt.isEmpty()) {
                throw new ServiceException("身份不合法!");
            }
            String grantType = decryptBody.getString("grantType");
            String salt = decryptBody.getString("salt");
            String generatedSign = SecureUtil.md5(appid + secret + grantType + timestamp+salt);
            String sign = signOpt.get();
            if (!sign.equals(generatedSign)) {
                throw new ServiceException("身份不合法!");
            }
            //通过jwt生成access token
            Map<String, Object> payload = new HashMap<>();
            payload.put("appid", appid);
            payload.put("secret", secret);
            payload.put("grantType", grantType);
            payload.put("timestamp", timestamp);
            payload.put("salt", salt);
            payload.put("sign", sign);
            return jwtService.generateAccessToken(appid,payload);
        } catch (Exception e) {
            log.error("验证失败,请联系管理员:{}" , e);
            throw new ServiceException("验证失败,请联系管理员:" + e);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1890653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何快速掌握一门编程语言

学习一门新的编程语言可能是一个具有挑战性的过程&#xff0c;但通过一些系统的方法&#xff0c;可以大大加快这个过程。 目录 第一步&#xff1a;通过书籍和视频课程掌握基本语法1. **学习编程语言的基础知识**2. **掌握字符串处理**3. **掌握正则表达式和解析器**4. **掌握面…

AnyView 对 SwiftUI 性能的影响

文章目录 前言测试设置动画卡顿浏览数据没有 AnyView 有 AnyView在浏览数据时修改没有 AnyView 有 AnyView分析结果总结 前言 AnyView 是一种类型擦除的视图&#xff0c;对于 SwiftUI 容器中包含的异构视图非常方便。在这些情况下&#xff0c;你不需要指定视图层次结构中所有视…

【大数据】—美国交通事故分析(2016 年 2 月至 2020 年 12 月)

引言 在当今快速发展的数字时代&#xff0c;大数据已成为我们理解世界、做出决策的重要工具。特别是在交通安全领域&#xff0c;大数据分析能够揭示事故模式、识别风险因素&#xff0c;并帮助制定预防措施&#xff0c;从而挽救生命。本文将深入探讨2016年2月至2020年12月期间&…

西南交通大学【算法分析与设计实验5】

有障碍物的不同路径数量 实验目的 &#xff08;1&#xff09;理解动态规划算法的求解过程。 &#xff08;2&#xff09;分析动态规划算法的时间复杂度&#xff0c;比较动态规划算法与其他算法的效率差异。 &#xff08;3&#xff09;学会如何利用动态规划算法求解具体问题&…

汇聚荣拼多多电商哪些热词比较受关注?

汇聚荣拼多多电商哪些热词比较受关注?在探讨拼多多电商平台的热点关键词时&#xff0c;我们首先得明确&#xff0c;这个平台因其独特的商业模式和市场定位&#xff0c;吸引了大量消费者的目光。拼多多通过“拼团”购物的方式迅速崛起&#xff0c;成为电商行业的一个重要力量。…

5% 消耗,6 倍性能:揭秘新一代 iLogtail SPL 日志处理引擎与 Logstash 的 PK

作者&#xff1a;阿柄 引言 在当今数据驱动的时代&#xff0c;日志收集和处理工具对于保障系统稳定性和优化运维效率至关重要。随着企业数据量的不断增加和系统架构的日益复杂&#xff0c;传统日志处理工具面临着性能、灵活性和易用性等多方面的挑战。Logstash 作为一款广受欢…

qt6 通过http查询天气的实现

步骤如下&#xff1a; cmakelist 当中&#xff0c;增加如下配置 引入包 访问远端api 解析返回的数据 cmakelist 当中&#xff0c;增加如下配置&#xff0c;作用是引入Network库。 引入包 3、访问远端api void Form1::on_pushButton_clicked() {//根据URL(http://t.weather.…

GoLand 2024 for Mac GO语言集成开发工具环境

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

Flask 数据创建时出错

当我们在使用 Flask 创建数据时遇到错误&#xff0c;可能有多种原因&#xff0c;包括代码错误、数据库配置问题或依赖项错误。具体情况我会总结成一篇文章记录下&#xff0c;主要是归类总结一些常见的解决方法和调试步骤&#xff0c;帮助大家解决问题&#xff1a; 1、问题背景 …

013、MongoDB常用操作命令与高级特性深度解析

目录 MongoDB常用操作命令与高级特性深度解析 1. 数据库操作的深入探讨 1.1 数据库管理 1.1.1 数据库统计信息 1.1.2 数据库修复 1.1.3 数据库用户管理 1.2 数据库事务 2. 集合操作的高级特性 2.1 固定集合(Capped Collections) 2.2 集合验证(Schema Validation) 2.…

如何批量创建、提取和重命名文件夹!!!

你是否还在一个一个手动创建文件名&#xff01; 你是否还在一个一个手动提取文件名&#xff01; 你是否还在一个一个手动修改文件名&#xff01; 请随小生一起批量自动创建、提取、重命名&#xff01; 1、批量创建文件夹 【案例】创建1日-31日共31个文件夹 【第一步】在A列…

VirtualBox Ubuntu Sever配置双网卡

Ubuntu 版本&#xff1a;Ubuntu Server 2404 vitrualBox 网卡配置&#xff1a; 如上配置后&#xff0c;ifconfig 只能看到 网卡1 应用了。要应用 网卡2 需要更改文件 /etc/netplan/50-cloud-init.yaml&#xff08;不同的ubuntu版本这个文件名可能不同&#xff09; 首先 ifcon…

如何在Linux上删除Systemd服务

Systemd是Linux 操作系统的系统和服务管理器&#xff0c;提供控制系统启动时启动哪些服务的标准流程。 有时&#xff0c;您可能出于各种原因需要删除systemd服务&#xff0c;例如不再需要、与其他服务冲突&#xff0c;或者您只是想清理系统。 Systemd使用单元文件来管理服务&…

OBD诊断(ISO15031) 04服务

文章目录 功能简介ISO 9141-2、ISO 14230-4和SAE J1850的诊断服务定义1、清除/重置与排放相关的诊断信息请求消息定义2、请求与排放相关的DTC响应消息定义3、报文示例 ISO 15765-4的诊断服务定义1、请求与排放相关的DTC请求消息定义2、请求与排放相关的DTC响应消息定义3、否定响…

深入详解RocketMQ源码安装与调试

1.源码下载 http://rocketmq.apache.org/dowloading/releases/ 2. 环境要求 64位系统JDK1.8(64位)Maven 3.2.x

keil5模拟 仿真 报错没有读写权限

debug*** error 65: access violation at 0x4002100C : no write permission 修改为&#xff1a; Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Parameter默认是-pSTM32F103VE

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景&#xff1a; 用户计算机与ISP之间的链路层协议就是点对点协议 PPP&#xff0c;1999年公布了回以在以太网上运行的PPP协…

配音软件有哪些?分享五款超级好用的配音软件

随着嫦娥六号的壮丽回归&#xff0c;举国上下都沉浸在这份自豪与激动之中。 在这样一个历史性的时刻&#xff0c;我们何不用声音记录下这份情感&#xff0c;让这份记忆以声音的形式流传&#xff1f; 无论是制作视频分享这份喜悦&#xff0c;还是创作音频讲述探月故事&#xff…

AI 会淘汰程序员吗?

前言 前些日子看过一篇文章&#xff0c;说国外一位拥有 19 年编码经验、会 100% 手写代码的程序员被企业解雇了&#xff0c;因为他的竞争对手&#xff0c;一位仅有 4 年经验、却善于使用 Copilot、GPT-4 的后辈&#xff0c;生产力比他更高&#xff0c;成本比他更低&#xff0c…

【分布式系统】监控平台Zabbix对接grafana

以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署&#xff08;命令截图版&#xff09;-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 一.安装grafana并启动 添加一台服务器192.168.80.104 初始化操作 systemctl disable --now firewalld set…