要處理微信第三方登錄,已經是很正常的需求,讀微信公開的文檔,感覺還是有一些坑,自己寫一個隨筆好記錄一下。
大概兩年前,初次接觸微信第三方登錄的需求是一個網頁應用,大概就是在微信開放平台申請一個開放平台權限,然后創建一個app,在app里面配置一個回調域名,當用戶點擊微信登錄時,把用戶帶到微信那邊的二維碼,然后用戶掃碼,微信那邊通過之后,帶着某些信息,redirect到我們的一個action,然后,我們通過讀取這個action中的token拿到用戶的profile,通過用戶profile可以找到對應的用戶userid,然后授權登錄。這種方式試用與沒有微信公眾號的企業,僅僅把微信當做了方便用戶去登錄的渠道。
這次我們要說的是另外一種登錄方式,就是通過微信公眾號來實現第三方登錄。
前期准備工作,首先需要一個公眾號。以管理者的方式登錄微信號之后,在左下方可以找到關於開發的菜單:
我們在公眾號的首先就會有APPID和APPSecret,我們需要配置服務器,這里配置服務器時特別要注意,也是與第一種登錄方式不一樣的地方,這里設置的不是一個hostname,而是一個具體的request。
文檔里面沒有過多地做說明,但是其實這里配置的URL有兩個意思。
1.微信會對這個地址調用get請求,會傳入幾個參數,然后你得按照他的要求返回,這樣就能通過這個配置。
2.這也是文檔里面沒有說明的一個點,就是,當之后用戶通過二維碼掃描進來時,微信會對這個url發送一個post請求,這個post請求會傳入scene相關信息。scene其實就是讓開發者來傳遞的參數。
post格式文檔里面有:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> </xml>
你還需要對這個post請求做相應的響應,給你的直觀感受就是當你掃描二維碼進入微信的提示。一般會是歡迎 XXX 登錄什么系統。
在微信的說明文檔上,沒有說明這個返回值。其實返回值是
<xml>
<ToUserName>xxxxxxxx</ToUserName>
<FromUserName>xxxxxxxx</FromUserName>
<CreateTime>1573190078536</CreateTime>
<MsgType>text</MsgType>
<Content>綁定超時或失敗,請再次綁定!</Content>
</xml>
然后再一個,當你是一台電腦做服務器,分布式時,需要在你的nginx里做一個反向代理,大概的意思就是把 /xxx 映射到 xxxx:port/wx
因為設置微信URL時,不能填寫端口,所以只能是80端口或者443端口。
location /wx {
proxy_pass http://localhost:8082/wx/checkSignature;
}