最近项目中遇到一个自己之前没有接触过的新功能,即就是要生成一个二维码,微信用户扫码可以进行登录,并把用户的信息,如:昵称,头像、省份...获取到并入库。
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 微信开放文档地址。
一:先说怎样生成二维码?
1.可以百度“草料二维码”,可以利用网站生成二维码。前提是要输入一个URL,才可以生成这个二维码;
2.此URL就是
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
,要改动的就是openid,和redirect_uri,这个edirect_uri就是回调域名,公众号上面配置的(前端工程师做的);至此二维码生成了。
二:扫码获取用户信息?扫码调下面的接口
由于之前接触过微信支付,知道怎样获取openid,不懂得朋友可以去我的另一篇
《全面详细的微信支付思路流程以及项目代码分享》https://blog.csdn.net/zhangleiyes123/article/details/82857195中去了解,接下来就是怎样获取到用户信息,进入到微信公众号查找相关文档,获取用户信息有两个接口,我们要使用第二个接口,
//获取用户信息接口 此接口的access_token 是接口基础调用access_token 不是网页授权access_token
//public static String GET_USERINFO="https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN";
//获取用户信息接口 此接口是网页授权access_token
public static String GET_USERINFO="https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN";
直接上代码:
/**
* 获取openId 微信登录 获取用户姓名
* @param code
* @return
*/
@ApiOperation(value="根据code获取openid",notes="")
@GetMapping("/getOpenId")
public BaseResult getOpenId(@RequestParam("code") String code){
Map<String,Object> map = new HashMap<String,Object>();
Map<String,Object> map1 = new HashMap<String,Object>();
Map<String, Object> result = new HashMap<String,Object>();
try {
map.put("status", 0);//默认失败
map.put("appId", WxPayConfig.APPID);//为了给前端用
if(!StringUtil.isNullOrEmpty(code)){//有code
//请求api获取openid(获取access_token,access_token里面带有openid)
String str = HttpInvoker.sendGetRequest(StringUtil.format(WxPayConfig.GET_OPENID, new Object[]{WxPayConfig.APPID,WxPayConfig.APPSECRET,code}));
//将json转map
Map<String, Object> toMap = WeixinUtil.jsonStrToMap(str);
if(!StringUtil.isNullOrEmpty(toMap.get("openid"))){//获取openid成功
map.put("status", 1);//成功
map.put("openId", toMap.get("openid").toString());
map.put("access_token", toMap.get("access_token").toString());
//=================================================================================
//获取用户信息
String str1 =HttpInvoker.sendGetRequest(StringUtil.format(WxPayConfig.GET_USERINFO, new Object[]{toMap.get("access_token").toString(),toMap.get("openid").toString()}));
//将json转map
Map<String, Object> toMap1 = WeixinUtil.jsonStrToMap(str1);
map1.put("nickname", toMap1.get("nickname").toString());//微信名
map1.put("sex",toMap1.get("sex").toString());//性别 值为1时是男性,值为2时是女性,值为0时是未知
map1.put("province",toMap1.get("province").toString());//省
map1.put("city",toMap1.get("city").toString());//城市
map1.put("country",toMap1.get("country").toString());//国家
map1.put("headimgurl",toMap1.get("headimgurl").toString());//用户头像
if(!StringUtils.isEmpty(str) && !StringUtils.isEmpty(str1)) {
User user=userRepo.findByOpenId(toMap.get("openid").toString());
if(user==null) {
//用户设置用户名和openid
User user1=new User(toMap1.get("nickname").toString(),toMap.get("openid").toString());
userRepo.save(user1);
}
result.put("openid", toMap.get("openid").toString());
result.put("nickname", toMap1.get("nickname").toString());
}
return new BaseResult(Constants.SUCCESS_CODE,Constants.SUCCESS_MSG,result);//返回openid
}else {
return new BaseResult(Constants.ERROR_CODE,Constants.ERROR_MSG,"获取openid失败");
}
}else {
return new BaseResult(Constants.ERROR_CODE,Constants.ERROR_MSG,"没有传入code值");
}
} catch (Exception e) {
e.printStackTrace();
return new BaseResult(Constants.EXCEPTION_CODE,Constants.EXCEPTION_MSG);
}
}
现在,数据库中就有扫码人的信息了。
相关参考链接:https://blog.csdn.net/qq_33696345/article/details/80521077