test
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

231 lines
9.0 KiB

<?php
defined('IN_IA') or exit('Access Denied');
use EasyWeChat\Factory;
/**
* Comment: 登录模型
* Author: zzw
* Class Login
*/
class Login {
# 'loginSource1Mode2'=公众号微信登录;
# 'loginSource2Mode1'=H5账号密码登录;
# 'loginSource3Mode2'=小程序微信登录;
/**
* Comment: 公众号微信登录 —— 等待对接
* Author: zzw
* Date: 2019/10/22 11:32
* @param $data
* @return mixed
*/
public function loginSource1Mode2($data) {
global $_W;
// $data['vue_url'] = 'https://citydev.weliam.com.cn/addons/weliam_smartcity/h5/#/pages/mainPages/userCenter/userCenter?i=26';
#1、获取基本配置信息
$set = Util::object_array($_W['account']);
if ($data['request'] == 'get') {
#2、生成返回地址并且进行对应的编码
$vueUrl = urlencode($data['vue_url']);//将返回地址进行编码
$backUrl = urlencode($_W['siteroot'] . "addons/".MODULE_NAME."/core/common/uniapp.php?i="
. $_W['uniacid'] . "&areaid={$data['areaid']}&p=member&do=login&source=1&mode=2&back_url={$vueUrl}");
#2、发送获取code的链接请求
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$set['key']}&redirect_uri={$backUrl}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
header("Location:" . $url);
exit;
}
#3、获取返回的信息 进行用户登录授权的操作
$code = $data['code'];
#4、判断当前code是否已被使用 已被使用则从新获取code
if (Cache::getCache($code, $code)) {
$data['request'] = 'get';
self::loginSource1Mode2($data);
die;
}
Cache::setCache($code, $code, $code);//储存code信息
#5、获取用户token信息
$tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
$tokenParams = [
'appid' => $set['key'],
'secret' => $set['secret'],
'code' => $code,
'grant_type' => 'authorization_code',
];
$tokenInfo = curlPostRequest($tokenUrl, $tokenParams);
#6、获取用户信息
$userUrl = "https://api.weixin.qq.com/sns/userinfo";
$userParams = [
'access_token' => $tokenInfo['access_token'],
'openid' => $tokenInfo['openid'],
'lang' => 'zh_CN',
];
$userInfo = curlPostRequest($userUrl, $userParams);
return $userInfo;
}
/**
* Comment: H5账号密码登录 —— 等待对接
* Author: zzw
* Date: 2019/10/22 9:38
* @param $data
*/
public function loginSource2Mode1($data) {
global $_W;
#1、参数获取
$type = $data['type'] ? $data['type'] : 1;//1=账号密码登录 2=短信验证码登录
$phone = $data['phone'];//手机号
$pwd = $data['password'];// 登录密码/短信验证码
$backUrl = urldecode($data['backurl']);
if (!$phone) Commons::sRenderError('请输入登录账号');
if (!$pwd) Commons::sRenderError($type == 1 ? '请输入密码' : '请输入验证码');
#2、根据登录方式进行判断是否登录成功
$member = pdo_get(PDO_NAME . "member", ['mobile' => $phone], ['password', 'id', 'salt', 'tokey', 'openid']);
if (!$member) Commons::sRenderError('账号不存在,请先注册!');
if ($type == 1) {
//账号密码登录 判断密码是否正确
if ($member['password'] != md5($pwd . $member['salt'])) Commons::sRenderError('密码错误!');
} else {
//短信验证码登录 判断验证码是否输入正确
$pin_info = pdo_get('wlmerchant_pincode',array('mobile' => $phone));
if(empty($pin_info)){
$this->renderError('验证码错误');
}
if($pin_info['time'] < time() - 300){
$this->renderError('验证码已过期,请重新获取',array('code'=>1));
}
if ($pwd != $pin_info['code']) Commons::sRenderError('验证码错误!');
}
#3、密码输出正确 成功登录
$userInfo = [
'mobile' => $phone,
'pwd' => $pwd,
'openid' => $member['openid'] ? $member['openid'] : $_W['wlmember']['openid'],
'tokey' => $member['tokey'] ? $member['tokey'] : $_W['wlmember']['tokey'],
];
wl_setcookie('usersign', $userInfo, 3600 * 24 * 30);
wl_setcookie('user_token', $userInfo['tokey'], 3600 * 24 * 30);
wl_setcookie('exitlogin_code', [], 100);
#3、登录成功 返回跳转地址
$link = $backUrl ? $backUrl : '';
Commons::sRenderSuccess('登录成功', ['back_url' => $link, 'token' => $userInfo['tokey']]);
}
/**
* Comment: 小程序微信登录
* Author: zzw
* Date: 2019/10/29 16:33
* @param $data
* @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
*/
static function loginSource3Mode2($data) {
global $_W;
if (!$data['code']) {
return error(1, '错误的code信息!');
}
#1、获取微信小程序设置项 并且配置基本信息
if (is_array($_W['wlsetting']['wxapp_config']) && count($_W['wlsetting']['wxapp_config']) > 0) {
$set = $_W['wlsetting']['wxapp_config'];
} else {
$set = Setting::wlsetting_read('wxapp_config');
}
$config = [
'app_id' => $set['appid'],
'secret' => $set['secret'],
];
#3、请求获取用户信息
try {
$app = Factory::miniProgram($config);
$userInfo = $app->auth->session($data['code']);
return $userInfo;
} catch (Exception $e) {
//错误抛出
return error(1, $e->getMessage());
}
}
public static function generateToken($token,$type = ''){
//200:成功 登陆成功/访问成功
//401:未授权 重新登陆
//205:刷新token 访问成功,但是刷新秘钥
#token 为用户储存在数据中的token 唯一不变
#secretKey 为用户登陆秘钥,需要返回给移动端
#1、基本信息设置
$keyName = 'jwt_info';
if($type === 'login'){
$secretKey = self::createToken($token);
if($secretKey['errno'] == 401){
return error(401);
}
return error(200,$secretKey);
}else{
#1、访问请求操作 获取秘钥信息 根据状态返回信息
$loginDescInfo = pdo_get('wlmerchant_login',array('secret_key' => $token));
//授权信息不存在 请重新登陆
if(is_array($loginDescInfo)){
if(empty($loginDescInfo['token'])){
file_put_contents(PATH_DATA . "login_error.log", var_export($loginDescInfo, true) . PHP_EOL, FILE_APPEND);
return error(401);
}
if($loginDescInfo['refresh_time'] > time()){
//未到刷新信息 访问请求有效 继续下一步操作
return error(200,$loginDescInfo['token']);
}else if($loginDescInfo['refresh_time'] <= time() && $loginDescInfo['end_time'] > time()){
//超过刷新时间 但是未过期 刷新访问秘钥 然后返回新的秘钥
$secretKey = self::createToken($loginDescInfo['token']);
if($secretKey['errno'] == 401){
file_put_contents(PATH_DATA . "login_error.log", var_export('刷新失败', true) . PHP_EOL, FILE_APPEND);
return error(401);
}
return error(205,$secretKey);
}else{
//其他情况 统一视为登陆过期 请重新登陆
file_put_contents(PATH_DATA . "login_error.log", var_export('其他情况', true) . PHP_EOL, FILE_APPEND);
return error(401);
}
}
}
file_put_contents(PATH_DATA . "login_error.log", var_export('更多其他情况', true) . PHP_EOL, FILE_APPEND);
return error(401);
}
protected static function createToken($token){
//登陆操作 生成登陆秘钥
if(empty($token)){
return error(401);
}
$data = [
'token' => $token ,//用户token 唯一
'secret_key' => md5($token . time()) ,//用户秘钥
'refresh_time' => time() + (86400 * 30) ,//秘钥刷新时间
'end_time' => time() + (86400 * 60) ,//秘钥过期时间
];
pdo_delete('wlmerchant_login',array('token'=>$token));
pdo_insert(PDO_NAME . 'login', $data);
return $data['secret_key'];
}
}