微信开放平台实现扫码登录(java)

微信开放平台实现扫码登录(java)微信第三方登录准备阶段微信官方文档准备工作在进行第三方授权登录之前,需要在微信开放平台注册开发者账号,拿到相应的AppId和AppSecret以及redirect_uri,即可进行授权接入流程授权流程说明整体流程分:1.第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;2.通过code参数加上AppID和AppSecret等,通过API换取access_token;3.通过access_token进行接口调

大家好,又见面了,我是你们的朋友全栈君。

微信第三方登录准备阶段

微信官方文档

准备工作

在进行第三方授权登录之前,需要在微信开放平台注册开发者账号,拿到相应的AppId和AppSecret以及redirect_uri,即可进行授权接入流程

授权流程说明
在这里插入图片描述
整体流程分:

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

第一步:请求code
根据参数访问链接获取授权信息
用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数;
若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数
在这里插入图片描述

 String oauthUrl = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
        String redirect_uri = URLEncoder.encode(WXConfig.CALLBACK, "utf-8");
        oauthUrl = oauthUrl.replace("APPID", WXConfig.PC_JSID).replace("REDIRECT_URI", redirect_uri).replace("SCOPE", WXConfig.SCOPE);
        model.addAttribute("oauthUrl", oauthUrl);
        model.addAttribute("appid", WXConfig.PC_JSID);
        model.addAttribute("scope", WXConfig.SCOPE);
        model.addAttribute("redirect_uri", redirect_uri);

前端通过回调链接生成二维码:
在这里插入图片描述
第二步:通过code获取access_tokeen

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

在这里插入图片描述
第三步:通过access_token调用接口
获取access_token后,进行接口调用,有以下前提:

1. access_token有效且未超时;
2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

获取用户个人信息:

授权作用域(scope) 接口
snsapi_userinfo /sns/userinfo

参考代码:

 public Map<String, String> pcCode2Session(String js_code) throws UnsupportedEncodingException { 

//1.通过code获取access_token
String url = WXConstants.DOMAIN_API + WXConstants.OAUTH2_URL_SUFFIX
+ "?appid=" + WXConfig.PC_JSID + "&secret="
+ WXConfig.PC_JSSECRET + "&code="
+ js_code + "&grant_type=authorization_code";
String result = restTemplate.getForObject(url, String.class);
if (result != null && result.trim().length() != 0) { 

JSONObject json = JSONObject.parseObject(result);
Integer code = json.getInteger("errcode");
if (code == null || code == WXConstants.SUCCESS) { 

//获取access_token
Map<String, String> map = new HashMap<>();
map.put("access_token", json.getString("access_token"));
map.put("expires_in", json.getString("expires_in"));
map.put("refresh_token", json.getString("refresh_token"));
map.put("openid", json.getString("openid"));
map.put("scope", json.getString("scope"));
map.put("unionid", json.getString("unionid"));
//通过access_token和openid获取用户个人信息(头像、昵称)
String url_user = WXConstants.DOMAIN_API + WXConstants.USERINFO_URL_SUFFIX
+ "?access_token=" + json.getString("access_token") + "&openid="
+ json.getString("openid");
String result_user = restTemplate.getForObject(url_user, String.class);
result_user = new String(result_user.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("--------result2="+result_user);
if (result_user != null && result_user.trim().length() != 0) { 

JSONObject json_user = JSONObject.parseObject(result_user);
Integer code_user = json_user.getInteger("errcode");
System.out.println("======="+code_user);
if (code_user == null || code_user == WXConstants.SUCCESS) { 

//用户头像url
map.put("headimgurl", json_user.getString("headimgurl"));
//用户昵称
map.put("nickname", json_user.getString("nickname"));
}
}
return map;
} else { 

LOGGER.error("微信JSAPI请求失败:{}", result);
}
} else { 

LOGGER.error("微信JSAPI请求失败:null");
}
return null;
}

注:未调用刷新access_token有效期,因为项目中已经做了超时处理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/131603.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • XmlDocument类

    XmlDocument类XmlDocument类是.NET框架的DOC解析器。XmlDocument将XML视为树状结构,它装载XML文档,并在内存中构建该文档的树状结构。下面来看下XmlDocument提供了哪些功能。一

  • c语言strstr的使用及模拟实现strstr函数[通俗易懂]

    c语言strstr的使用及模拟实现strstr函数[通俗易懂]c语言strstr的使用及模拟实现strstr函数

    2022年10月10日
  • c# mysql executenonquery_C#与数据库访问技术之ExecuteNonQuery方法

    c# mysql executenonquery_C#与数据库访问技术之ExecuteNonQuery方法ExecuteNonQuery方法主要用来更新数据。通常使用它来执行Update、Insert和Delete语句。该方法返回值意义如下:对于Update、Insert和Delete语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为-1。Command对象通过ExecuteNonQuery方法更新数据库的过程非常简单,需要进行的步骤如下:(1)创建数据库连接。(2)创建Command…

  • Linux基础_vim命令

     使用过LINUX操作系统的人应该都知道vim命令可以编写文本,对于没有接触过的同学通过以下介绍就可以轻松学会vim命令的使用方法。1.vim的工作模式 vim有三种工作模式,分别为命令模式,插入模式和退出模式。命令模式下不能编辑文本,通过i进入插入模式进行编辑,编辑完成后通过Esc键进入命令模式,在命令模式下输入:wq进行保存退出,其中w表示保存,q表示退出。2.vim常用工作参…

  • Java链表——创建链表对象

    Java链表——创建链表对象链表是一种简单的数据结构。由两部分构成,数值部分和指针部分。前一部分用来存储数据,后一部分用于指向下一个数据。形成一个链状的结构。​​​​​​​…

  • strtoul函数的使用

    strtoul函数的使用函数原型:参数1:字符串起始地址参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号