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

需求分析

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

实现思路

平台接入流程图如下:
在这里插入图片描述
提供一个申请接入的入口,用户通过注册审核通过后获取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);
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统计信号处理基础 习题解答11-11

题目 考虑矢量MAP估计量 证明这个估计量对于代价函数 使贝叶斯风险最小。其中&#xff1a;, &#xff0c;且. 解答 贝叶斯风险函数&#xff1a; 基于概率密度的非负特性&#xff0c;上述对积分要求最小&#xff0c;那就需要内层积分达到最小。令内层积分为&#xff1a; 上述积…

为什么网上商店需要翻译成其他语言

网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台&#xff0c;为来自世界各地的用户提供购买所需物品的机会。但是&#xff0c;为了让这些用户舒适地使用网站&#xff0c;需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…

匠心独运:红酒与手工艺的很好结合

在岁月的长河中&#xff0c;红酒与手工艺都以其不同的魅力和技艺&#xff0c;书写着各自的故事。当这两者相遇&#xff0c;仿佛是一场跨越时空的对话&#xff0c;不仅展现了匠心独运的技艺之美&#xff0c;更在无声中诉说着对品质与生活的热爱。今天&#xff0c;就让我们一起探…

「算法题」二分查找算法演示

一个样式更加美观大方的HTML页面示例,其中包括了二分查找算法的演示。 布局描述 页面主体使用白色背景,加上轻微的阴影和圆角边框,使页面看起来更加精致。输入框和按钮使用了更加现代的样式,包括圆角边框和悬浮效果。按钮使用了鲜明的颜色,以吸引用户点击。搜索结果显示时…

html+js+css登录注册界面

拥有向服务器发送登录或注册数据并接收返回数据的功能 点赞关注 界面 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Login and Registration Form</title> <style> * …

linux命令行操作

一、看二进制文件 od -t x1 1.txt | less 二、看信号 kill -l man 7 signal 三、查看当前进程的pid号 echo $$

44.实现管理HOOK点的链表对象

上一个内容&#xff1a;43.实现HOOK接管寄存器数据 以 43.实现HOOK接管寄存器数据 它的代码为基础进行修改 首先创建一个类 这里创建的名为HOOKPOINT.h HOOKPOINT.cpp文件里面的内容 #include "pch.h" #include "HOOKPOINT.h"HOOKPOINT::HOOKPOINT() {…

钉钉机器人接入Dify工作流

实现钉钉机器人接入dify工作流&#xff0c;完成ai 流式问答 代码地址 有用的话点个star github地址 效果 配置使用 修改.env_template文件 为.env 设置.env文件内的环境变量 API_KEY: dify的api_keyAPI_URL: dify 的api接口CLIENT_ID : 钉钉机器人应用的idCLIENT_SECRET:钉…

Arthas实战(1)- 运行Arthas

1. 下载Arthas 下载到服务器&#xff1a; wget https://github.com/alibaba/arthas/releases/download/arthas-all-3.7.1/arthas-bin.zip解压 Arthas unzip arthas-bin.zip -d arthas删除压缩包 rm -f arthas-bin.zip 2. 启动Arthas 运行 Arthas java -jar arthas/arthas-bo…

高编:共享内存(key)

system v &#xff1a; 共享内存 信号量集 IPC对象操作通用框架&#xff1a; 0x ftok key值 > 申请 》读写 》关闭 》卸载 优点&#xff1a; 共享内存效率高没有读写阻塞 操作流程&#xff1a; key 》申请对象 》映射对象》读写对象》撤销映射 》删除对象…

Django 一对一关系

作用&#xff1a; 两个数据库表建立外键关系当外键表的数据被删除时&#xff0c;主表的数据也会一并删除。 1&#xff0c;添加表模型 Test/app8/views.pyfrom django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email …

Webpack: Dependency Graph 管理模块间依赖

概述 Dependency Graph 概念来自官网 Dependency Graph | webpack 一文&#xff0c;原文解释&#xff1a; Any time one file depends on another, webpack treats this as a dependency. This allows webpack to take non-code assets, such as images or web fonts, and als…

Steam夏促怎么注册 Steam夏促账号注册教程

随着夏日的炙热渐渐充斥着每一个角落&#xff0c;Steam平台也赶来添热闹&#xff0c;推出了一系列让人眼前一亮的夏季促销活动。如果你也是游戏爱好者&#xff0c;我们肯定不能错过这次的steam夏促。正直本次夏日促销有着很多的游戏迎来史低和新史低&#xff0c;有各种各样的游…

智慧城市大数据平台总体技术建设方案(DOC文件)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障…

声音音频文件波谱可视化展示

1、简单图形展示 import matplotlib.pyplot as plt import numpy as np import torch import torchaudiodef plot_waveform(waveform, sample_rate, title"Waveform", xlimNone, ylimNone):waveform waveform.numpy()num_channels, num_frames waveform.shapetime…

JVM原理(十二):JVM虚拟机类加载过程

一个类型从被加载到虚拟机内存中开始&#xff0c;到卸载为止&#xff0c;它的整个生命周期将会经过 加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中 验证、准备、解析三个部分统称为 连接 1. 加载 加载是整个类加载的一个过程。在加载阶段&#xff0c;Java虚拟机…

【测试】五子棋项目测试报告

目录 一、项目概述及测试目标 二、项目功能 三、测试类型 1&#xff09;功能测试 ​编辑 2&#xff09;自动化测试 四、测试总结 一、项目概述及测试目标 本项目是一个基于Web的五子棋实时对战应用&#xff0c;旨在提供用户之间的多人实时游戏体验。项目采用前…

springboot微信小程序的化妆品商城系统-计算机毕业设计源码041152

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序的化妆品商城系统被用户普遍使用&#xff0c;为…

超声波俱乐部分享:万物智能——AI重新定义交互体验

6月25日&#xff0c;第十八期超声波俱乐部内部分享会在杭州圆满落幕&#xff0c;本期的主题是&#xff1a;万物智能——AI重新定义交互体验。 到场的嘉宾有&#xff1a;超声波创始人杨子超&#xff0c;超声波联合创始人、和牛商业创始人刘思雨&#xff0c;上海非著名资深程序员…

centos编译内核ko模块

1、make报错 make: * /lib/modules/4.14.0-49.el7a.aarch64/build: 没有那个文件或目录。 停止。 [rootlocalhost 4.14.0-49.el7a.aarch64]# pwd /lib/modules/4.14.0-49.el7a.aarch64 [rootlocalhost 4.14.0-49.el7a.aarch64]# ll 总用量 1744 lrwxrwxrwx. 1 root root …