config = ''; if (!is_null(\app\common\modules\shop\ShopConfig::current()->get('wechat_qrcode_config'))) { $class = array_get(\app\common\modules\shop\ShopConfig::current()->get('wechat_qrcode_config'), 'class'); $function = array_get(\app\common\modules\shop\ShopConfig::current()->get('wechat_qrcode_config'), 'function'); $this->config = $class::$function(); } return $this->config; } //验证是否能扫码登录 public function checkLogin(){ $arr = array('status' => 0); if(empty($this->config)){ $arr = ['status'=>1,'msg'=>'不支持扫码登录']; }else if($this->config['is_open'] == 0){ $arr = ['status'=>1,'msg'=>'未开启扫码登录']; } return $arr; } public function login() { $check = $this->checkLogin(); if($check['status'] == 1) { exit("5001" . $check['msg']); } $pc_token = \YunShop::request()->pc_token; $yz_redirect = request()->yz_redirect; $uniacid = \YunShop::app()->uniacid; $mid = \app\common\models\Member::getMid(); if($pc_token){ if(Redis::get($pc_token)){ return self::redirectUrl( Redis::get($pc_token.'member_id'),$uniacid, $mid, $yz_redirect); //登录成功 跳转会员中心 }else{ return show_json(10, '登录失败'); //todo status类型待优化 } }else{ return show_json(11, '生成二维码链接成功',array('account_url'=> $this->getQrCodeUrl(), 'pc_token' => $this->scene)); } } private function getQrCodeUrl() { return static::WE_CHAT_SHOW_QR_CODE_URL . $this->getTicket(); } /** * 生成公众号临时二维码,默认120s到期 * @param $scene * @return mixed */ private function createQR() { $account = AccountWechats::getAccountByUniacid(\YunShop::app()->uniacid); $options = [ 'app_id' => $account->key, 'secret' => $account->secret, ]; $app = EasyWeChat::officialAccount($options); $qrcode = $app->qrcode; $result = $qrcode->temporary($this->getSceneValue(), 120); return $result; } public function checkLogged($login = null) { return MemberService::isLogged(); } private function getTicket() { return self::createQR()['ticket']; } /** * 获取唯一场景值 * @return string */ private function getSceneValue() { $scene = sha1(rand(0,999999)); $result = Redis::get($scene); if(!$result){ Redis::setex($scene, 120, 0); //0 = 生成二维码未扫码 $this->scene = $scene; return $scene; }else{ $this->getSceneValue(); } } /** * 扫码跳转到商城 * @param $member_id * @param $uniacid * @param $mid */ private function redirectUrl($member_id,$uniacid,$mid,$redirect_url){ Session::set('member_id',$member_id); if($redirect_url){ $url = base64_decode($redirect_url); }else{ $url = Url::absoluteApp('member', ['i' => $uniacid, 'mid' => $mid]);//默认会员中心 } $mobile = Member::where('uid', $member_id)->value('mobile'); $pc_bind_mobile = 0; if(empty($mobile) && $this->config['pc_bind_mobile']){ $pc_bind_mobile = 1; } return show_json(1,'登陆成功', ['url' => $url, 'pc_bind_mobile' => $pc_bind_mobile]); } }