废话不多说,官方时序图如下:

图里其实说的很清楚了,清理下流程:

1.前端调用wx.login()获取code值

2.前端通过调用wx.getUserInfo获取iv、rawData、signature、encryptedData等加密数据,传递给后端

3.服务器通过code请求api换回session_key和openid

4.服务器通过前端给的rawData 加获取的session_key使用sha1加密,计算出signature1

5.比对前端传的signature和自己算出来的signature1是否一致(防止数据不一致)

6.用AES算法解密encryptedData里的敏感数据

7.拿着敏感数据后做自己的逻辑

8.通知前端登陆成功
第一步:

通过wx.login(微信前端–小程序)接口获取code,将code传到后台

注意:

code的来源:是用户打开小程序的时候,随机生成的,是腾讯生成的,每个code只能使用一次,因此,理论上这个code是安全的

package cn.wmyskxz.springboot.model.user;
/** * @Author: Yangke * @Date: 2019/3/31 15:52 **/
public class WeChatLoginModel {   String code;     public String getCode() {        return code;    }     public void setCode(String code){        this.code = code;    }}

第二步:
后台通过code访问微信(腾讯)接口,微信(腾讯)接口返回当前登录的信息:session_key及openid

返回的openid是每个用户唯一的,通过这个 可以匹配 微信(腾讯)的用户 跟 我们的用户,就是我们后台通过openid来判断这个人是谁,

在这里插入代码片
/**     * 微信小程序登录     *
* 登录成功后,将用户身份信息及session_key存入token
* * @param model
* * @return     */
* @ResponseBody
* @PostMapping("/weChatLogin")
* public SingleResult<String> weChatLogin
* (@RequestBody WeChatLoginModel model){
* /**         * 登录日志:         * id\ userid\ date\ wx_code\ createTime         * create table loginLog (                id varchar(50) primary key,                userId varchar(50),                logindate date,                wxcode varchar(100),                createtime datetime           );         */         SingleResult<String> result = new SingleResult<String>();       *  //
* 第三步:调用service.weChatLogin(model):后台检查openid是否存在,返回openid对应的用户        WeChatLoginResult<UserAccount> loginResult = service.weChatLogin(model);       * //*
*  第四步:        UserAccount user = loginResult.getUser();
* if(user == null ){
* result.setCode(0);
* result.setMessage("登录失败");
* } else {
* User u = new User();
* u.setId(user.getId());
* u.setPassword(user.getPassword() == null ? user.getWxopenid() : user.getPassword());
* u.setSessionKey(loginResult.getSession_key());
*  String token = getToken(u);
*  result.setToken(token);
* result.setCode(1);
* result.setMessage("登陆成功");
* }
* return result;
*  }

其中:就是下面的第三步

//调用service.weChatLogin(model)

WeChatLoginResult loginResult = service.weChatLogin(model);
第三步:

后台检查openid是否存在,
@Override
public WeChatLoginResult<UserAccount> weChatLogin(WeChatLoginModel model){        WeChatLoginResult<UserAccount> result = null;
try {
// code  -> openid
String urlFormat = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
String url = String.format(urlFormat, WeChat.appId, WeChat.secret, model.getCode());
String json = WeChat.sendGet(url);
//将json字符串转化成对象
result = JSON.parseObject(json, WeChatLoginResult.class);             if(result.getErrcode() == null){               // 去数据库 检查 openId 是否存在 不存在就新建用户               UserAccount user = userAccount.wechatOpenIdIsExists(result.getOpenid());                if(user == null || user.getId() == null){
// 不存在,就是第一次登录:新建用户信息
user = new UserAccount();                    user.setId(UUID.randomUUID().toString());                    user.setWxopenid(result.getOpenid());
user.setLasttime(new Date());
userAccount.insert(user);
}else {
//如果存在,就不是第一次登录,更新最后登录时间                    user.setLasttime(new Date());                    userAccount.updateByPrimaryKeySelective(user);
}
result.setUser(user);                 // 保存登录日志
LoginLog log = new LoginLog();                log.setId(UUID.randomUUID().toString());
log.setCreatetime(new Date());
log.setLogindate(new Date());
log.setUserid(user.getId());
log.setWxcode(model.getCode());
loginLog.insert(log);
}else { System.out.println(json);
}catch (Exception e){           System.out.println(e.getMessage());        }
return result;    }``
@Select("select * from useraccount where wxOpenId = #{wxOpenId}")
UserAccount wechatOpenIdIsExists(String wxOpenId);

(1)如果不存在:就是该用户的第一次登录,后台数据库新添加一个用户信息

如果存在:就不是该用户的第一次登录,以前登陆过,就更新后台数据库中该用户的第一次登录时间

(2) 返回用户信息
第四步:

下发token

