微信授权登录
需求
用户可以直接微信扫码进行扫码便捷登录
应该理解扫码登录只是应用层,获取其他端登录状态 协助登录PC端。 不依赖微信也可以(比如构建oauth2链接 生产二维码)
关于扫码 本质就是让用户微信内核浏览器打开auth2 url,然后微信302 重定向回调url 回传 auth_code, 根据应用id 和前面根据auth_code获取用户微信信息 进行自己系统身份绑定。
关于可信域名和可信ip
可信域名主要是微信相关回调和跳转(如auth2登录redirectUri,各种事件)
可信ip用于调用相关api的限制 比如服务端调用微信接口发送消息等接口
如果有跳转其他域名需求 通过微信配置的可信域名的地址 再做一次中转 比如先跳到统一个rediret再根据业务从自己服务器redirect到其他
如以下authUrl戴上了一个auth_callback_url 所有请求都到中转url然后再原封不动的转发到真正的处理类。
{ "status": 0, "result": { "authUrl": "https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&response_type=code&scope=snsapi_base&state=be1c276f00764d3a9e24dc68ed27fe17&redirect_uri=https%3A%2F%2Fweixinmp.itkeeping.com%2Fp3%2Fthird_channel_auth_callback_adapter?auth_callback_url=https://13428343733.itkeeping.com&connect_redirect=1#wechat_redirect", "state": "be1c276f00764d3a9e24dc68ed27fe17" }, "timestamp": 1675401914744 }
关于我的逻辑
/** * 因为可信域名只能配一个,各个环境中转点 * 因为可信域名只有一个 兼容独立版 独立域名 * * @throws DecoderException */ @RequestMapping(value = "p3/third_channel_auth_callback_adapter", method = RequestMethod.GET) @ResponseBody public void authCallbackAdapter() { log.info("authCallbackAdapter auth_callback_url={}", Mvcs.getRequestParameter("auth_callback_url")); String auth_callback_url = Mvcs.getRequestParameter("auth_callback_url") + "/p3/third_channel_auth_callback"; Map<String, String[]> params = Mvcs.getRequestParameterMap(); //真实的回调则不回传auth_callback_url String paramStr = params.keySet().stream().filter(c -> !"auth_callback_url".equals(c)).map(c -> c + "=" + params.get(c)[0]).collect(Collectors.joining("&")); auth_callback_url += (auth_callback_url.contains("?") ? "&" : "?") + paramStr; log.info("#111 auth_callback_url={}", auth_callback_url); Mvcs.redirect302(auth_callback_url); }
1.扫码生产,生产使用测试公众号构建auth2连接 { "status": 0, "result": { "authUrl": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2a8caf88189bf96d&response_type=code&scope=snsapi_base&state=b5f4a929ed0a4c7c90b9df78a81a2829&redirect_uri=http%3A%2F%2Fweixinmp.itkeeping.com%2Fp3%2Fthird_channel_auth_callback_adapter?auth_callback_url=http://help.ewei.com&connect_redirect=1#wechat_redirect", "state": "b5f4a929ed0a4c7c90b9df78a81a2829" }, "timestamp": 1676518537690 } https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2a8caf88189bf96d&response_type=code&scope=snsapi_base&state=b5f4a929ed0a4c7c90b9df78a81a2829&redirect_uri=http%3A%2F%2Fweixinmp.itkeeping.com%2Fp3%2Fthird_channel_auth_callback_adapter?auth_callback_url=http://help.ewei.com&connect_redirect=1#wechat_redirect redirect_url=http://weixinmp.itkeeping.com/p3/third_channel_auth_callback_adapter?auth_callback_url=http://help.ewei.com 2.微信授权成功跳回redirectUri 3.回调处理器通过auth_callback_url 拼接 "/p3/third_channel_auth_callback" 发送302 http://help.ewei.com/p3/third_channel_auth_callback ------------------------测试环境测试生产公众号------------------------ 1.测试环境使用生产构建outh2链接 https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2a8caf88189bf96d&response_type=code&scope=snsapi_base&state=b5f4a929ed0a4c7c90b9df78a81a2829&redirect_uri=http%3A%2F%2Fweixinmp.ewei.com%2Fp3%2Fthird_channel_auth_callback_adapter?auth_callback_url=http://13428343733.itkeeping.com&connect_redirect=1#wechat_redirect redirect_url=http://weixinmp.ewei.com/p3/third_channel_auth_callback_adapter?auth_callback_url=http://13428343733.itkeeping.com 2.微信授权成功跳回redirectUri 3.回调处理器通过auth_callback_url 拼接 "/p3/third_channel_auth_callback" 发送302 http://13428343733.itkeeping.com/p3/third_channel_auth_callback
方案一、网页授权扫码登录
公众号网页授权登录文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
步骤1:
生成一个url 二维码,这个url只是用于判断扫描的是什么终端的中转比如飞书、钉钉、微信、支付宝等,对于不同渠道跳转到不同的授权页面
步骤2:
以微信为例,到了我们的登录也有个授权登录按钮这个按钮跳转到网页授权url 指定公众号appid 以及回调地址
redirect_url需要设置可信域名
https://open.weixin.qq.com/connect/oauth2/authorize?appid={公众号app_id}&redirect_uri={url}&response_type=code&scope=snsapi_base&state={重定向带回的自定义参数}&connect_redirect=1#wechat_redirect

此文件要上传到服务器 保证通过域名可以访问
步骤3:
在微信内部打开此url就会触发授权,我们是通过扫码打开url实现 回调会带上我们的自定义参数 和code
微信回调
http://callback.com/?code=041huBHa1gXFgE0Lo4Ia10SYdW3huBHP&state=NRjZvkcLRznLwpXaLByQdBCfoXPLDCWC
通过code换取token同时会返回openid
https://api.weixin.qq.com/sns/oauth2/access_token?appid={公众号appid}&secret=#{公众号secret}&code=041huBHa1gXFgE0Lo4Ia10SYdW3huBHP&grant_type=authorization_code
res
{ "access_token": "63_2LoEEVm5GXlIGp7a9NJLp4IbfMeGyuJiS2_Oz7rjvThHiZwnlEStABj58QZ_ITnLgA7IUFD6Sy7Xxapwc5exDE7l8cT7Rlb_4vVXLL1LomM", "expires_in": 7200, "refresh_token": "63_F64llR3VFJaf768SU9JrR2SQ-YNU8yJCVShO_jEsYOjcaES8KcExq-IY4sdTId99NoQVJiiDNZNaZxEbgOJFNND500KW_87Y73xjAY9cEf0", "openid": "oq6Hd6saCUgra8SQFiqtC4dbGisw", "scope": "snsapi_base" }
步骤4:
通过open_id去查询用户绑定用户,如果绑定直接登录成功 下发token,未绑定触发绑定逻辑
注:需要拿用户其他信息 需要用户关注公众号
异常解决
通过微信复制回调连接或者转发没有带有code 纠结了好久,其实抓包是有的 还有就是需要注意自身系统有没有重复重定向
关于refresh_token
以前不知道为什么还要这个,获取token接口每日需要限额,避免大规模泄露,后续刷新需要使用refresh_token去刷新
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2018-11-24 Spring Cloud-Eureka实现服务的注册与发现(二)