261 lines
8.0 KiB
PHP
261 lines
8.0 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* Author:
|
|
* Date: 17/2/23
|
|
* Time: 上午11:21
|
|
*/
|
|
|
|
namespace app\frontend\modules\member\services;
|
|
|
|
use app\common\exceptions\MemberErrorMsgException;
|
|
use app\common\helpers\Url;
|
|
use app\frontend\modules\member\models\MemberUniqueModel;
|
|
use app\frontend\modules\member\models\MemberWechatQrcodeModel;
|
|
use app\common\services\Session;
|
|
use app\frontend\models\Member;
|
|
|
|
|
|
class MemberWechatQrcodeService extends MemberService
|
|
{
|
|
const LOGIN_TYPE = 5;
|
|
const IS_PC_QRCODE = 1;
|
|
|
|
private $config;
|
|
|
|
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($is_pc_qrcode){
|
|
$arr = array('status' => 0);
|
|
|
|
if(empty($this->config)){
|
|
$arr = ['status'=>1,'msg'=>'不支持扫码登录'];
|
|
}else if($this->config['is_open'] == 0){
|
|
$arr = ['status'=>1,'msg'=>'未开启扫码登录'];
|
|
}else if($this->config['is_wechat_login'] == 1 && $is_pc_qrcode <> self::IS_PC_QRCODE){
|
|
$arr = ['status'=>1,'msg'=>'必须使用微信扫码登录'];
|
|
}
|
|
return $arr;
|
|
}
|
|
|
|
public function login()
|
|
{
|
|
$check = $this->checkLogin(\YunShop::request()->is_pc_qrcode);
|
|
|
|
if($check['status'] == 1) {
|
|
exit("5001" . $check['msg']);
|
|
}
|
|
$yz_redirect = request()->yz_redirect;
|
|
|
|
$uniacid = \YunShop::app()->uniacid;
|
|
$mid = \app\common\models\Member::getMid();
|
|
$code = \YunShop::request()->code;
|
|
|
|
|
|
$request_url = $_SERVER['REQUEST_URI'] . "&is_pc_qrcode=" . \YunShop::request()->is_pc_qrcode . "&yz_redirect=" . $yz_redirect;
|
|
if (\YunShop::request()->sub_platform) {
|
|
$request_url .= "&sub_platform=" . \YunShop::request()->sub_platform;
|
|
}
|
|
|
|
$callback = ($_SERVER['REQUEST_SCHEME'] ? $_SERVER['REQUEST_SCHEME'] : 'http') . '://' . $_SERVER['HTTP_HOST'] . $request_url;
|
|
// \Log::debug('--回调地址--',$callback);
|
|
|
|
$state = 'yz-' . session_id();
|
|
Session::set('wx_qrcode_state',$state);
|
|
|
|
$wxurl = $this->_getAuthUrl($this->config['appid'],$callback,$state);
|
|
|
|
if (!empty($code)) {
|
|
$query = parse_url($callback,PHP_URL_QUERY);
|
|
parse_str($query,$params);
|
|
$redirect_url = $params['yz_redirect'];//重定向地址
|
|
|
|
$token = $this->_getTokenUrl($this->config['appid'], $this->config['app_secret'], $code);
|
|
// \Log::debug('token信息', $token);
|
|
|
|
if (!empty($token) && is_array($token) && $token['errmsg'] == 'invalid code') {
|
|
return show_json(0, array('msg'=>'请求错误'));
|
|
}
|
|
|
|
$user_info = $this->_getUserInfoUrl($token['access_token'], $token['openid']);
|
|
\Log::debug('PC端扫码登录微信授权成功', $user_info);
|
|
|
|
if (is_array($user_info) && !empty($user_info['errcode'])) {
|
|
\Log::debug('---微信扫码登陆授权失败---', $user_info);
|
|
throw new MemberErrorMsgException('微信扫码登陆授权失败');
|
|
}
|
|
|
|
$member_id = $this->memberLogin($user_info);
|
|
Session::set('member_id', $member_id);
|
|
|
|
self::redirectUrl($member_id,$uniacid,$mid,$redirect_url);
|
|
} else {
|
|
return show_json(9, array('url'=> $wxurl,'msg'=>'生成二维码链接成功'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* api
|
|
* 生成微信扫码登录二维码
|
|
* snsapi_userinfo
|
|
* @param $appId
|
|
* @param $url
|
|
* @param $state
|
|
* @return string
|
|
*/
|
|
private function _getAuthUrl($appId, $url, $state)
|
|
{
|
|
return "https://open.weixin.qq.com/connect/qrconnect?appid=" . $appId ."&redirect_uri=" . urlencode($url) . "&response_type=code&scope=snsapi_login&state={$state}#wechat_redirect";
|
|
}
|
|
|
|
/**
|
|
* 获取微信用户信息
|
|
* @param $accesstoken
|
|
* @param $openid
|
|
* @return mixed
|
|
*/
|
|
private function _getUserInfoUrl($accesstoken, $openid)
|
|
{
|
|
$url = "https://api.weixin.qq.com/sns/userinfo?access_token={$accesstoken}&openid={$openid}&lang=zh_CN";
|
|
return $userinfo_url = \Curl::to($url)
|
|
->asJsonResponse(true)
|
|
->get();
|
|
}
|
|
|
|
/**
|
|
* 获取token api
|
|
*
|
|
* @param $appId
|
|
* @param $appSecret
|
|
* @param $code
|
|
* @return string
|
|
*/
|
|
private function _getTokenUrl($appId, $appSecret, $code)
|
|
{
|
|
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $appId . "&secret=" . $appSecret . "&code=" . $code . "&grant_type=authorization_code";
|
|
return $tokenurl = \Curl::to($url)
|
|
->asJsonResponse(true)
|
|
->get();
|
|
}
|
|
|
|
/**
|
|
* 会员关联表操作
|
|
*
|
|
* @param $uniacid
|
|
* @param $member_id
|
|
* @param $unionid
|
|
*/
|
|
public function addMemberUnionid($uniacid, $member_id, $unionid)
|
|
{
|
|
MemberUniqueModel::replace(array(
|
|
'uniacid' => $uniacid,
|
|
'unionid' => $unionid,
|
|
'member_id' => $member_id,
|
|
'type' => self::LOGIN_TYPE
|
|
));
|
|
}
|
|
|
|
/**
|
|
* @param $uid
|
|
* @param $uniacid
|
|
* @param $userinfo
|
|
*/
|
|
public function addFansMember($uid, $uniacid, $userinfo)
|
|
{
|
|
$user = MemberWechatQrcodeModel::getUserInfo_memberid($uid);
|
|
if (!empty($user)) {
|
|
$this->updateMemberInfo($uid, $userinfo);
|
|
} else {
|
|
MemberWechatQrcodeModel::replace(array(
|
|
'uniacid' => $uniacid,
|
|
'member_id' => $uid,
|
|
'openid' => $userinfo['openid'],
|
|
'nickname' => $userinfo['nickname'],
|
|
'avatar' => $userinfo['headimgurl'],
|
|
'gender' => $userinfo['sex'],
|
|
'province' => '',
|
|
'country' => '',
|
|
'city' => '',
|
|
));
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param $openid
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function getFansModel($openid)
|
|
{
|
|
$model = MemberWechatQrcodeModel::getUserInfo($openid);
|
|
if (!is_null($model)) {
|
|
$model->uid = $model->member_id;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证登录状态
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function checkLogged($login = null)
|
|
{
|
|
return MemberService::isLogged();
|
|
}
|
|
|
|
/**
|
|
* 扫码跳转到商城
|
|
* @param $member_id
|
|
* @param $uniacid
|
|
* @param $mid
|
|
*/
|
|
public 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');
|
|
|
|
if(empty($mobile) && $this->config['pc_bind_mobile']){
|
|
if(\YunShop::request()->pc){
|
|
$url = 'https://' .$_SERVER['HTTP_HOST'] ."/plugins/shop_server/login?i={$uniacid}&from=phone";
|
|
}else{
|
|
$url = Url::absoluteApp('login', ['i' => $uniacid, 'from' => 'phone']); ;
|
|
}
|
|
|
|
if(\YunShop::request()->sub_platform){
|
|
$url = yzAppFullUrl('subplatformt/subplatformtIndex/');
|
|
}
|
|
}
|
|
|
|
redirect($url)->send();//跳转到前端会员中心页面
|
|
}
|
|
|
|
public function addMemberInfo($uniacid, $userinfo)
|
|
{
|
|
$uid = parent::addMemberInfo($uniacid, $userinfo);
|
|
|
|
\Log::debug('---wechat_qrcode_fans---', $uid);
|
|
//添加wechat_qrcode_fans表
|
|
$this->addFansMember($uid, $uniacid, $userinfo);
|
|
|
|
return $uid;
|
|
}
|
|
|
|
} |