公眾平台可以通過介面擷取使用者的openid,但是擷取使用者資訊的時候需要做一次跳轉。
我在後台有一張使用者表,使用者如果關注了公眾平台就將他的資訊錄入到資料庫,包括openid。現在要做一個簡單的系統,使用者參加某些活動可以獲得積分,積分可以兌換成金幣,所以在頁面中需要使用openid來標識每一個使用者。
現在的問題是,活動有好幾個頁面,每個頁面都需要用到openid,並且無法限定使用者從哪個頁面進入,想請問有沒有辦法將使用者openid儲存起來,在不同頁面之間傳遞?
ps: session這種方式是不行的,瀏覽器對session的支援有問題,我抓包做過測試
回複內容:
公眾平台可以通過介面擷取使用者的openid,但是擷取使用者資訊的時候需要做一次跳轉。
我在後台有一張使用者表,使用者如果關注了公眾平台就將他的資訊錄入到資料庫,包括openid。現在要做一個簡單的系統,使用者參加某些活動可以獲得積分,積分可以兌換成金幣,所以在頁面中需要使用openid來標識每一個使用者。
現在的問題是,活動有好幾個頁面,每個頁面都需要用到openid,並且無法限定使用者從哪個頁面進入,想請問有沒有辦法將使用者openid儲存起來,在不同頁面之間傳遞?
ps: session這種方式是不行的,瀏覽器對session的支援有問題,我抓包做過測試
對session的支援沒有任何問題,session也不是存在上面的。真正有問題的是對cookie的支援,上面儲存的所有cookie資訊都是臨時的,退出再重新開啟就會導致cookie丟失,自然會導致session失效。
在一次會話內完全可以使用session儲存使用者的openID,如果是在多個網域名稱之間跳轉的話最好是在一個主網域名稱的不同次層網域下,寫cookie的時候設定好domain參數就可以;跨主網域名稱的話會比較麻煩,一般也沒有必要。
放redis這種緩衝裡
擷取使用者資訊的時候需要網頁授權,網頁授權有靜默授權(snsapi_base)和使用者可感知的授權(snsapi_userinfo)
你只要openid的話用靜默授權就可以了
靜默授權流程:
使用者開啟你的頁面-》跳轉到授權頁面-》跳轉到你設定的頁面並能夠拿到code-》根據code拿到OpenId
拿到openid之後你可以儲存到session,這個是絕對沒問題的~
你先做一下檢查:
1.確定下否真的拿到了OpenId
2.查看下服務端是否有儲存session資料?
3.頁面跳轉比較多,最後session是儲存在哪個域,這個要確定!
可能出現的問題:
因為PHP的session需要用戶端的cookies來配合(儲存PHPSESSID),如果用戶端禁用了cookies,你可以把PHPSESSID放到URL裡面進行傳遞或者寫到html的header裡面
如果活動人數不是很多,可以使用網頁授權的方式去擷取OpenId
以snsapi_base為scope發起的網頁授權,是用來擷取進入頁面的使用者的openid的
無論使用者從哪個頁面進來,你都可以通過這種方式擷取使用者的OpenId。如果你需要在使用者進入頁面之後,將使用者的openId在各個頁面中傳遞,我記得PHP有個全域變數_global,各個頁面貢獻該變數,或者放在redis
不過在java中可以將變數放在ThreadLocal中,這樣可以唯一確定是哪個使用者,不知道PHP有沒有類似的方法。如果多個使用者同時進入,你要實現OpenId在各個頁面傳遞,怎麼標識唯一的使用者
session是沒問題的,可能是你哪出錯了,還有另一種解決方案是用HTML5的本機存放區localstorage,存Cookie也是一種辦法
很奇怪你說的最後那句,內建瀏覽器對session支援有問題,那這麼多跑在裡的網站都是怎麼工作的。
支援session沒問題的**
通過一條圖文回複,然後url串連裡帶上OPENID,這樣串連到頁面就可以了.
來,拿好:https://github.com/thenbsp/wechat/blob/master/example/oauth.php