laravel 微信受權登陸

前提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'] ?? ''
        ];
    }
  1. 微信登陸
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");
    }