微信之門-授權接口
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)