微信授权登录

需求

用户可以直接微信扫码进行扫码便捷登录

应该理解扫码登录只是应用层,获取其他端登录状态 协助登录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

第三方代公众号发起授权登录文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Before_Develop/Official_Accounts/official_account_website_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去刷新

posted @   意犹未尽  阅读(950)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2018-11-24 Spring Cloud-Eureka实现服务的注册与发现(二)
点击右上角即可分享
微信分享提示