今天接到一个需求,需要微信授权另一个项目(微信投票项目),但之前已经有一个项目(麦唱K歌房微信端)做了微信网页授权的业务,因为微信网页回调的地址只能填一个而且不能在上面加端口,所以就造成回调后直接返回到默认的80端口上了,所以就会出现一会回调到一个固定的页面上;
怎么解决这个问题呢?
增加一次重定向操作
说白了就一句话:就是最原始的链接上添加字段,专门准备一个页面发请求,拿到用户信息,根据字段在里面加判断条件跳转到不同的项目中去用,
其实微信授权原理很简单:
1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
怎么拿到code?
看到上面那个链接了么?里面有个redirect_uri 这个是回调的地址,你请求回来之后会跳到这个页面,此时微信会把code用 & 符号 链接到REDIRECT_URI连接上返回给你,如果想拿到的话就写个方法,从网页链接上截取code;
function queryParam(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r != null) return unescape(r[2]);
return null;
};//从网页上截取参数的方法
调用:var _code = queryParam("code"); 此时就拿到code了
其实为什么要有一个回调的页面地址呢?
不就是要拿到code吗?
那我们拿到code的话就不能多用了么?就只能服务于一个项目么?不能用code去服务两个,三个或者多个项目么?
答案是可以的!
接下来就是我要讲的:
增加一次重定向操作
看见上面的图了么?表示了大致意思
讲解:
最上面的请求回调其实就做了一件事-----拿到code;把code放到一个页面里
下面三个域名其实就是:
把拿到的code传到三个不同的页面中(也可以说成不同的域名----意思就是不用的项目放在不同的服务器上),然后用这个code换取网页授权access_token,然后再换取用户信息;
这样就突破了微信回调域名只能是一个的界限;
总结:就是最原始的链接上添加字段,专门准备一个页面发请求,拿到用户信息,在里面加判断条件跳转到不同的项目中去用,
bug:特别注意:
就是用code去 那token
调用这个链接
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的appid&secret=你的secret&code='.$code.'&grant_type=authorization_code
的时候会报错
报错信息如下:
{"errcode":40125,"errmsg":"invalid appsecret, view more at http://t.cn/RAEkdVq, hints: [ req_id: tQrXIA0696th19 ]"}
我猜想应该是微信知道你发请求的页面的域名不在你设置的回调域名下,这就很尴尬了,我后来百度了下,说是让重置一下appsecret,其实最根本的原因还是,不能一个服务号服务多个项目;
难道真的不行么?
最后我想了个办法,我这边在其他域名拿到code后直接把code在传到回调域名的服务器上,用后台语言拿code去换取用户信息,完了我这边在请求回调域名下的接口,让他把拿到的用户信息
字段再返还给我,我这边在进行操作,这样就合情合理了!
总结:就是最原始的链接上添加字段,专门准备一个页面发请求,拿到用户信息,在里面加判断条件跳转到不同的项目中去用,