开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):微信扫描登录(获取扫描人信息)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11464
微信扫描登录(获取扫描人信息)
目录:
一、WxApiController.java代码演示
二、具体操作
三、代码讲解
一、WxApiController.java 代码演示
import com.atguigu.educenter.entity.UcenterMember;
import com.atguigu.educenter.service.UcenterMemberService;import com.atauigu,educenter.utils.ConstantWxUtils;
import com.atguigu.educenter.utils.HttpClientUtils;
Importcom.atguigu.servicebase.exceptionhandler.
GuliException: import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype,Controller;
import org. springframework.web.bind.annotation.*;
import java.net.URLEncoder:
import java.util.HashMap:
@CrossOrigin
@Controller
//只是请求地址,不需要返回数据
@RequestMapping("/api/ucenter/wx")
public class WxApiController {
@Autowired
private UcenterMemberService memberService;
@GetMapping("callback)
//2获取扫描人信息,添加数据
public String callback(String code, String state){
try {
//获取 code 值,临时票据,类似于验证码
//拿着 code 请求微信固定的地址,得到两个值 accsesstoken 和 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 accessTokenUrlF String. format(
baseAccessTokenUrl,
ConstantWxUtils. WX_OPEN_APP_ID
ConstantWxUtils. WX_OPEN_APP_SECRET
code
);
//请求这个拼接好的地址,得到返回两个值 accsesstoken 和 openid
//使用 httoclient 发送请求,得到返回结果
String accessTokenInfo=HttpClientUtils.get(accessTokenUrl);
//MaccessTokenInfo 字符串获取出来两个值 accsess_token 和 openid
//把 accessTokenInfo 字符串转换 map 集合,根据 map 里面 key 获取对应值
//使用 json 转换工具 Gson
Gson gson=newGson():
HashMap mapAccessToken=gson.fromJson(accessTokenInfo, HashMap.class):
Stringaccess_token(String)mapAccessToken.get("access_token"):Stringopenid(String)mapAccessToken.get("openid):
//3拿着得到 accsesstoken 和 openid,再去请求微信提供固定的地址,获取到扫描人信意访问微信的资源服务器,获取用户信息
String baseUserInfoUrl="https://api.weixin.qq.com/sns/userinfo"+
”?access_ token=%s" +
"&openid=%s";
//拼接两个参数
String userInfoUrl = String.format(
baseUserInfoUrl, access_token, openid);
);
//发送请求
String userInfo = HttpClientUtils. get (userInfoUrl):
获取返回 userinfo 字符串扫描人信息
String userInfo= HttpClientUtils.get(userInfoUrl): I
HashMap userInfoMap =gson.fromJson(userInfo, HashMap.class): String nickname =(String)userInfoMap.get("nickname");
//呢称
String headimgurl=(String)userInfoMap.get("headimgurl”);
//头像
//把扫描人信息添加数据库里面
//判断数据表里而是否存在相同微信信息,根据 openid 利断
UcenterMember member =memberService.getOpenIdMember(openid):
if(member = null) {
//memeber 是空,表没有相同微信数据,进行添加
member = new Ucenterlember)): member.setOpenid(openid):
member. setNickname(nickname) member.setAvatar(headimgurl) memberService.save(member):
//最后:返回首页面
return "redirect:http://localhost:3000";]catch(Exception e) {
throw new GuliException(20001,"登录失败):
//1生成微信扫描二维码
@GetMapping("login")
public String getWxCodeO(
@GetMapping("login")
public String getWxCode (){
//固定地址,后面拼接参数
String url = "https://open. weixin. qq. com/"+
connect/qrconnect?appid= "ConstantWxUtils. WX_ OPEN _APP_ ID"+ &response_ type=code" ;
二、具体操作
1.第一步
扫描之后,执行本地的 callback 方法,在 callback 获取两个值,在跳转时候传递过来
state:原样传递
临时票据
code:类似于手机验证码,随机唯一的值
2.第二步
拿着第一步获取到 code 值,请求微信提供固定的地址,获取到有两个值
(1)access_token: 访问凭证
(2)openid:每个微信唯一标识
3.第三步
拿着第二步获取到两个值 accesstoken 和 openid,再去请求一个微信提供固定地址,最终可以到微信扫描人信息。比如微信昵称,微信头像等等。
用到技术点:
(1) httpclient
(2)json 转换工具
fastjson gson jackson
三、代码讲解
1.拿着得到的 access_token 和 openid ,
再去请求微信提供固定的地址,获取到扫描人信息,访问微信的资源服务器,获取用户信息
String baseUserInfoUrl =" 'https://api. weixin. qq. com/ 'sns/userinfo" +
"?access_ token-%s" +
" &openid=%s" ;
2.拼接两个参数
String userInfoUrl = String. format(
baseUser InfoUrl,
access_ token,
openid
);
3.发送请求
String userInfo = HttpClientUtils. get (userInfoUrl) ;
4.获取返回 userinfo 字符串扫描人信息
HashMap userInfoMap = gson. fromJson (userInfo, HashMap. class) ;
String nickname = (String) userInfoMap. get (' nickname' );
//昵称
String headimgurl = (String) userInfoMap. get (' 'headimgurl' );
//头像
5.把扫码人信息添加到数据库里面
6.判断数据表里面是否存在相同微信信息,根据 openid 判断
UcenterMember member = memberService. get0penIdMember (openid);
if(member = null) {
// memeber 是空,表没有相同我微信数据,进行添加
member = newUcenterMember 0;
member. set0penid(openid) ;
member. setNickname (nickname) ;
member. setAvatar (headimgur1) ;
memberService. save (member) ;
}
根据 openid 判断
@0verride
public UcenterMember get0penIdMember (String openid){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper. eq( column:" openid" , openid) ;
UcenterMember member = baseMapper. select0ne (wrapper) ;
return member ;
}
7.最后:返回首页面
return” redirect :http://localhost:3000" ;
} catch(Exception e) {
throw new GuliException(20001,"登录失败”) ;
}
}