开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):微信扫描登录(获取扫描人信息分析)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11462
微信扫描登录(获取扫描人信息分析)
内容介绍:
一、扫码之后跳转规则
二、获取扫描人信息过程
三、腾讯官方提供方法流程
一、扫码之后跳转规则
手机微信扫描二维码调用配置域名地址 http://guli. shop/ api/ucenter/wx/callback,在域名地址里面写程序,做了处理直接请求地址,通过这个到本地
http://localhost:8150/api/ucenter/wx/callback? code=011xlIs7 1HyKJo1qdht71rFLs71XlIsh&state=atguigu
需要做两件事情。
1、把本地服务端口号改成8150
server. port=8150
2、回调接口地址和域名跳转地址写成─样的地址
@Controller
//只是请求地址,不需要返回数据
@RequestMapping(" /api/ucenter/wx")
public class WxApiController{
//2获取扫描人信息,添加数据
@GetMapping("callback")
public String callback (String code, String state){
System. out. println ("code :"+code) ;
System. out. println("state:"+state) :
return "redirect:http://localhost: 3000”;
}
这种规则只是为了测试使用,在实际开发中不需要
二、获取扫描人信息过程
在微信的官方即腾讯官方,把过程已经给规定好了,必须按照他的流程实现扫码登录,下面是详细的说明。
第一步,扫码之后,会执行本地的方法,然后在 callback 方法里可以获取到两个值,这两个值是在跳转的时候传递过来的,一个叫 code,一个叫 state。
State 在生成二维码的时候叫 Atguigu,state 也叫原样传递。这个值作用不是特别大暂时用不到。
code 是每次扫码之后由微信给你返回一个 code,类似于手机的验证码, code 是随机的,唯一的一个值,每次值都是不一样的,主要用到它往外来执行。
第二步,拿着第一部分获取到的 code 值,去请求微信提供的固定地址,注意是固定地址,不需要我们去写, code 得到之后去请求异构固定地址,在里边主要是 access token 和 open ID,access token 是一个访问凭证。
open ID,因为每个人的微信都不一样,微信名称是可以一样的,微信怎么区分每个人的微信呢?不同的微信就是每个微信那个唯一的标识即 open id。
第三步拿着第二步获取到两个值 access_t oken 和 openid,再去请求一个微信提供固定地址,最终可以到微信扫描人信息。比如微信暖称,微信头像等等。
@GetMlapping(callback")
public String callback (String code,String state){
//得到授权临时票据code
System . out.println(code);
System . out.printin(state);
//从 redis 中将 state 获取出来,和当前传入的 state 作比较
//如果一致则放行,如果不一致则抛出异常:非法访问
//向认证服务器发送请求换叹 access_token
String baseAccessTokenUnl m "https : / / api.weixin.qq.cm/sns /oauth2/access_token”+
" ? appid=%s”+
" &secret-Xs”+"&code-%s”+
" &grant_type=authorization_code";
String accessTokenUrl - String.format(baseAccessTokenUrl,
ConstantPropertiesUtil.wx_OPEN_APP_ID,
ConstantPropertiesUtil.wx_OPEN_APP_SECRET,
code);
String result - null;
try {
result - HttpClientUtils.get(accessTokenUrl);
System.out.println("accessToken-m===”+result);
}catch (Exception e){
throw new GuliException (20001,“获职 access_token 失败);
}
//解析 json 字符串
Gson gson - new Gson();
HashMap map - gson.fromis on (result,HashMap . class);
String accessToken(String)map.get(""access_token");Stringopenid(String)map.get("openid”);
//查询数据库当前用用户是否曾经使用过微信登录
lember member member5ervice.getByOpenid(openid);if (menber - null){
System. out. println(“新用户注册");
//访问微信的资源服务器,获取用户信息
代码比较简单,主要是实现流程,这是微信规定的一个过程,要求必须是这一种步骤,所以必须按照规范来写,其实目的也是为了安全考虑,经过多个步骤多次验证才能得到最终数据。
三、腾讯官方提供方法流程
微信提供的获取扫描人信息过程:首先,请求登录第三方应用,有第三方应用肯定有第一方和第二方。
比如自己登陆系统,系统本身和自己就属于第一方。若现在登录微信,微信跟自己跟系统是都没有关系的,这叫第三方。请求登录第三方应用,然后里边用到 oauth2这种方式。
有一个请求用户确认,是说当扫完二维码之后,在手机上会有一个界面需要同意或者拒绝,点同意就是用户确认才能获取到用户信息。如果点拒绝,就获取不到用户信息,需要手动的在手机上点确定。
驱动之后,拉起第三方应用或重定向到第三方,带上授权临时票据( code)。临时票据就是验证码,然后临时票据请求地址,他可以得到 access token 和 Openid。
首先里边有第一个技术,不管第二步还是第三步,都需要请求地址之后得到值,第一个技术就是可以用它去请求地址,可以理解为请求是在浏览器中写地址,回车后得到,但是现在不需要浏览器,也能做到浏览器写地址,HTTP client 就是发送请求得到结果。
第二个技术是 Jason 转换工具。
在做发送短信的时候,当时用 fastJSON,再换一种转换 gson,这两个都是电子版工具,当然还有其他的工具 jackson 这些都是转工具。