123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <?php
- namespace App\Traits;
- use App\Jobs\SendEmail;
- use App\Jobs\UserLog;
- use App\Services\LoginService;
- use App\Services\Eav\EavSetService;
- use App\Services\Eav\MaterialService;
- use Illuminate\Http\Response;
- use Illuminate\Support\Facades\Cache;
- use Illuminate\Support\Facades\Log;
- use Illuminate\Support\Facades\Request;
- use Illuminate\Support\Facades\Validator;
- /**
- * pc 微信公众号 登录及绑定
- *
- * Trait WechatLoginTrait
- * @package App\Traits
- */
- trait WechatLoginTrait
- {
- /**
- * 是否开启登录日志记录
- *
- * @var bool
- */
- private $is_open_login_log = false;
- /**
- * 微信公众号登录,如果已经绑定了,则直接登录,没有绑定则需要绑定手机号
- */
- public function bind()
- {
- $code = Request::input('code');
- if (empty($code)) {
- return redirect(toRoute('/sso/index/login'));
- }
- // 有可能会返回多次,为了防止这种情况,添加缓存进行解决
- $wechat_cache_key = 'wechat_cache_key:' . $code;
- if ($url = Cache::get($wechat_cache_key)) {
- Log::info($wechat_cache_key . '已经存在!');
- die();
- } else {
- Cache::put($wechat_cache_key, true, 10);
- }
- $app = $this->getPcApp();
- $user = $app->oauth->userFromCode($code);
- $weInfo = $user->toArray();
- $wx_unionid = $weInfo['raw']['unionid'] ?? '';
- $wx_h5_openid = $weInfo['raw']['openid'];
- $key2 = 'wechat:userInfo:' . $code;
- Cache::put($key2, $weInfo, 600);
- //根据openid判断该用户是否已经存在,如果存在则登录跳转
- $flag = false;
- $materialService = new MaterialService(new EavSetService('user'));
- $memberInfo = $materialService->elasticClientService()->queryOne(['wx_h5_openid' => $wx_h5_openid]);
- if ($memberInfo) {
- $flag = true;
- } else {
- if ($wx_unionid) {
- $memberInfo = $materialService->elasticClientService()->queryOne(['wx_unionid' => $wx_unionid]);
- if ($memberInfo) {
- $flag = true;
- }
- }
- }
- if ($flag) {
- //更新微信的头像和昵称信息
- $materialService->update($memberInfo['id'], ['wx_unionid' => $wx_unionid, 'wx_h5_openid' => $wx_h5_openid, 'wx_info' => json_encode($weInfo)]);
- $loginToken = $this->setLoginStatus($memberInfo);
- $loginKey = md5(microtime() . mt_rand());
- Cache::put($loginKey, $loginToken, 120);
- $url = toRoute('/store/tologin?is_login=1&key=' . $loginKey);
- } else {
- $loginKey = $code;
- $url = toRoute('/store/tologin?is_login=2&key=' . $loginKey);
- }
- Cache::forget($wechat_cache_key);
- return redirect($url);
- }
- /**
- * 微信公账号登录,客户绑定手机号
- */
- public function bindIn()
- {
- $requestData = Request::all();
- $rule = [
- 'key' => 'required',
- 'mobile' => 'required',
- 'sms_code' => 'required',
- ];
- $msg = [
- 'key.required' => '参数错误!',
- 'mobile.required' => '请填写手机号!',
- 'sms_code.required' => '请填写6位短信验证码!',
- 'sms_code.size' => '短信验证码必须是6个字符!',
- ];
- $validator = Validator::make($requestData, $rule, $msg);
- if ($validator->fails()) {
- $errorMessage = $validator->errors()->all();
- return response()->json(['result' => false, 'code' => 2001, 'msg' => $errorMessage[0] ?? '']);
- }
- //判断验证短信验证码是否正确
- $result_bool = $this->smsService->checkSmsCode($requestData['mobile'], $requestData['sms_code'], 'bind');
- if (!$result_bool) {
- return $this->responseMessage(2002, '短信验证码错误,请确认后再试!');
- }
- //获取微信的信息
- $key2 = 'wechat:userInfo:' . $requestData['key'];
- $weInfo = Cache::get($key2);
- if (empty($weInfo)) {
- return $this->responseMessage(2003, '微信登录失败,请重试!');
- }
- $wx_unionid = $weInfo['raw']['unionid'] ?? '';
- $wx_h5_openid = $weInfo['raw']['openid'];
- //检测手机号是否已经存在
- $loginToken = '';
- $materialService = new MaterialService(new EavSetService($this->userSetAlias));
- $userInfo = $materialService->elasticClientService()->queryOne(['mobile' => $requestData['mobile']]);
- if ($userInfo) {
- //更新到数据库
- $is_success = $materialService->update($userInfo['id'], ['wx_unionid' => $wx_unionid, 'wx_h5_openid' => $wx_h5_openid, 'wx_info' => json_encode($weInfo)]);
- if ($is_success) {
- //设置登录状态
- $loginService = new LoginService($this->siteAliasName);
- $loginToken = $loginService->setLoginCookie($userInfo);
- //给管理员发送邮件通知
- $this->dispatch(new SendEmail('597196313@qq.com', '老用户【' . $requestData['mobile'] . '】【' . $weInfo['nickname'] . '】,通过微信绑定成功!!'));
- }
- } else {
- //保存到数据库
- $data = [
- 'mobile' => $requestData['mobile'],
- 'username' => $weInfo['nickname'],
- 'wx_unionid' => $wx_unionid,
- 'wx_h5_openid' => $wx_h5_openid,
- 'gender' => $weInfo['raw']['sex'] ?? 0,
- 'wx_info' => json_encode($weInfo),
- 'password' => '', //生成随机密码
- 'avatar' => $weInfo['avatar'],
- 'role_id' => 1,
- 'status' => 1, // 状态 1正常 2黑名单
- 'setmeal_type' => 1, // 7天 体验版
- 'end_use_time' => time() + 3600 * 24 * 7
- ];
- $is_success = $materialService->addProduct($data, true);
- if ($is_success) {
- //设置登录状态
- $userInfo = $materialService->elasticClientService()->docGet($is_success);
- $loginService = new LoginService($this->siteAliasName);
- $loginToken = $loginService->setLoginCookie($userInfo);
- //给管理员发送邮件通知
- $this->dispatch(new SendEmail('597196313@qq.com', '新商家【' . $data['mobile'] . '】【' . $weInfo['nickname'] . '】,通过微信绑定,注册成功!!请尽快和该用户取得联系。提供服务!'));
- }
- }
- // 登录日志
- if ($loginToken) {
- return $this->responseMessage(1001, '绑定成功', $loginToken);
- } else {
- return $this->responseMessage(2001, '绑定失败,请稍后再试!');
- }
- }
- }
|