| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- <?php
- /**
- * Created by PhpStorm.
- * Author: 芸众商城 www.yunzshop.com
- * Date: 17/2/23
- * Time: 上午11:21
- */
- namespace app\frontend\modules\member\services;
- use app\common\facades\EasyWeChat;
- use app\common\models\AccountWechats;
- use app\common\services\Session;
- use app\frontend\models\Member;
- use EasyWeChat\Foundation\Application;
- use Illuminate\Support\Facades\Redis;
- use app\common\helpers\Url;
- class MemberPcOfficeAccountService extends MemberService
- {
- const LOGIN_TYPE = 5;
- const IS_PC_QRCODE = 1;
- const WE_CHAT_SHOW_QR_CODE_URL = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=';
- private $config;
- private $scene;
- public function __construct()
- {
- $this->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]);
- }
- }
|