前提1:建立表:用戶登陸受權信息表php
CREATE TABLE `wechat` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶第三方受權登陸表主鍵id', `user_id` int(11) DEFAULT NULL COMMENT '用戶註冊表中的主鍵id', `appid` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'appid肯定是哪一個入口', `openid` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'openid', `unionid` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '在不一樣產品之間肯定是不是同一個用戶。同一我的在同一個公司的微信不一樣產品上的unionid是同樣的', `nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '受權獲取的暱稱', `avatar` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '獲取的頭像', `gender` tinyint(4) DEFAULT NULL COMMENT '性別 1爲男性,2爲女性', `city` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `province` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `created_at` datetime DEFAULT NULL COMMENT '受權時間 時間戳方式存儲', `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `deleted_at` datetime DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `openid` (`openid`), KEY `user_id_oauth_type` (`user_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='【用戶登陸受權信息表】';
前提2:建立表:用戶註冊信息表laravel
CREATE TABLE `users` ( `id` int(255) NOT NULL AUTO_INCREMENT COMMENT 'user表主鍵id', `admin_id` int(11) DEFAULT '0' COMMENT '關聯的admin', `name` varchar(255) DEFAULT '' COMMENT '用戶的真實姓名,最少兩個字,最多5個字', `nickname` varchar(255) DEFAULT NULL COMMENT '用戶暱稱', `mobile` varchar(255) DEFAULT NULL COMMENT '用戶的手機號碼,惟一,能夠做爲登陸的憑證', `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶的郵箱,惟一,能夠做爲登陸憑證', `password` varchar(255) DEFAULT NULL COMMENT '用戶註冊時的密碼,MD5加密以後的', `sex` tinyint(4) DEFAULT '0' COMMENT '用戶性別,0位保密,1爲男性,2爲女性', `avatar` varchar(255) DEFAULT NULL COMMENT '用戶頭像', `wechat` varchar(255) DEFAULT NULL COMMENT '用戶的微信號', `qq` varchar(255) DEFAULT '' COMMENT '用戶QQ', `weibo` varchar(255) DEFAULT NULL COMMENT '用戶的微博', `company` varchar(255) DEFAULT '' COMMENT '用戶所在的公司', `career` varchar(255) DEFAULT NULL COMMENT '用戶在公司中的職位', `brand` varchar(255) DEFAULT '' COMMENT '公司品牌', `intro` text COMMENT '我的簡介、描述', `province` int(11) DEFAULT NULL COMMENT '省份的id 關聯category_area表主鍵', `city_id` int(11) DEFAULT NULL COMMENT '城市的id 關聯category_area表主鍵', `address` varchar(255) DEFAULT NULL COMMENT '詳細地址', `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `deleted_at` datetime DEFAULT NULL ) ENGINE=InnoDB AUTO_INCREMENT=176 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='【用戶註冊信息表】';
1.安裝擴展:web
composer require "overtrue/laravel-wechat:~5.0"
將 DEFAULT_APPID=11111111111 APPSECRET=55555531ec7ef8bd538a5554e 寫在配置文件 env 中
3.將env 裏的配置信息經過 config/services.php 調用微信
'wechat'=>[ "app_id"=>env('DEFAULT_APPID'), "secret"=>env('APPSECRET') ],
4.受權session
public function auth(Request $request){ if (!$request->code)return $this->error("缺乏參數code");//微信code $app_id = Config('services.wechat.app_id'); $app_secret = Config('services.wechat.secret'); $config = Config('services.wechat'); $auth = $app->auth->session($request->code);//解析code //實例化解密類 解密用戶數據 if ($request->encrypted_data && $request->iv) { $decode_data = $app->encryptor->decryptData($auth['session_key'], $request->iv, $request->encrypted_data); $auth = array_merge($auth, $decode_data); } $auth['appid'] = $config['app_id']; $wechat = $this->save($auth);//保存數據 $token = $wechat->user_id ? $this->getToken($wechat) : ''; if(!empty($auth['avatarUrl']) && !empty($auth['nickName'])){//判斷有沒有傳用戶信息等 $user_info = User::where('id',$wechat->user_id)->select(['avatar','nickname'])->first(); if(empty($user_info->avatar)){ User::where('id',$wechat->user_id)->update(['avatar'=>$auth['avatarUrl']]);//有用戶信息 頭像 更新到user 表中 } if(empty($user_info->nickname)){ User::where('id',$wechat->user_id)->update(['nickname'=>$auth['nickName']]); } } return $this->success(['openid' => $wechat->openid, 'access_token' => $token]); }
5.保存app
protected function save($params) { $params = $this->transform($params); //openid是否存在 存在->更新 不存在->新增 $wechat = Wechat::where("openid", $params['openid'])->first(); if ($wechat) { $wechat->fill($params)->save(); return $wechat; } return Wechat::create($params); }
6.拼接數據composer
protected function transform($attributes = []){ return [ "appid" => $attributes['appid'], "openid" => $attributes['openid'], "nickname" => $attributes['nickName'] ?? '', "avatar" => $attributes['avatarUrl'] ?? '', "city" => $attributes['city'] ?? '', "province" => $attributes['province'] ?? '' ]; }
public function wxMobile(Request $request){ if (!$request->code)return $this->error("缺乏參數code");//微信code $app_id = Config('services.wechat.app_id'); $app_secret = Config('services.wechat.app_secret'); $config = Config('services.wechat'); $app = Factory::miniProgram($config); $auth = $app->auth->session($request->code); //實例化解密類 解密用戶數據 if ($request->encrypted_data && $request->iv) { $decode_data = $app->encryptor->decryptData($auth['session_key'], $request->iv, $request->encrypted_data); if ($decode_data) { $expiresAt = Carbon::now()->addMinutes(10); Cache::put($decode_data['purePhoneNumber'] . '_auth', $decode_data['purePhoneNumber'], $expiresAt); $data['mobile'] = $decode_data['purePhoneNumber']; $user = User::where($data)->first(); if ($user) { $user->fill($data)->save(); } else { $user = User::create($data); } $auth = Wechat::where("openid", $auth['openid'])->first(); if (!$user || !$auth) { return $this->error("綁定失敗"); } $auth->user_id = $user->id; $auth->save(); return $this->success(auth('wechat')->login($user)); } return $this->error("解密失敗"); } return $this->error("缺乏參數111"); }