一直好奇這個功能,昨天終於走通。這里記錄一下。 微信官方介紹
在進行微信OAuth2.在進行微信OAuth2.0授權登錄接入之前,在微信開放平台注冊開發者帳號,並擁有一個已審核通過的網站應用,並獲得相應的AppID和AppSecret,申請微 信登錄且通過審核后,可開始接入流程。
獲取二維碼
官方文檔已經寫明,開發者賬號審核要¥300,網站應用在開放平台的管理中心中即可創建,審核也很快。審核通過之后就拿到了AppID和AppSecret。剛開始搞成公眾號的AppId導致url一直獲取不到二維碼,提示scope或沒有權限。
另外網站應用的域名也不要寫錯。寫錯了,改一次起碼要等第二天才能玩了。
參數正確之后就可以得到正確的二維碼。接下來就是獲取用戶信息並登錄。
實現登錄
這個時候我傻了一下,這怎么調試呢,二維碼只認網站應用中設置好的域名,你的localhost玩不起來。難道打日志?還要到服務器上看日志記錄,這個過程有點糾結。在知乎上看到微信發布了一個Web開發者工具。下下來不知道怎么本地調試,沒有見到設置的地方(羞愧中...)。因為代碼不多,先用笨辦法實現了。這里用到了Senparc框架。
var code = Request.QueryString["code"]; var state = Request.QueryString["state"]; //若用戶禁止授權,則重定向后不會帶上code參數,僅會帶上state參數 if (code != null) { //redirect_uri?code=CODE&state=STATE Logger.Info("code為:" + code); Logger.Info("state為:" + state); //2. 通過code參數加上AppID和AppSecret等,通過API換取access_token; var url = string.Format( "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appId, appSecret, code); var result = CommonJsonSend.Send<OAuthAccessTokenResult>(null, url, null, CommonJsonSendType.GET); OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); var user = QueryOrCreateUser(userInfo); AuthenticationService.SignIn(user,true);
}
OAuthApi.GetUserInfo獲取到了相關的用戶信息,包含用戶的頭像,城市等,這樣方便我們創建或者查找到用戶,然后SignIn即可。但如果一個用戶用多種第三方登錄,這個是就需要判別這些號是同一個人,而不至於創建多個用戶。
獲取到的信息沒有郵箱和密碼,需要再做個頁面讓用戶設置郵箱和新密碼
公眾號登錄
微信內登錄和網站掃碼不一樣。scope是用userinfo. 網站掃碼需要在開發平台中創建網站應用,這兩者的得到的openid不一樣,但支付的appid必須和商戶的id匹配,否則不能支付。
<a title="微信登錄" class="logwx" id="zhilogon" href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd6bc2f224b5ffbac&redirect_uri=http://www.xxx.com/weixinAuth&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"> <img src="/images/logwx.png" /> </a>
如果沒有使用公眾號的appid,用創建的網站應用的appid也是可以一鍵登錄的,區別就在於你的商戶號綁定的是哪個appid,這決定這個openid能不能用來公眾號內的支付。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx0caae1edac6498a2&redirect_uri=http://www.xxx.com/weixinAuth&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect
公眾號和網頁應用的登錄界面分別如下
界面略有不同。
關於本地調試
后面看到了ngrok以及相關介紹,應該是正解。 這個文檔比較清楚,就不介紹了。
參考博客:http://www.cnblogs.com/fengwenit/p/4653940.html
Senparc: http://pan.baidu.com/s/1o8AbxkI
ngrok: http://jingyan.baidu.com/article/f006222826c2bcfbd3f0c885.html
ngrok下載:http://pan.baidu.com/s/1dFv0A69
官網:https://dashboard.ngrok.com/get-started