第三方微信登陆的后台实现

2023-11-19

关于微信第三方的开发,官方文档给了很详细的解析说明,有不清楚流程的同学可以先去官网学习,而我这里主要是整理一下自己的后台处理流程。

其实微信登录就是通过用户的授权,允许app获取用户的微信信息,再往自己的数据库插入获取的信息。
这里用手机app作为例子,当手机选择微信登陆且确认的时候,app会生成一个code,用于获取授权信息,这个code的生命周期只能使用一次,这时候后台可以接受这个code,并获得access_token和openid等信息,有了access_token和openid就能获得该微信用户的信息。
因为以上步骤都是需要appId和秘钥的,所以这两个信息需要放在后台,而不是app客户端。后台操作如下:
后台发送http请求的操作可以使用第三方的okhttp3

		<dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.10.0</version>
        </dependency>

maven导入需要的jar,编写工具类获取access_token

	public static final String APPID = "你的appId";

    public static final String SECRET = "你的秘钥";

//获取信息的地址access_token和openId
    private static final String ACCESSTOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token";

    private static final String WECHATUSERINFO = "https://api.weixin.qq.com/sns/userinfo";

    public static Map getAccessToken(String code){
        String url = new StringBuilder(ACCESSTOKEN)
                .append("?grant_type=authorization_code&appid=").append(APPID).append("&secret=")
                .append(SECRET).append("&code=").append(code).toString();
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        try {
            Response response = client.newCall(request).execute();
            String resultJson = response.body().string();
            /** 正确返回示例
             * "access_token":"ACCESS_TOKEN",
             * "expires_in":7200,
             * "refresh_token":"REFRESH_TOKEN",
             * "openid":"OPENID",
             * "scope":"SCOPE",
             * "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
             */
            Map parseObject = JSONObject.parseObject(resultJson, Map.class);
            //将json专还成map,方便取值
            String access_token = (String)parseObject.get("access_token");
            if (access_token != null){//有token说明请求正确,返回Map信息
                return parseObject;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

调用该方法传入正确的code,能得到我们所需要的信息,到这里为止只是获得了授权和openId的信息,也许你会问openId到底是什么,openId其实就是你微信帐号的唯一标识。
获得到这个map之后,controller层可以这样操作

		//得到accesstoken和openId
        Map accessToken = WechatUtil.getAccessToken(code);
        if (accessToken==null)//请求失败,空就说明刚刚的请求没有发送成功
        {
            result.put("code",-1);
            result.put("msg","第三方登录失败");
            return result;
        }
        //请求成功,获取openId,access_token
        String access_token = (String)accessToken.get("access_token");
        String open_id = (String)accessToken.get("openid");
        /**
        *通过openId查找数据库,如果查得到用户说明这个微信号
        *登陆过,直接返回这个用户的信息即可,否则就继续调用
        *另一个http请求获得用户的信息,然后将这个信息插入的自己的数据库
        */
        UserWithBLOBs user = this.userService.getItemByOpenId(open_id);
        //没有微信登陆过,发送请求获取微信信息,再添加入库
        if (user == null) {
            UserWithBLOBs userInfo = WechatUtil.getUserInfo(open_id, access_token);
            //将上方的该用户插入到你的数据库且返回到前端
        }else {//user!=null用微信登陆过,直接将user放入返回即可
                //返回user信息给前端app
        }
        return result;

获得用户信息的方法,同样使用okhttp3

public static UserWithBLOBs getUserInfo(String openId,String accessToken){
        String url = new StringBuilder(WECHATUSERINFO).append("?openid=").append(openId)
                .append("&access_token=").append(accessToken).toString();
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        try {
            Response response = client.newCall(request).execute();
            String resultJson = response.body().string();
            /**正确的返回信息
             * {
             * "openid":"OPENID",
             * "nickname":"NICKNAME",
             * "sex":1,
             * "province":"PROVINCE",
             * "city":"CITY",
             * "country":"COUNTRY",
             * "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
             * "privilege":[
             * "PRIVILEGE1",
             * "PRIVILEGE2"
             * ],
             * "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
             * }
             */
            Map parseObject = JSONObject.parseObject(resultJson, Map.class);
            String id = (String)parseObject.get("openid");
            if (id != null){//成功获取用户信息
                String nickname = (String)parseObject.get("nickname");
                Integer sex = (Integer)parseObject.get("sex");
                String province = (String)parseObject.get("province");
                String city = (String)parseObject.get("city");
                String headimgurl = (String)parseObject.get("headimgurl");
                UserWithBLOBs user = new UserWithBLOBs();
                user.setUserName(nickname);
                user.setOpenId(openId);
                user.setUserImg(headimgurl);
                //这里只选了三个字段,根据自己的业务选择更多的字段
                return user;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
``
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三方微信登陆的后台实现 的相关文章

  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文

随机推荐

  • 软件测试用例——三角形

    1 题目 输入三个数a b c分别作为三边的边长构成三角形 通过程序判定所构成的三角形是一般三角形 等腰三角形还是等边三角形时 请为该程序设计测试用例 用等价类划分方法 分析 得出测试用例 用判定表法 条件 1 2 3 4 5 6 7 8
  • 嵌入式数据库sqlite3【进阶篇】-如何用C语言操作sqlite3,一文搞懂

    sqlite3编程接口非常多 对于初学者来说 我们暂时只需要掌握常用的几个函数 其他函数自然就知道如何使用了 数据库 本篇假设数据库为my db 有数据表student no name score 4 一口Linux 89 0 创建表格语句
  • Keil MDK报错:Browse information of one or more files is not available----全面的解决方法。

    最近玩stm32遇到一个BUG 报错内容如图 图片来自网络 感谢网友提供图片 如有侵权 请私聊以便删除 本人的报错情况跟这个一模一样 不同的是我的报错文件要多一些 以下是解决方法 方法一 1 点击魔术棒 2 在Output界面中勾选Brow
  • Linux文件系统是怎么工作的?

    本文已收录GitHub 更有互联网大厂面试真题 面试攻略 高效学习资料等 磁盘为系统提供了最基本的持久化存储 文件系统则在磁盘的基础上 提供了一个用来管理文件的树状结构 那么 磁盘和文件系统是怎么工作的呢 又有哪些指标可以衡量它们的性能呢
  • Selenium+WebDriver 各浏览器驱动下载与使用

    Selenium python WebDriver驱动下载与使用 Firefox 火狐 浏览器驱动 Chrome google 浏览器驱动 IE浏览器驱动 Microsoft Edge EdgeHTML 浏览器驱动 Microsoft Ed
  • linux send recv函数详解

    2009 05 10 21 55 int send SOCKET s const char FAR buf int len int flags 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据 客户程序一般用sen
  • paddleseg人像分割windows下实现与证照自动生成实现

    paddleseg人像分割windows下实现与证照自动生成实现 近日研究了一下用人脸识别作自动证件照生成 刚开始以为很简单不就是识别出人脸 然后按比例切出 这一步当然很简单 结果看了各种证件照 原来要去除背景的 这样一来原来简单的事搞得复
  • 虚拟计算技术

    虚拟计算的本质是资源共享 P2P计算 云计算 网格计算 普适计算都属于虚拟计算 一 概述 虚拟计算 Virtual Computing 的本质是资源共享 虚拟计算技术不仅能使人们更有效地共享现有的资源 而且能通过重组等手段 为人们提供更多
  • 这一次,我顿悟了

    大家好 我是苍何 昨晚和编程导航 星球嘉宾也是我的引路人闫 y n 小林大佬 畅聊了 4 个 小时 至今内心还是久久不能平静 小林和我一样是跨界转行 他是医学院毕业 大二开始自学编程 并写博客记录 迄今有 30 万编程学习者关注 毕业后在某
  • OSI七层模型以及各层的作用

    OSI七层模型 OSI七层模型包括 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 具体作用 物理层 主要定义物理设备标准 如网线的接口类型 各种传输介质的传输速率等 主要作用是传输bit流 主要设备 集线器 数据链路层 主要将
  • HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏 在STM32开发板上的实战应用及其详解 一 HMI智能串口屏使用步骤 二 附录 一 HMI智能串口屏使用步骤 安装USART HMI软件 一般买的串口屏里面 商家送的资料里面都有改该软件 打开软件 并点击左上角的 新建 选
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • 智能制造中的智能制造平台:应用案例介绍

    作者 禅与计算机程序设计艺术 智能制造中的智能制造平台 应用案例介绍 智能制造作为我国大力发展的重要战略 旨在通过改变传统制造业的生产模式 提高制造业的自主创新能力和核心竞争力 智能制造平台作为实现智能制造的核心基础 对于企业来说具有重要的
  • 春秋云镜:CVE-2019-9042(Sitemagic CMS v4.4 任意文件上传漏洞)

    一 题目 靶标介绍 Sitemagic CMS v4 4 index php SMExt SMFiles 存在任意文件上传漏洞 攻击者可上传恶意代码执行系统命令 进入题目 admin admin index php SMExt SMFile
  • .NET Core 下定时任务调度

    一 增加本地json持久化调度任务 无需数据库 1 首先 我们创建一个空白的ASP NET Core 项目 MVC Razor和WebAPI都行 如图 2 通过nuget引用最新版本的GZY Quartz MUI组件 如图 组件的项目地址G
  • hibernate与sqlserver的连接

    Hibernate是一个开放源代码的对象关系映射框架 它对JDBC进行了非常轻量级的对象封装 它将POJO与数据库表建立映射关系 是一个全自动的orm框架 hibernate可以自动生成SQL语句 自动执行 使得Java程序员可以随心所欲的
  • 【MySQL】sql给表起别名

    有时候 在对数据库中的表进行操作的时候 发现表名比较冗长 这时候我们就需要对表创建一个别名 别名的关键字为as 也可以不加 现在有一个student表 结构如下 现在我认为student太长了 我不想一直打 sql语句如下 select a
  • setTimeout异步

    同步任务和异步任务 同步和异步操作的区别就是是否阻碍后续代码的执行 同步任务是那些没有被引擎挂起 在主线程上排队执行的任务 只有前一个任务执行完毕 才能执行后一个任务 异步任务是那些被引擎放在一边 不进入主线程 而进入任务队列的任务 只有引
  • 【IEEE 13 节点分配系统中的THD降低】系统的谐波分析给出了各种总线上电流和电压的谐波频谱和THD(Simulink实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink仿真实现 1 概述 IEEE 13 节点分配系统中的THD
  • 第三方微信登陆的后台实现

    关于微信第三方的开发 官方文档给了很详细的解析说明 有不清楚流程的同学可以先去官网学习 而我这里主要是整理一下自己的后台处理流程 其实微信登录就是通过用户的授权 允许app获取用户的微信信息 再往自己的数据库插入获取的信息 这里用手机app