微信小程序认证流程

server/2024/9/23 0:08:01/

官方描述:

微信接口服务:即微信服务器。

具体的流程如下:

1.前端调用wx.login()获取登录凭证code

2.前端请求后端进行认证,发送code

3.后端请求微信获取openid

4.后端生成认证成功凭证返回给前端。

说明

  1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key

根据官方的认证流程我们定义本项目小程序认证的交互流程:

customer工程提供认证接口,publics工程作为一个公共服务提供与微信通信的接口。

前端与cutomer交互不与publics交互。

因为还可能有其他服务与微信进行交互,所以把这一块单独抽出来,放到publics里面

 步骤说明:

首先小程序>微信小程序点击登陆之后,会用wx.login,生成code,把这个code发给我们的后端

 

 调用wechatApi获取到最关键的openid

public LoginResDTO loginForCommonUser(LoginForCustomerReqDTO loginForCustomerReqDTO) {// code换openIdOpenIdResDTO openIdResDTO = wechatApi.getOpenId(loginForCustomerReqDTO.getCode());if(ObjectUtil.isEmpty(openIdResDTO) || ObjectUtil.isEmpty(openIdResDTO.getOpenId())){// openid申请失败throw new CommonException(ErrorInfo.Code.LOGIN_TIMEOUT, ErrorInfo.Msg.REQUEST_FAILD);}CommonUser commonUser = commonUserService.findByOpenId(openIdResDTO.getOpenId());//如果未从数据库查到,需要新增数据if (ObjectUtil.isEmpty(commonUser)) {commonUser = BeanUtil.toBean(loginForCustomerReqDTO, CommonUser.class);long snowflakeNextId = IdUtil.getSnowflakeNextId();commonUser.setId(snowflakeNextId);commonUser.setOpenId(openIdResDTO.getOpenId());commonUser.setNickname("普通用户"+ RandomUtil.randomInt(10000,99999));commonUserService.save(commonUser);}else if(CommonStatusConstants.USER_STATUS_FREEZE == commonUser.getStatus()) {// 被冻结throw new CommonException(ErrorInfo.Code.ACCOUNT_FREEZED, commonUser.getAccountLockReason());}//构建tokenString token = jwtTool.createToken(commonUser.getId(), commonUser.getNickname(), commonUser.getAvatar(), UserType.C_USER);return new LoginResDTO(token);}

 点到wechatapi的getopenid

openid是微信用户在家政o2o平台的唯一标识

 

点到我们的另一个微服务

 这块是固定的,不需要搞懂,只需要知道传递什么参数(4个)即可

    public String getOpenid(String code) {Map<String, Object> requestUrlParam = this.getAppConfig();requestUrlParam.put("js_code", code);String result = HttpUtil.get("https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code", requestUrlParam);log.info("getOpenid result:{}", result);JSONObject jsonObject = JSONUtil.parseObj(result);if (ObjectUtil.isNotEmpty(jsonObject.getInt("errcode"))) {throw new ServerErrorException(jsonObject.getStr("errmsg"));} else {return jsonObject.getStr("openid");}}

 因为有一个参数直接拼接在了请求路径上,所以这个地方传递了三个参数

private Map<String, Object> getAppConfig() {Map<String, Object> requestUrlParam = new HashMap();requestUrlParam.put("appid", this.wechatProperties.getAppId());requestUrlParam.put("secret", this.wechatProperties.getSecret());return requestUrlParam;}

小程序登录 | 微信开放文档微信开发者平台文档icon-default.png?t=O83Ahttps://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html 然后从数据中查询是否有返回的openid

不存在就新增数据,最后生成token返回给前端,前端会把这个token保存到storage中


http://www.ppmy.cn/server/120533.html

相关文章

深入理解Python中的时间表示:Unix时间点、毫秒和微秒,以及time模块

本套课程在线学习视频 ​​https://pan.quark.cn/s/3a470a7bbe67​​ 时间处理是编程中一项重要的任务&#xff0c;尤其是在涉及到时间戳、日志记录和调度等场景时。Python提供了强大的时间处理功能&#xff0c;特别是通过​​time​​模块。本文将探讨Python中的时间表示&am…

【宠物小精灵之收服(待更新)】

题目 代码 #include <bits/stdc.h> using namespace std; int f[1010][510]; int main() {int n, m, k;cin >> n >> m >> k;int c 0;for(int i 1; i < k; i){int cost, hp;cin >> cost >> hp;for(int j n; j > cost; j--){for(i…

eureka.client.service-url.defaultZone的坑

错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key&#xff0c;也就是defaultZone不支持snake-c…

KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用

KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用 KTH5762AQ3DNE 概述 KTH5762 是一款集成了高度匹配霍尔元件的3D (XY、 XZ 、 YZ 平面 ) 霍尔角度传感器&#xff0c;集成低功 耗&#xff0c;低噪声&#xff0c;高精度零漂运放&#xff0c;高性能&#xff…

SVM原理

SVM 这里由于过了很长时间 博主当时因为兴趣了解了下 博主现在把以前的知识放到博客上 作为以前的学习的一个结束 这些东西来自其他资料上 小伙伴看不懂英文的自行去翻译下吧 博主就偷个懒了 多维空间和低维空间 不一样的分法&#xff0c;将数据映射到高维 &…

C++ prime plus-2-编程练习

复习题&#xff1a; 1.它们叫作函数。 2.这将导致在最终的编译之前&#xff0c;使用iostream 文件的内容替换该编译指令。 3.它使得程序可以使用 std 名称空间中的定义。 4.cout << "Hello&#xff0c;world\n"; 或cout<<"Hello&#xff0c;wor…

Unity多语言插件I2 Localization国际化应用

【就不收费了&#xff0c;要个关注不过分吧】 【图片来自插件官网&#xff0c;侵删】 前言 目前游戏往往都不会仅局限于国内语言&#xff0c;为了适应产品都要做国际化适配&#xff0c;因此会用到这个插件&#xff0c;这个插件要付费&#xff0c;因此请前往unity官网进行下载…

远程Linux网络连接( Linux 网络操作系统 04)

接下来我们准备开始进入Linux操作系统的第二个模块的学习&#xff0c;不过在学习之前我们需要对如下进行简单的配置&#xff0c;通过外接辅助软件MobaXterm来进行虚拟操作系统的访问。接下来的课程我们会一直在MobaXterm中进行命令和相关知识的学习。 一、准备阶段 1.1 软件 …