开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):微信扫描登录(获取扫描人信息)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11463
微信扫描登录(获取扫描人信息)
目录:
一、WxApiController.java 代码演示
二、添加依赖
三、具体操作
一、WxApiController.java 代码演示
@CrossOrigin
@Controller //只是请求地址,不需要返回数据
@RequestMapping("/api/ucenter/wx") public class WxApiController {
//2获取扫描人信息,添加信息
//获取 code 值,临时票据,类似于验证码
@GetMapping(" callback" )
public String callback (String code, String state)
//code 请求微信固定的地址,得到两个值 access_token 和 openid
String baseAccessTokenUrl =" 'https://api. weixin. qq. com/ sns/oauth2/access_ token" +
"?appid=%s" +
"&secret-%s" +
" &code-%s" +
"&grant_type = authorization_code" ;
//拼接三个参数: id 秘钥和 code 值
String accessTokenUrl = String. format(
baseAccessTokenUrl,
ConstantWxUtils. WX_ OPEN _APP_ ID,
ConstantWxUtils. WX_ OPEN _APP_ SECRET,
code
);
//请求这个拼接好的地址,得到返回两个值 access_token 和 openid
//使用 httpclient 发送请求,得到返回结果
String accessTokenInfo = HttpClientUtils. get(accessTokenUrl);
System. out. println(" accessTokenInfo:"+accessTokenInfo);
}catch(Exception e){
}
//从 accessTokenInfo 字符串获取出来两个值 access_token 和 openid
//把 accessTokenInfo 字符串转换 map 集合,根据 map 里面 key 获取对应值
//使用 json 转换工具 Gson
Gson gson = new Gson() ;
HashMap mapAccessToken = gson. fromJson (accessTokenInfo, HashMap. class) ;
Stringaccess_ token = (String) mapAccessToken. get(" access_ _token" ) ;
String openid = (String) mapAccessToken. get (" openid' ) ;
二、添加依赖
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId></dependency)
<!--commons-io-->
<dependency>
<groupId>commons-ioc/groupId>
<artifactId>conmons-ioc/artifactId>
</dependency>
<!--gson--)
<dependency>
<groupId>com.google.code.gson</groupId>
<artlfactId>gsonc/artifactId)</dependency>
2、创建 httpclient 工具类
放入util 包
HttpClientUtils.java
3、创建回调 controller 方法
在 WxApiControllerjava 中添加如下方法
/**
*1、获取回调参数
*2、从 redis 中读取 state 进行比对,异常则拒绝调用
*3、向微信的授权服务器发起请求,使用临时票据换取 access token
*4、使用上一步获取的 openid 查询数据库,判断当前用户是否已注册,如果已注册则直接进行登录操作
*5、如果未注册,则使用 openid 和 access token 向微信的资源服务器发起请求,请求获取微信的用户信息
*5.1、将获取到的用户信息存入数据库
*5.2、然后进行登录操作
*
*@param code
*@param state
*@return
*/
@GetMapping("callback")
public String callback(5tring code, String state){
//得到授权临时票据
code System.out.println(code); System.out.println(state);
//从 redis 中将 state 获取出来,和当前传入的 state 作比较
//如果一致则放行,如果不一致则抛出异常:非法访问
//向认证服务器发送请求换取 access_token
String baseAccessTokenUrl="https://api.weixin.ga.com/sns/oauth2faccess token" +
"?appid=%s*+
"&code-%s"+
"&secret=%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{
try{
Result=HttpClientUtils.get(accessTokenUr1);
System.out.println("accessToken============"+ result);
}catch (Exception e){
throw new GullException(20001,"获取access_token失败");
}
//解析 json 字符串
Gson gson· new Gson();
HashMap map=gson.fromJson(result,HashMap.class);
String accessToken-(String)map.get("access_token");
String openid-(String)map.get("openid");
//查询数据库当前用用户是否曾经使用过微信登录
Member member- memberService.getByOpenid(openid); if(member ==null){
三、具体操作
1.第一步
扫描之后,执行本地的 callback 方法,在 callback 获取两个值,在跳转时候传递过来
state:原样传递
临时票据
code:类似于手机验证码,随机唯一的值
2.第二步
拿着第一步获取到 code 值,请求微信提供固定的地址,获取到有两个值
(1)access_token: 访问凭证
(2)openid:每个微信唯一标识
3.第三步
拿着第二步获取到两个值 accesstoken 和 openid,再去请求一个微信提供固定地址,最终可以到微信扫描人信息。比如微信昵称,微信头像等等。
用到技术点:
(1) httpclient
(2)json 转换工具
fastjson gson jackson