laravel 微信授权登录

前提1:创建表:用户登录授权信息表

	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:创建表:用户注册信息表

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.安装扩展:

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.授权

  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.保存

    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.拼接数据

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");
    }
发布了21 篇原创文章 · 获赞 7 · 访问量 1414

猜你喜欢

转载自blog.csdn.net/weixin_37647596/article/details/103192370