微信之门-授权接口
Why?
微信打开的网页,是无法持久存贮 cookies 的,你知道吗?
那么如何辨识唯一用户呢?
是的,使用微信服务号!服务号拥有高级接口,可以给让网站通过微信的OAuth2授权, 获得用户的 OpenID, 从而辨别一个唯一用户。
那么,没有微信服务号呢?
这就是微信之门诞生的原因。
微信之门已经被调用 42670572 次.
How?
使用非常简单!
对于任意需要辨识唯一用户的网站,有两种方式:
1. 使用WgateJs
登录系统,在“网站管理”中添加您的域名,点击“生成JS”,将生成的JS,复制在页面head标签中即可。
WgateJs将会自动检测当前网站是否已获取过wgateid,如果没有,则自动使用 wgate.php api获取,并跳转回当前页面。
然后使用WgateJs.getWgateid()方法即可获取当前wgateid。详细信息请查看WgateJs
WgateJs合适静态HTML的网页(如果小游戏等) 或取获取用户 openid或者用户信息。
2. 使用gate.php接口
只需要一个页面跳转即可:
http://www.weixingate.com/gate.php?back=url&force=1
http://www.weixingate.com/#custom_appkey
更新说明:自定义公众号APPID功能现已上线, 通过自定义公众号的APPID, 你可以在微信之门绑定自己的服务号做OAUTH授权, 同时你将得到授权后的 openid 以及微信之门的
参数说明:
- back: 需要跳转到的 url. 需要使用 urlencode(php写法,其它语言也有自己的方法).
- force: 1,强制必须使用微信授权, 非微信打开网站将会出现微信授权错误页面; 0,不强制使用微信授权,使用非微信打开网站,不能授权时将返回空的wgateid. 默认值: 1
- info: 是否获取用户信息。可选值:none,不获取用户信息; basic, 获取用户信息。会有微信的授权页面弹出,同一个用户只授权一次; force, 获取用户信息,并且强制显示授权,可用于更新用户信息。跳转返回时不会直接返回用户信息,需使用 wgate_user 接口获取,详情请见下文。
- appid: 自定义公众号的appid, 需要在用户中心的"微信网关"中添加公众号以及appid, secret等信息.
- appid_verify: 使用自定义appid时, 需要验证appid的所有权, 请将 appid和secret 字符串连接, 再以md5加密, 为作该参数的值. appid和secret均需要在"微信网关"中的公众号信息中设置.
注意: info值为 basic,force 时,为控制潜在的风险,需要绑定该域名的用户验证用户手机号,以加强安全性。请到"用户中心->设置用户"中操作。未验证手机号,将会有每天100次的限制。超限的请求会默认使用none作为info的值。
微信之门会通过微信授权, 拿到用户的 openid, 并转换为 wgateid 作为参数跳转回指定的URL.
返回参数:
- wgateid: 获取到的 id
- wxopenid: 使用自定义appid时, 返回微信用户与之对应的openid.
- verify: 校验码. 每次的获取 wgateid 的动作都会生成唯一的一个校验码, 网站可以通过这个校验码访问微信之门的校验接口,验证这个wgateid 是否是从微信之门发出的. 以防止恶意行为. 校验码在120秒内有效.
注意: 使用微信之门的接口, 请先注册用户, 并且在"网站管理" 中添加域名(可以查看实时请求流量哦). 未添加的域名, 将会有每天最多100次的请求限制.
其它接口
验证接口:
http://www.weixingate.com/verify.php?wgateid=用户wgateid&verify=校验码
验证接口用于验证gate.php接口是否真正来自微信之门。返回值为字符串 "true" 或者 "false".
- wgateid: 必填. 前面获取到的 wgateid
- verify: 必填. 前面获取到的 verify 校验码
- jsonp_callback: 可选. 若需要在JS里通过JSONP方式获取时,可设置该参数。具体JSONP的使用方法请参考GOOGLE。
获取用户信息接口:
http://www.weixingate.com/wgate_user.php?wgateid=用户wgateid
参数说明:
- wgateid: wgate接口中返回的用户wgateid.
- jsonp_callback: 可选. 若需要在JS里通过JSONP方式获取时,可设置该参数。具体JSONP的使用方法请参考GOOGLE。
对于wgate接口中info参数使用了显示授权方式(basic或者force)的wgateid,
可以通过此接口获取用户的信息(昵称,性别,位置等),返回数据为JSON格式。
如需JSONP,请添加jsonp_callback参数,使用方法同verify接口。
如果该用户ID在系统中不存在,会返回"null"。
新增: 对于JS调用JSONP方式, 可以不传递wgateid, 直接调用该接口, 会返回当前用户的wgateid或者用户信息(gate.php接口info参数为basic|force时).
WgateJs
如果你只希望在页面的JS代码中获取wgateid,可以使用WgateJs。
它可以帮助您做以下几件事情:
- 自动判断当前页面是否已获取 wgateid,如果没有,则自动使用 wgate.php 接口获取,并跳转回当前页面。
- 获取当前 wgateid。
- 获取当前 wgate user 信息。
如要使用WgateJs,请在用户中心“站点管理”中添加您网站的域名,然后点击“生成JS”,再将生成后的JS放在需要获取wgateid的页面head标签中即可。
更多属性及方法列表:
-
auto_auth
获取不到 wgateid 时,自动使用gate.php接口。可选值: true||false
-
gate_options
使用 gate.php 授权时的参数,例如:WgateJs.gate_options={force:1}
-
ready
当WgateJs准备就绪时执行的回调方法。例如:WgateJs.ready=function(){...}
-
getWgateid()
获取当前wgateid的方法。如果获取不到,则返回null。
-
getWgateUser(callback)
获取当前用户信息。通过callback回调返回。例如:WgateJs.getWgateUser(function(user){...})。
注意:该方法实际使用了wgate_user.php接口,所以需要设置WgateJs.gate_options中{info:"basic"}或者{info:"force"}。
示例:
(function() { WgateJs = {}; WgateJs.auto_auth=true; WgateJs.gate_options={force:1,info:"basic"}; WgateJs.ready=function(){ var wgateid=WgateJs.getWgateid(); WgateJs.getWgateUser(function(user){console.info(user)}); } var u=(("https:" == document.location.protocol) ? "https" : "http") + "://st.weixingate.com/"; u=u+\'st/10\';//注意每个site这里的数字不一样 var d=document, g=d.createElement(\'script\'), s=d.getElementsByTagName(\'script\')[0]; g.type=\'text/javascript\'; g.defer=true; g.async=true; g.src=u; s.parentNode.insertBefore(g,s); })();
自定义公众号APPID
使用了微信之门后, 你可能会有几个新的需求:
- 现有的一批用户拥有了 wgateid, 但我想对接到新的公众号系统中, 与用户的 openid 连接起来.
- 我想借用微信之门的授权跳转机制, 使用自己的服务号来获取用户openid.
- 我想将几个不同的公众号微网站中的用户信息打通, 实现更智能的服务.
自定义公众号APPID的功能 可以帮助你实现这些功能.
通过自定义的APPID(使用你自己的认证服务号), 你可以使用微信之门的接口, 同时获取一个微信用户针对你自定义APPID的openid, 以及微信之门的 wgateid.
操作方法
- 注册微信之门用户
- 用户中心->消息网关 中添加要自定义APPID的公众号, 并准备填写 appid, secret
- 回到微信后台, "开发者中心" 中找到 "网页授权获取用户基本信息" 修改授权回调域名为 "www.weixingate.com"
- 使用微信之门的 gate.php 接口, 并添加 appid 和 appid_verify (具体请见gate.php接口说明)参数.
接口返回的参数中, wxopenid 就是自定义APPID产生的 openid, wgateid 也会同时返回.
DEBUG
微信中debug比较麻烦, 只能在微信中刷新. 对于使用WgateJs的用户, 可以使用alert, JSON.stringify(json) 等方法打印变量.
WgateJs会使用cookie 作为wgateid的临时存贮, 如遇到"不弹出授权页面"等问题, 可尝试在微信中访问: http://www.weixingate.com/clear_cookie.php 清除cookie, 再测试.
或者扫描二维码使用DEBUG工具:
Example
例如:
http://www.weixingate.com/gate.php?back=http%3A%2F%2Fwww.baidu.com 授权后将会跳转到: http://www.baidu.com?wgateid=用户wgateid&verify=校验码
一个典型的应用场景示例:缘分测试 (使用微信扫描打开)
(欢迎将您的案例展示在这里,地址请发送到页面的联系邮箱)
Can ? or Not?
微信之门的设计非常简单, 它能做什么? 不能做什么?
- 能做: 通过授权获取唯一用户的 wgateid, 并通过显式授权获取用户信息。
- 不能做: 除了能做的其它任何事情
综上所述, 微信之门适合需要唯一用户身份辨识需求 不需要依赖微信公众号的网站..
TODO
如果您有什么想法和建议或者意见,欢迎通过下边的联系方式提供给我们,一起来完善它以提供更方便的服务。
Contact
如有疑问, 请联系 cnhuye@gmail.com
微信方面的讨论 请加群 98749981(验证问题,请填写完整的微信接口的域名: api.weixin.qq.com)