admin管理员组文章数量:1639923
前提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'] ?? ''
];
}
- 微信登录
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");
}
本文标签: Laravel
版权声明:本文标题:laravel 微信授权登录 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726721240a1081857.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论