• 169 阅读
  • 2 回复

GetWeixinCode OAuth2.0 中转桥

视频在线上传+队列转换FLV+水印+捉图+修复+获时+转3GP(API语言不限,开视频站必备!)
解决微信OAuth2.0网页授权只能设置一个回调域名的问题


https://github.com/HADB/GetWeixinCode

使用方法
    部署get-weixin-code.html至你的微信授权回调域名的目录下


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


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


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


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


    假设你的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


    这样最终就会跳转到这样一个地址: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.1.1',
                        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>
        
    本帖最后由 张小鱼 于 2017-11-15 12:46 编辑
    小鱼的淘宝店铺-多多支持哇
    视频在线上传+队列转换FLV+水印+捉图+修复+获时+转3GP(API语言不限,开视频站必备!)
    另外的解决方案比如使用微信第三方平台平台来解决多域名授权问题:https://open.weixin.qq.com/
    小鱼的淘宝店铺-多多支持哇

    CodeToAny:一个微信公众号网页授权给任何域名下的url

    视频在线上传+队列转换FLV+水印+捉图+修复+获时+转3GP(API语言不限,开视频站必备!)
    把从微信网页授权接口中获取到的授权code以get参数的形式传递给任何域名下的url。
    https://github.com/lionskys/codetoany

    成功案例
    微擎、微赞、discuz插件、wordpress插件

    环境需求
    • php >= 5.4.0(小于5.4.0的情况可以联系作者解决);
    极速使用
    1. 假设将网页授权回调域名设置为www.test.com
    2. 编辑codetoany/getcode.php,将变量$appId的值修改为自己的微信公众号AppId
    3. 将文件夹codetoany中的所有文件部署到http://www.test.com/codetoany/
    4. 在微信内或使用微信web开发者工具访问http://www.test.com/codetoany/getcode.php?auk=demo1,顺利的话,页面将跳转到类似这样的url:http://lionsay.com/?abc=123&code=0318PVx00bTFzB1JOny00YMRx008PVxS&state=STATE
    攻略指南
    1. ?auk=demo1中的aukdemo1以及此时的授权url(即接收授权code的url,最终跳转的url)都是可以自定义的;
    2. 网页授权接口中的get参数scopestate可以以get参数的形式传递给codetoany/getcode.php,程序会把它们再传递给接口;
    3. 除了get参数auk外,传递给codetoany/getcode.php的任何get参数都会以get参数的形式再传递给授权url
    4. 如果网页授权回调域名使用https协议访问,那么程序需要略微调整才可以正常使用;

    codetoany-master.zip (您是游客您没有权限下载)


    小鱼的淘宝店铺-多多支持哇