//第四步:        UserAccount user = loginResult.getUser();
if(user == null ){            result.setCode(0);
result.setMessage("登录失败");        }       else {            User u = new User();            u.setId(user.getId());           //用户如果是第一次登录,那就是没有密码的,这里用openid当做密码            u.setPassword(user.getPassword() == null ? user.getWxopenid() : user.getPassword());           u.setSessionKey(loginResult.getSession_key());           //利用User.class中的信息生成token            String token = getToken(u);            //下发token            result.setToken(token);            result.setCode(1);           result.setMessage("登陆成功");        }         return result;    }
 利用JWT框架生成tokenpackage cn.wmyskxz.springboot.controllers;
import cn.wmyskxz.springboot.model.User;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
/** * @Author: Yangke * @Date: 2019/3/28 21:12 **/
public abstract class BaseController {
protected String getToken(User user) {
String token="";
token= JWT.create()                .
withKeyId(user.getId())
.withIssuer("www.ikertimes.com")                .
withIssuedAt(new Date())                .
withJWTId("jwt.ikertimes.com")                .
withClaim("session_key", user.getSessionKey())                .withAudience(user.getId())                .sign(Algorithm.HMAC256(user.getPassword()));
return token;
}}

至此,再理一下上面的步骤:

(1)微信小程序通过访问wx.login获得一个code,返回给后台

(2)后台拿着这个code,调用腾讯的接口,获取到openid、seesion-key等信息,openid是用户唯一的

(3)后台拿着openid去数据库中检查,该用户是否是第一次登陆

如果是第一次登陆,那么就新建一个用户–UserAcount;如果不是第一次登陆,就修改该用户的最后登录时间

不管是不是第一次登录,都有了一个用户

(4)然后根据用户的信息利用JWT生成token,下发给微信小程序
第五步

微信小程序收到token后,存起来

微信小程序如何获取token相关推荐

  1. 微信小程序登录获取Token以及微信支付

    微信小程序登录获取Token 在调用登录接口api之前,要先获取以下五个参数 后四个参数获取:通过为button按钮添加 open-type="getUserInfo" (固定写法 ...

  2. 微信小程序之获取用户基本信息

    微信小程序之获取用户基本信息 一.使用Redis存储access-token package com.qfjy.project.weixin.api.accessToken;import com.qf ...

  3. 微信小程序登录获取不到头像和昵称解决办法!

    微信小程序登录获取不到头像和昵称主要原因是:小程序wx.getUserProfile接口被收回! 大家可以按照文档操作↓ PS: 针对小程序wx.getUserProfile接口将被收回后做出的授权调 ...

  4. 微信小程序地图获取地点信息(打卡签到功能为例)-2020-7-26

    目录 微信小程序地图获取地点信息(打卡签到功能为例) 效果图 前提步骤 首先需要了解的 代码部分 配置性代码 功能性代码 demo 下载 微信小程序地图获取地点信息(打卡签到功能为例) 解决方案:利用 ...

  5. 微信小程序下获取公众号openId

    微信小程序下获取公众号openId 一.为什么我们需要在小程序下面获取公众号的openId呢? 微信公众号和微信小程序我们一般都会开发,有一种场景我们经常会遇到,公众号的消息推送以较成熟,我们希望把小 ...

  6. 微信小程序批量获取input的输入值,监听输入框,数据同步

    微信小程序批量获取input的输入值,监听输入框,数据同步 在使用小程序时,跟vue的数据绑定不一样,没有v-model这个属性了,官网也只是给了一些事件监听. 但是我们如果有多个表单时,需要写多个事 ...

  7. 微信小程token_微信小程序url与token设置详解

    微信小程序url与token设置详解 新浪云应用sae的代码里创建一个weixin.php文件,写入以下代码 isValid(); class wechatAPI { public function ...

  8. 微信小程序之获取用户地址

    在微信小程序中获取定位信息 今天一整天基本上都在处理在微信小程序中获取准确地址,给出定位并给出所在城市的问题.经过走了半天弯路,现在总结一下所需要的步骤. 一. 先到腾讯位置服务中心获取KEY 通过小 ...

  9. 微信小程序制作——获取用户信息

    微信小程序制作--获取用户信息 1.获取用户信息 方式一 wxml <view bindtap="getUserName">获取当前用户名</view> j ...

  10. php取微信名字和头像,微信小程序如何获取用户头像和昵称

    本文介绍了微信小程序如何获取用户头像和昵称,分享给大家,具体如下: 代码user.wxml: {{userInfo.nickName}} user.js //sort.js //獲取應用實例 var ...

最新文章

  1. 机器学习_周志华_问题汇总_第2周
  2. Spring整合Hessian
  3. 4.2w Star的文件同步工具,比VIP网盘还好用!
  4. Android NFC开发实战详解
  5. Alpha预乘-混合与不混合[转]
  6. ASP.NET Core Web API 集成测试中使用 Bearer Token
  7. VMware Workstation 8下Ubuntu 13.04中安装VMware Tools出错
  8. 企业实战_17_MyCat水平扩展_跨分片查询_ER分片
  9. fail-fast机制(遍历的同时删除List中的对象)
  10. [高光谱] Hyperspectral-Classification-master 网络模型解析
  11. android自定义按钮控件样式
  12. 软件项目估算是一件很难的事情
  13. layer.prompt输入框改成laydate时间控件
  14. R语言——双因素方差分析
  15. 医学影像研究的重要性 计算机,计算机辅助医学影像诊查之关键学习技术研究.doc...
  16. Ubuntu升级glibc库
  17. 西门子冗余服务器 系统拷贝,西门子(SIEMENS)冗余系统指南.pdf
  18. 内网接入外网的几种方式
  19. 2022年来了,从Python定制一份日历开始吧!
  20. 基于物联网技术和RFID电子客票的铁路自动检票机

热门文章

  1. 无线桥接怎么设置网关和dns服务器,斐讯K2路由器怎么设置桥接_斐讯K2无线中继设置教程-192路由网...
  2. 盗版识别对软件资产管理至关重要
  3. Invisible Backdoor Attack with Sample-Specific Triggers
  4. html动态生成tr标签,JS动态添加tr元素
  5. 转帖:三种快乐物质——多巴胺、血清素、内啡肽
  6. 用HTML写一个会员注册、登录界面
  7. 我努力了18年,不是为了和你一起喝咖啡姐妹篇
  8. 如何准确获取地点位置的经纬度?
  9. win7远程桌面连接问题解决方案
  10. win7开启远程桌面