建议先阅读微信开发-网页授权登录官方文档:

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

1、第一步:用户同一授权,获取code

​ 前台请求链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
获取code

​ 参数说明:

参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,
只能获取用户openid),snsapi_userinfo (弹出授权页面,
可通过openid拿到昵称、性别、所在地。并且, 即使在未关
注的情况下,只要用户授权,也能获取其信息 )
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

​ 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

​ scope参数有两种,snsapi_base 和 snsapi_userinfo

  • snsapi_base:静默方式,用户感知为0,无需用户手动点击认证按钮,但是只能获取用户openid 和 unionid,
  • snsapi_userinfo:非静默方式,可以获取到openid、昵称、头像、所在地等信息。需要用户手动点击认证按钮

2 第二步:通过code换取网页授权

​ 获取code后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

​ 参数说明:

参数 是否必须 说明
appid 公众号的唯一标识
secret 公众号的appsecret
code 填写第一步获取的code参数
grant_type 填写为authorization_code

​ 返回说明:

​ 正确时返回的JSON数据包如下:

{"access_token":"ACCESS_TOKEN", //网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同"expires_in":7200, //access_token接口调用凭证超时时间,单位(秒)"refresh_token":"REFRESH_TOKEN", //用户刷新access_token"openid":"OPENID",    //用户唯一标识"scope":"SCOPE",    //用户授权的作用域,使用逗号(,)分隔"unionid": "UNIONID"   //unionid
}

​ 错误时返回的JSON数据(示例为code无效错误)

{"errcode":40029,"errmsg":"invalid code"
}

​ 此处的access_token是特殊的网页授权的access_token, 与基础调用接口的access_token不同,

​ snsapi_base式的网页授权流程即到此为止。

3 第三步:刷新access_token(如果需要)

​ 由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

请求方法

获取第二步的refresh_token后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

参数 是否必须 说明
appid 公众号的唯一标识
grant_type 填写为refresh_token
refresh_token 填写通过access_token获取到的refresh_token参数

返回格式与第二步一致

4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

请求方法

http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明

参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
openid 用户的唯一标识
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

返回说明

正确时返回的JSON数据包如下:

