关于微信授权回调域名只能设置一个的解决办法

# GetWeixinCode

解决微信OAuth2.0网页授权只能设置一个回调域名的问题

## 使用方法


1. 部署`get-weixin-code.html`至你的微信授权回调域名的目录下

2. 使用方式类似于直接通过微信回调的方式,只是将回调地址改成了`get-weixin-code.html`所在的地址,另外省去了`response_type`参数(因为它只能为`code`)以及`#wechat_redirect`(它是固定的),它们会在`get-weixin-code.html`里面自己加上

3. `get-weixin-code.html`页面从微信那里拿到code之后会重新跳转回`redirect_uri`里面填写的url,并且在url后面带上`code`和`state`

## 详细示例


1. 前往微信公众平台->接口权限->网页授权获取用户基本信息->修改,填写授权回调页面域名,例如`www.abc.com`

2. 在`www.abc.com`域名下部署`get-weixin-code.html`,不一定是根目录,例如:`http://www.abc.com/xxx/get-weixin-code.html`

3. 假设你的`http://www.xyz.com/hello-world.html`这个页面需要获取微信授权,那么你应该使用以下地址来获取授权:`http://www.abc.com/xxx/get-weixin-code.html?appid=XXXX&scope=snsapi_base&state=hello-world&redirect_uri=http%3A%2F%2Fwww.xyz.com%2Fhello-world.html`

4. 这样最终就会跳转到这样一个地址:`http://www.xyz.com/hello-world.html?code=XXXXXXXXXXXXXXXXX&state=hello-world`,从而你就拿到了授权`code`以及自定义的`state`参数了

## 其他说明

- 通过多一次的跳转,解决了微信限制回调域名只能设置一个的问题

- 牺牲了一点用户体验,换来了项目部署的美感,不需要将各种项目都部署到一个域名下

**建议先弄懂微信授权回调的流程再使用本项目

 

以下是get-weixin-code.html 的代码:

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>微信登录</title>
</head>

<body>
    <script>
        var GWC = {
            version: '1.2.0',
            urlParams: {},
            appendParams: function (url, params) {
                if (params) {
                    var baseWithSearch = url.split('#')[0];
                    var hash = url.split('#')[1];
                    for (var key in params) {
                        var attrValue = params[key];
                        if (attrValue !== undefined) {
                            var newParam = key + "=" + attrValue;
                            if (baseWithSearch.indexOf('?') > 0) {
                                var oldParamReg = new RegExp('^' + key + '=[-%.!~*\'\(\)\\w]*', 'g');
                                if (oldParamReg.test(baseWithSearch)) {
                                    baseWithSearch = baseWithSearch.replace(oldParamReg, newParam);
                                } else {
                                    baseWithSearch += "&" + newParam;
                                }
                            } else {
                                baseWithSearch += "?" + newParam;
                            }
                        }
                    }

                    if (hash) {
                        url = baseWithSearch + '#' + hash;
                    } else {
                        url = baseWithSearch;
                    }
                }
                return url;
            },
            getUrlParams: function () {
                var pairs = location.search.substring(1).split('&');
                for (var i = 0; i < pairs.length; i++) {
                    var pos = pairs[i].indexOf('=');
                    if (pos === -1) {
                        continue;
                    }
                    GWC.urlParams[pairs[i].substring(0, pos)] = decodeURIComponent(pairs[i].substring(pos + 1));
                }
            },
            doRedirect: function () {
                var code = GWC.urlParams['code'];
                var appId = GWC.urlParams['appid'];
                var scope = GWC.urlParams['scope'] || 'snsapi_base';
                var state = GWC.urlParams['state'];
                var isMp = GWC.urlParams['isMp']; //isMp为true时使用开放平台作授权登录,false为网页扫码登录
                var baseUrl;
                var redirectUri;

                if (!code) {
                    baseUrl = "https://open.weixin.qq.com/connect/oauth2/authorize#wechat_redirect";
                    if (scope == 'snsapi_login' && !isMp) {
                        baseUrl = "https://open.weixin.qq.com/connect/qrconnect";
                    }
                    //第一步,没有拿到code,跳转至微信授权页面获取code
                    redirectUri = GWC.appendParams(baseUrl, {
                        'appid': appId,
                        'redirect_uri': encodeURIComponent(location.href),
                        'response_type': 'code',
                        'scope': scope,
                        'state': state,
                    });
                } else {
                    //第二步,从微信授权页面跳转回来,已经获取到了code,再次跳转到实际所需页面
                    redirectUri = GWC.appendParams(GWC.urlParams['redirect_uri'], {
                        'code': code,
                        'state': state
                    });
                }

                location.href = redirectUri;
            }
        };

        GWC.getUrlParams();
        GWC.doRedirect();
    </script>
</body>

</html>

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要跳转到微信授权页面并设置回调地址,你可以按照以下步骤进行操作: 1. 构造授权链接:使用你的公众号的 AppID 和回调地址,构造一个跳转到微信授权页面的链接。授权链接的格式如下: ``` https://open.weixin.qq.com/connect/oauth2/authorize?appid=YOUR_APPID&redirect_uri=YOUR_REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect ``` 其中,`YOUR_APPID`是你的公众号的 AppID,`YOUR_REDIRECT_URI`是你设置回调地址,`SCOPE`是授权作用域,可以是snsapi_base或snsapi_userinfo,`STATE`是自定义参数,用于传递额外的信息。 2. 用户跳转到授权页面:将构造好的授权链接重定向到微信授权页面,引导用户访问该链接。 3. 用户授权并重定向回调地址:用户在微信授权页面确认授权后,微信会将用户重定向到你设置回调地址,并附带一个授权临时票据 code 参数。 4. 在回调地址中处理授权临时票据:在你设置回调地址对应的后端接口中,获取到微信返回的授权临时票据 code,并进行后续的处理。 在实际操作中,你需要根据你使用的后端技术栈来处理上述步骤。一般来说,你可以在前端页面中构造授权链接,并通过重定向或者跳转到该链接来引导用户进行授权。在后端接口中,你可以获取到微信返回的授权临时票据 code,并进行下一步的操作,比如通过 code 换取 access_token、拉取用户信息等。 记得将你的回调地址添加到微信公众平台的网页授权回调域名中,以确保能够正常回调到你的接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值