使用library 中的 微信登錄 校驗工具 (工具源碼作者 小黑黑 ) 原本的腳手架是基于tp的小程序登錄,把他稍微改進了用到CI中。 官方手冊寫的流程太復雜了,建議精簡下,我看了一天的文檔,其實東西不算很難,只是簡單的東西復雜化了。 微信登錄的流程大概是 小程序->業務服務器->傳遞最后的session3rd到微信服務器 同時把 session3rd json給 小程序,保存在客戶端就可以。 用戶進入小程序的時候,先 post session3rd給 業務服務器,查詢緩存中是否還存在,存在就返回session3rd的內容,否則重新登錄。
必要設置:CI memcached 參考 memcached配置
假設,你的網址是 https://www.abc.com/api 首先,把wafer目錄放入 api中 其次,把wafer-session-server-master 目錄放到 api目錄中 注意,是整個目錄放進去
linux主機的話,需要 在 系統/etc/新建 qcloud目錄。 新建個文本文件粘貼如下代碼:
{ "serverHost": "www.xx.com", "authServerUrl": "http://www.xx.com/itjaye/wafer-session-server/", "tunnelServerUrl": "https://ws.qcloud.com", "tunnelSignatureKey": "xxxxxx", "networkTimeout": 30000 } serverHost 你的業務服務器的域名,上面部署wafer SDK代碼 authServerUrl 會話服務地址,登陸授權會用到。上面部署會話服務的代碼 tunnelServerUrl 這個是信道服務器地址,不需要部署,直接使用騰訊提供的信道服務器地址https://ws.qcloud.com tunnelSignatureKey 修改成自己的簽名秘鑰,隨便自己定義一個就行 將文件保存為sdk.config并上傳到/etc/qcloud/sdk.config (需要在/etc/下面自己創建下qcloud這個目錄)
具體請參考:自行部署小程序開發套件
進入CI wafer目錄中,composer install,安裝依賴文件。 使用框架: 微信官方demo wafer library庫 源碼作者小小黑 需要刪除命名空間, WXLoginHelper 文件里面需要導入 require_once 其他的文件進來。
微信登錄例子
Class UserLogin extends CI_Controller { function __construct() { parent::__construct(); $this->load->library(array('WXLoginHelper')); $this->load->model('General'); $this->load->driver('cache'); } function login() { /* code, rawData, signature, encryptData iv */ $postData = $this->input->post(array('code','rawData','signature','encryptedData','iv')); $code = $postData['code']; $rawData = $postData['rawData']; $signature = $postData['signature']; $encryptedData = $postData['encryptedData']; $iv = $postData['iv']; $test = new WXLoginHelper; $data = $test->checkLogin($code,$rawData,$signature,$encryptedData,$iv); $session = $this->cache->memcached->save($data['session3rd'], $data['openId'] . $data['sessionKey']); //檢查user表是否存在改用戶,如果存在,則則返回session,如果不存在,寫入表再發回session $find = $this->General->query('user',array('openid'=>$data['openId'])); $find = $find ==null ? 0:$find[0]; if($find == 0) { $user_id = $this->General->insert('user',array('openId'=>$data['openId'],'nickName'=>$data['nickName'], 'gender'=>$data['gender'],'city'=>$data['city'],'language'=>$data['language'],'province'=>$data['province'],'country'=>$data['country'],'avatarUrl'=>$data['avatarUrl'])); } else{ $user_id = $find['id']; } if(isset($find['avatarUrl'] && $find['avatarUrl'] !== $data['avatarUrl']) { $this->General->update('user',array('id'=>$user_id),array('avatarUrl'=>$data['avatarUrl'])); //如果頭像更改,則更新頭像 } echo json_encode(array('status'=>0,'session3rd'=>$data['session3rd'],'user_id'=>$user_id)); } function checkLogin() { //如果客戶端存在 session3rd,則post 到此接口,獲取對應數據 $session3rd = $this->input->post('session3rd'); $data = $this->cache->memcached->get($session3rd); echo json_encode(array('status'=>0,'session3rd'=>$data)); } } |
字段 | 類型 | 空 | 默認 | 注釋 |
---|---|---|---|---|
uid | int(10) | 否 | ||
openId | varchar(20) | 否 | openid | |
nickName | varchar(50) | 否 | 密碼 | |
gender | int(50) | 否 | 性別 | |
language | varchar(50) | 否 | 密碼 | |
city | varchar(50) | 否 | 城市 | |
province | varchar(50) | 否 | 省份 | |
country | varchar(50) | 否 | 國家 | |
avataUrl | varchar(50) | 否 | 頭像 | |
reg_time | int(11) | 否 | 0 | 注冊時間 |