{   "openid":" OPENID","nickname": NICKNAME,"sex":"1","province":"PROVINCE","city":"CITY","country":"COUNTRY","headimgurl":       "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 描述
openid 用户的唯一标识
nickname 用户昵称
sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
province 用户个人资料填写的省份
city 普通用户个人资料填写的城市
country 国家,如中国为CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

错误时微信会返回JSON数据包如下(示例为openid无效):

{"errcode":40003,"errmsg":" invalid openid "}

回调示例:

@ApiOperation(value = "微信网页授权")
@RequestMapping(value = "/web/page/auth", method = RequestMethod.GET)
public JSONObject webPageAuth(String code, String state) throws Exception {if (StringUtils.isEmpty(code)) {return Response.fail("登录失败");}SessionUserInfo sessionUserInfo = new SessionUserInfo();PcWechatAccessToken pcWechatAccessToken = new PcWechatAccessToken();//pcWechatAccessToken封装的实体对象//subAppId公共号appid//subAppSercet公共号的appsecret//code传入的第一步获取的code参数pcWechatAccessToken.setAppId(subAppId);pcWechatAccessToken.setAppSerect(subAppSercet);pcWechatAccessToken.setCode(code);Boolean wechatLogin = usersService.wechatLogin(pcWechatAccessToken);if (wechatLogin) {return Response.succ("登录成功");} else {return Response.fail("登录失败");}
}

wechatLogin示例代码:

/*** 微信网页授权登录** @param pcWechatAccessToken pcWechatAccessToken*/
@Override
public Boolean wechatLogin(PcWechatAccessToken pcWechatAccessToken) {//accessUrl=https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_codeString access_Url = String.format(accessUrl, pcWechatAccessToken.getAppId(), pcWechatAccessToken.getAppSerect(), pcWechatAccessToken.getCode());try {String body = httpClientInstance.get(access_Url);LinkedHashMap<String, Object> map = new ObjectMapper().readValue(body, LinkedHashMap.class);if (MapUtils.isEmpty(map)) {logger.error("网页授权请求失败:map:{}", map);return false;}if (null != map.get("errcode")) {logger.error("网页授权请求失败:errmsg:{}", map.get("errmsg"));return false;}String openId = (String) map.get("openid");if (StringUtils.isNotEmpty(openId)) {UserWebPageAuth insert = new UserWebPageAuth();insert.setOpenId(openId);insert.setExpiresIn((Integer) map.get("expires_in"));insert.setAccessToken((String) map.get("access_token"));insert.setRefreshToken((String) map.get("refresh_token"));if (null != map.get("unionid")) {insert.setUnionId((String) map.get("unionid"));}insert.setScope((String) map.get("scope"));String access_token = (String) map.get("access_token");String url = String.format(userInfoUrl, access_token, openId);//获取用户详细信息String userInfoBody = httpClientInstance.get(url);LinkedHashMap<String, Object> userInfoMap = new ObjectMapper().readValue(userInfoBody, LinkedHashMap.class);if (MapUtils.isEmpty(userInfoMap)) {logger.error("网页授权请求微信信息为空:{}", userInfoMap);return false;}if (null != userInfoMap.get("errcode")) {logger.error("网页授权请求用户信息错误:{}", userInfoMap.get("errmsg"));return false;}String unionId = (String) userInfoMap.get("unionid");insert.setUnionId(unionId);insert.setNickname((String) userInfoMap.get("nickname"));insert.setLanguage((String) userInfoMap.get("language"));insert.setCity((String) userInfoMap.get("city"));insert.setProvince((String) userInfoMap.get("province"));insert.setCountry((String) userInfoMap.get("country"));insert.setSex((Integer) userInfoMap.get("sex"));insert.setHeadimgurl((String) userInfoMap.get("headimgurl"));insert.setPrivilege(JSONObject.toJSONString(userInfoMap.get("privilege")));userWebPageAuthService.insert(insert);}} else {logger.error("网页授权失败,openid获取失败,openid为空");return false;}} catch (Exception e) {logger.error("请求微信获取access_token失败:{}", e.getMessage());}return true;
}

HttpClientInstance示例代码:

@Component
public class HttpClientInstance {@AutowiredCloseableHttpClient httpClient;public String get(String url) throws Exception {return getResponseContent(url, new HttpGet(url));}private String getResponseContent(String url, HttpRequestBase request) throws Exception {HttpResponse response = null;try {response = httpClient.execute(request);return EntityUtils.toString(response.getEntity(), "UTF-8");} catch (Exception e) {throw new Exception("got an error from HTTP for url : " + URLDecoder.decode(url, "UTF-8"), e);} finally {if (response != null) {EntityUtils.consumeQuietly(response.getEntity());}request.releaseConnection();}}
}

微信网页授权登录java后台实现相关推荐

  1. java ajax 微信网页授权_ajax 实现微信网页授权登录的方法

    AJAX 的 ajax 实现微信网页授权登录的方法 项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个ph ...

  2. 微信公众号开发(一) 微信网页授权登录

    微信网页授权登录 前期准备 授权登录 获取微信数据 处理授权拒绝 前期准备 1.微信公众号开发,首先要搞一个公众号,开发阶段可以申请一个公众平台测试账号. (进入到微信公众公众平台,找到开发者工具,点 ...

  3. 微信小程序登录Java后台接口

    微信小程序登录java后台接口 首先看一下微信小程序的开发文档: 微信小程序开发文档 步骤: 小程序端向微信接口服务发送请求--wx.login():获取到登录临时凭证code 小程序端拿着获取到的c ...

  4. SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  5. php微信授权ajax,ajax 实现微信网页授权登录

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个PHPer ,所以,微信开发采用的是 EasyWeCha ...

  6. 微信网页授权登录的方法

    微信网页授权登录官方文档 微信网页授权登录的方法–推荐文章一 微信网页授权登录的方法–推荐文章二 总结: 微信授权方式(scope的属性值控制): 应用授权作用域,snsapi_base (不弹出授权 ...

  7. Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  8. php微信登录代理转发,PHP微信网页授权登录

    PHP微信网页授权登录 2018年04月10日 15:44:03阅读数:601 namespace Org\WeChat; /** * 微信授权相关接口 */ class Wechat { //高级功 ...

  9. 支付宝小程序授权登录 (Java 后台篇)

    支付宝小程序授权登录 (Java 后台篇) 开始 : 实现支付宝小程序授权登录功能, 本文主要是介绍支付宝小程序授权登录流程,与关键登录与处理代码. 流程 : 关键代码 : 1.获取用户信息 /*** ...

最新文章

  1. db2 如何导出insert语句_实用技术:MYSQL特别实用的几种SQL语句送给大家,让你的SQL高大上...
  2. git pull遇到错误
  3. python表白源代码-python七夕浪漫表白源码
  4. postgresql 9.1 暂停 stream 后使用 rsync 异机同步文件
  5. 计算机视觉与图像处理、模式识别、机器学习学科之间的关系
  6. 金蝶显示中间服务器忙,金蝶显示云服务器繁忙怎么回事
  7. Trial accounts of SAP Cloud Platform do not provide an Identity Authentication tenant
  8. ZK tree使用mold
  9. 轴承配合公差表查询_如何选择轴承公差和配合,才能更好保证电机轴承系统的运行?...
  10. 为Python终端提供持久性历史记录
  11. Redis学习总结(8)——Redis常见使用场景总结
  12. python画六角图_六角图的画法
  13. JavaScript — 原生js实现上传图片控件
  14. windows 邮件系统收发163邮件
  15. js计算100以内所有奇数的和
  16. 小程序设置发送验证码倒计时
  17. 云计算的三种服务模式:IaaS,PaaS和SaaS
  18. 微信小程序:uu传书
  19. ecmascript2015
  20. 查看计算机硬件配置方法(包括内存条、显卡型号,卡槽还剩几个)

热门文章

  1. 再谈SQL注入入侵动网SQL版
  2. 绘制四分之一圆、半圆、椭圆、半椭圆(向上)
  3. 画四分之一玫瑰图-antvg2
  4. mapreduce实战:统计美国各个气象站30年来的平均气温项目分析(MapReduce处理多文件数据)
  5. 计算高温舒适低温天数 平均气温 文件读取
  6. 内推 | 【泰隆银行-总行-数据分析岗】杭州 年薪35W
  7. echarts中的map地图的使用
  8. python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...
  9. 空降进阿里的 P10 都是什么人?
  10. vue学习项目supermall的数据接口问题