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.
 
 
 
 
 
 
zhishifufei_php/extend/basic/WapBasic.php

570 lines
23 KiB

<?php
// +----------------------------------------------------------------------
// | 天诚科技 [ 刘海东 17600099397赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.tczxkj.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 该系统并不是自由软件,未经许可不能去掉相关版权
// +----------------------------------------------------------------------
// | Author:甘肃天诚志信电子商务有限公司 刘海东 联系电话维系17600099397
// +----------------------------------------------------------------------
namespace basic;
use app\wap\model\user\User;
use app\wap\model\user\WechatUser;
use behavior\wap\WapBehavior;
use service\JsonService;
use service\SystemConfigService;
use app\admin\model\system\SystemConfig;
use app\wap\model\user\KuaishouUser;
use app\wap\model\user\ToutiaoUser;
use think\Controller;
use behavior\wechat\UserBehavior;
use service\HookService;
use service\UtilService;
use service\WechatService;
use service\WechatSubscribe;
use think\Cookie;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\DbException;
use think\Request;
use think\Session;
use think\Url;
use think\exception\ValidateException;
use service\MiniProgramService;
use service\JwtService;
use service\KuaiMiniProgramService;
use service\TouMiniProgramService;
class WapBasic extends Controller
{
const DEFAULT_ERROR_MSG = '操作失败,请稍候再试!';
protected function _initialize()
{
parent::_initialize(); // TODO: Change the autogenerated stub
HookService::listen('wap_init', null, null, false, WapBehavior::class);
}
/**
* 操作失败 弹窗提示
* @param string $msg
* @param int $url
* @param string $title
*/
protected function failed($msg = '操作失败', $url = 0, $title = '信息提示')
{
if ($this->request->isAjax()) {
exit(JsonService::fail($msg, $url)->getContent());
} else {
$this->assign(compact('title', 'msg', 'url'));
exit($this->fetch('public/error'));
}
}
/**
* 操作成功 弹窗提示
* @param $msg
* @param int $url
*/
protected function successful($msg = '操作成功', $url = 0, $title = '成功提醒')
{
if ($this->request->isAjax()) {
exit(JsonService::successful($msg, $url)->getContent());
} else {
$this->assign(compact('title', 'msg', 'url'));
exit($this->fetch('public/success'));
}
}
public function _empty($name)
{
$url = strtolower($name) == 'index' ? Url::build('Index/index', '', true, true) : 0;
return $this->failed('请求页面不存在!', $url);
}
/**判断redis状态
* @param $msg
*/
public function serRedisPwd($msg)
{
if (strpos($msg, 'username-password pair') !== false) {
return $this->failed('请检查redis密码!', 'http://help.crmeb.net/crmeb_zsff/2291680');
} elseif (strpos($msg, 'Connection refused') !== false) {
return $this->failed('请安装redis软件或连接被拒绝!');
} elseif (strpos($msg, 'NOAUTH Authentication required') !== false) {
return $this->failed('redis认证错误!', 'http://help.crmeb.net/crmeb_zsff/2000690');
} elseif (strpos($msg, 'not support: redis') !== false) {
return $this->failed('请安装redis扩展!', 'http://help.crmeb.net/crmeb_zsff/1863590');
} else {
return $this->failed('请设置redis密码!', 'http://help.crmeb.net/crmeb_zsff/1907223');
}
}
protected function oauth($spread_uid = 0, $is_h5 = false)
{ /* exit($this->failed('微信用户信息获取失败!!')); */
$openid = Session::get('loginOpenid', 'wap');
if ($openid && $is_h5) return WechatUser::where('openid', $openid)->find()['uid'];
if ($openid) return $openid;
if (!UtilService::isWechatBrowser()) exit($this->failed('请在微信客户端打开链接'));
//if ($this->request->isAjax()) exit($this->failed('请登陆!'));
$errorNum = (int)Cookie::get('_oen');
if ($errorNum && $errorNum > 3) exit($this->failed('微信用户信息获取失败!!'));
try {
$original = WechatService::oauthService()->getAccessToken($this->request->get('code'));
if (!WechatUser::be(['openid' => $original->openid]) && $original->scope === 'snsapi_base') {
exit(WechatService::oauthService()->scopes(['snsapi_userinfo'])
->redirect($this->request->url(true))->send());
}
$wechatInfo = WechatSubscribe::baseParseGet($original->access_token, $original->openid); //获取单个用户信息
if (isset($wechatInfo['errcode']) && $wechatInfo['errcode'] == 48001) {
if ($is_h5) {
exit("登陆失败");
}
exit(WechatService::oauthService()->scopes(['snsapi_userinfo'])
->redirect($this->request->url(true))->send());
}
} catch (\Exception $e) {
//Cookie::set('_oen', ++$errorNum, 900);
if ($is_h5) {
exit("登陆失败");
}
exit(WechatService::oauthService()->scopes(['snsapi_base'])
->redirect($this->request->url(true))->send());
}
if (!isset($wechatInfo['nickname']) || $wechatInfo['nickname'] == '') {
exit(WechatService::oauthService()->scopes(['snsapi_userinfo'])
->redirect($this->request->url(true))->send());
}
if (isset($wechatInfo['openid']) && $wechatInfo['openid']) {
$wechatInfoData = WechatService::getUserInfo($wechatInfo['openid']);
$wechatInfo['subscribe'] = $wechatInfoData['subscribe'];
$wechatInfo['subscribe_time'] = $wechatInfoData['subscribe_time'];
$wechatInfo['groupid'] = $wechatInfoData['groupid'];
if (isset($wechatInfoData['tagid_list'])) $wechatInfo['tagid_list'] = implode(',', $wechatInfoData['tagid_list']);
} else {
if (isset($wechatInfo['privilege'])) unset($wechatInfo['privilege']);
if (!WechatUser::be(['openid' => $wechatInfo['openid']])) $wechatInfo['subscribe'] = 0;
}
Cookie::delete('_oen');
$openid = $wechatInfo['openid'];
$wechatInfo['spread_uid'] = $spread_uid;
if (!$is_h5) {
HookService::afterListen('wechat_oauth', $openid, $wechatInfo, false, UserBehavior::class);
Session::set('loginOpenid', $openid, 'wap');
Cookie::set('is_login', 1);
return $openid;
} else {
return UserBehavior::wechatOauthAfter($openid, $wechatInfo, true);
}
}
/**
* APP微信授权登录
* @param $code
* @param $spid
* @param $spread
* @param $iv
* @param $encryptedData
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
*/
public function newAuthWxApp($code, $spid, $spread, $iv, $encryptedData)
{
$userInfoCong = (array)json_decode($encryptedData);
$userInfo['unionId'] = isset($userInfoCong['unionId']) ? $userInfoCong['unionId'] : '';
$userInfo['openId'] = $openid = $userInfoCong['openId'];
$userInfo['spid'] = $spid;
$userInfo['code'] = $spread;
$userInfo['login_type'] = 'wxapp';
$userInfo['nickName'] = $userInfoCong['nickName'];
$userInfo['avatarUrl'] = $userInfoCong['avatarUrl'];
$createData = $this->routineOauth($userInfo);
/** @var WechatUserServices $wechatUserServices */
$wechatUserServices = new WechatUser;
$user = $wechatUserServices->getAuthUserInfo($openid, 'wxapp');
try {
if (!$user) {
// 新用户获取后台默认头像
$createData['headimgurl'] = $userInfoCong['avatarUrl'];
$createData[1]['headimgurl'] = $userInfoCong['avatarUrl'];
// 新用户获取后台默认名称
$createData['nickname'] = $userInfoCong['nickName'];
$createData[1]['nickname'] = $userInfoCong['nickName'];
$user = $wechatUserServices->wechatOauthAfter($createData);
} else {
//更新用户信息
$wechatUserServices->wechatUpdata([$user['uid'], $createData[1]]);
}
$tokenService = new JwtService();
$token['token'] = $tokenService->getToken((int)$user['uid']);
if ($token) {
/** @var UserVisitServices $visitServices */
/* $visitServices = app()->make(UserVisitServices::class);
$visitServices->loginSaveVisit($user); */
$token['userInfo'] = User::where('uid', $user['uid'])->find();
return $token;
} else
throw new ValidateException('登录失败');
} catch (\Throwable $th) {
return $th->getMessage();
}
}
/**
* 绑定微信
* @param Request $request
* @param $account
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function bindWeixin(Request $request, $account): void
{
[$ucode, $spid, $spread, $iv, $encryptedData, $type, $username, $currentAvatar] = UtilService::postMore([
['ucode', ''],
['spread_spid', 0],
['spread_code', ''],
['iv', ''],
['encryptedData', ''],
['type', 'weixin'],
['username', ''],
['currentAvatar', ''],
], $request, true);
if (!$ucode)
throw new ValidateException('授权失败,参数有误');
try {
$userInfoCong = MiniProgramService::getUserInfo($ucode);
$session_key = $userInfoCong['session_key'];
} catch (\Exception $e) {
throw new ValidateException('获取session_key失败,请检查您的配置!:' . $e->getMessage() . 'line' . $e->getLine());
}
if (!isset($userInfoCong['openid'])) {
throw new ValidateException('openid获取失败');
}
$userInfo = json_decode($encryptedData, true);
$userInfo['openId'] = $openid = $userInfoCong['openid'];
$userInfo['spid'] = $spid;
$userInfo['unionId'] = $userInfoCong['unionid'] ?? '';
$userInfo['code'] = $spread;
$userInfo['session_key'] = $session_key;
$userInfo['login_type'] = 'routine';
$createData = $this->routineOauth($userInfo);
$wechatUserServices = new WechatUser;
$user = $wechatUserServices->getAuthUserInfo($openid, 'routine');
if (!$wechatUserServices->where(['uid' => $account['uid']])->find()) {
$createData[1]['headimgurl'] = $currentAvatar;
// 新用户获取后台默认名称
$createData[1]['nickname'] = $username;
$wechatInfo = $createData[1];
$wechatInfo['uid'] = $account['uid'];
$wechatInfo['add_time'] = time();
if (!$wechatUserServices->save($wechatInfo)) {
throw new ValidateException('生成微信用户失败!');
}
} else {
if ($currentAvatar && $username) {
User::where('uid', $user['uid'])->update([
'avatar' => $currentAvatar,
'nickname' => $username
]);
}
$wechatUserServices->wechatUpdata([$user['uid'], $createData[1]]);
}
}
/**
* 小程序授权登录
* @param $code
* @param $spid
* @param $spread
* @param $iv
* @param $encryptedData
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
*/
public function newAuth($code, $spid, $spread, $iv, $encryptedData, $username, $currentAvatar)
{
if (!$code)
throw new ValidateException('授权失败,参数有误');
$session_key = '';
try {
$userInfoCong = MiniProgramService::getUserInfo($code);
$session_key = $userInfoCong['session_key'];
} catch (\Exception $e) {
throw new ValidateException('获取session_key失败,请检查您的配置!:' . $e->getMessage() . 'line' . $e->getLine());
}
if (!isset($userInfoCong['openid'])) {
throw new ValidateException('openid获取失败');
}
/*
try {
//解密获取用户信息
$userInfo = MiniProgramService::encryptor($session_key, $iv, $encryptedData);
} catch (\Exception $e) {
if ($e->getCode() == '-41003') {
throw new ValidateException('获取会话密匙失败');
}
}*/
$userInfo['unionId'] = isset($userInfoCong['unionid']) ? $userInfoCong['unionid'] : '';
$userInfo['openId'] = $openid = $userInfoCong['openid'];
$userInfo['spid'] = $spid;
$userInfo['code'] = $spread;
$userInfo['session_key'] = $session_key;
$userInfo['login_type'] = 'routine';
$createData = $this->routineOauth($userInfo);
$wechatUserServices = new WechatUser;
$user = $wechatUserServices->getAuthUserInfo($openid, 'routine');
//获取是否强制绑定手机号
/* $storeUserMobile = sys_config('store_user_mobile');
if ($storeUserMobile && !$user) {
$userInfoKey = md5($openid . '_' . time() . '_rouine');
Cache::setTokenBucket($userInfoKey, $createData, 7200);
return ['key' => $userInfoKey];
} else */
try {
if (!$user) {
// // 新用户获取后台默认头像
// $createData['headimgurl'] =SystemConfig::getValue('wechat_login_image');
// $createData[1]['headimgurl'] = SystemConfig::getValue('wechat_login_image');
// // 新用户获取后台默认名称
// $createData['nickname'] =SystemConfig::getValue('login_nickname');
// $createData[1]['nickname'] = SystemConfig::getValue('login_nickname');
// 新用户获取后台默认头像
$createData['headimgurl'] = $currentAvatar;
$createData[1]['headimgurl'] = $currentAvatar;
// 新用户获取后台默认名称
$createData['nickname'] = $username;
$createData[1]['nickname'] = $username;
$user = $wechatUserServices->wechatOauthAfter($createData);
} else {
//更新用户信息
// unset($createData[1]['nickname']);
// unset($createData[1]['headimgurl']);
if ($currentAvatar && $username) {
User::where('uid', $user['uid'])->update([
'avatar' => $currentAvatar,
'nickname' => $username
]);
}
$wechatUserServices->wechatUpdata([$user['uid'], $createData[1]]);
}
$tokenService = new JwtService();
$token['token'] = $tokenService->getToken((int)$user['uid']);
if ($token) {
/** @var UserVisitServices $visitServices */
/* $visitServices = app()->make(UserVisitServices::class);
$visitServices->loginSaveVisit($user); */
$token['userInfo'] = User::where('uid', $user['uid'])->find();
return $token;
} else
throw new ValidateException('登录失败');
} catch (\Throwable $th) {
return $th->getMessage();
}
}
/**
* 快手小程序授权登录
* @param $code
* @param $spid
* @param $spread
* @param $iv
* @param $encryptedData
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
*/
public function newAuth_KuaiShou($code, $spid, $spread, $iv, $encryptedData)
{
$KuaiMiniProgramService = new KuaiMiniProgramService();
if (!$code)
throw new ValidateException('授权失败,参数有误');
$session_key = '';
try {
$userInfoCong = $KuaiMiniProgramService->getUserInfo($code);
$session_key = $userInfoCong['session_key'];
} catch (\Exception $e) {
throw new ValidateException('获取session_key失败,请检查您的配置!:' . $e->getMessage() . 'line' . $e->getLine());
}
if (!isset($userInfoCong['open_id'])) {
throw new ValidateException('openid获取失败');
}
try {
//解密获取用户信息
$userInfo = KuaiMiniProgramService::encryptor($session_key, $iv, $encryptedData);
} catch (\Exception $e) {
if ($e->getCode() == '-41003') {
throw new ValidateException('获取会话密匙失败');
}
}
$userInfo['unionId'] = isset($userInfoCong['unionid']) ? $userInfoCong['unionid'] : '';
$userInfo['openId'] = $openid = $userInfoCong['open_id'];
$userInfo['spid'] = $spid;
$userInfo['code'] = $spread;
$userInfo['session_key'] = $session_key;
$userInfo['login_type'] = 'kuai_routine';
$createData = $this->routineOauth($userInfo);
$wechatUserServices = new KuaishouUser();
$user = $wechatUserServices->getAuthUserInfo($openid, 'kuai_routine');
try {
if (!$user) {
// 新用户获取后台默认头像
$createData['headimgurl'] = $userInfo['avatarUrl'];
$createData[1]['headimgurl'] = $userInfo['avatarUrl'];
// 新用户获取后台默认名称
$createData['nickname'] = $userInfo['nickName'];
$createData[1]['nickname'] = $userInfo['nickName'];
$user = $wechatUserServices->wechatOauthAfter($createData);
} else {
//更新用户信息
$wechatUserServices->wechatUpdata([$user['uid'], $createData[1]]);
}
$tokenService = new JwtService();
$token['token'] = $tokenService->getToken((int)$user['uid']);
if ($token) {
$token['userInfo'] = User::where('uid', $user['uid'])->find();
return $token;
} else
throw new ValidateException('登录失败');
} catch (\Throwable $th) {
return $th->getMessage();
}
}
/**
* 抖音头条小程序授权登录
* @param $code
* @param $spid
* @param $spread
* @param $iv
* @param $encryptedData
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
*/
public function newAuth_TouTiao($code, $spid, $spread, $iv, $encryptedData)
{
$TouMiniProgramService = new TouMiniProgramService ();
if (!$code)
throw new ValidateException('授权失败,参数有误');
$session_key = '';
try {
$userInfoCong = $TouMiniProgramService->getUserInfo($code);
$session_key = $userInfoCong['session_key'];
} catch (\Exception $e) {
throw new ValidateException('获取session_key失败,请检查您的配置!:' . $e->getMessage() . 'line' . $e->getLine());
}
if (!isset($userInfoCong['openid'])) {
throw new ValidateException('openid获取失败');
}
try {
//解密获取用户信息
$userInfo = TouMiniProgramService::encryptor($session_key, $iv, $encryptedData);
} catch (\Exception $e) {
if ($e->getCode() == '-41003') {
throw new ValidateException('获取会话密匙失败');
}
}
$userInfo['unionId'] = isset($userInfoCong['unionid']) ? $userInfoCong['unionid'] : '';
$userInfo['openId'] = $openid = $userInfoCong['openid'];
$userInfo['spid'] = $spid;
$userInfo['code'] = $spread;
$userInfo['session_key'] = $session_key;
$userInfo['login_type'] = 'kuai_routine';
$createData = $this->routineOauth($userInfo);
$toutiaoUser = new ToutiaoUser();
$user = $toutiaoUser->getAuthUserInfo($openid, 'kuai_routine');
try {
if (!$user) {
// 新用户获取后台默认头像
$createData['headimgurl'] = $userInfo['avatarUrl'];
$createData[1]['headimgurl'] = $userInfo['avatarUrl'];
// 新用户获取后台默认名称
$createData['nickname'] = $userInfo['nickName'];
$createData[1]['nickname'] = $userInfo['nickName'];
$user = $toutiaoUser->wechatOauthAfter($createData);
} else {
//更新用户信息
$toutiaoUser->wechatUpdata([$user['uid'], $createData[1]]);
}
$tokenService = new JwtService();
$token['token'] = $tokenService->getToken((int)$user['uid']);
if ($token) {
$token['userInfo'] = User::where('uid', $user['uid'])->find();
return $token;
} else
throw new ValidateException('登录失败');
} catch (\Throwable $th) {
return $th->getMessage();
}
}
/**
* 小程序创建用户后返回uid
* @param $routineInfo
* @return mixed
*/
public function routineOauth($routine)
{
$routineInfo['nickname'] = filter_emoji($routine['nickName'] ?? ''); //姓名
$routineInfo['sex'] = isset($routine['gender']) ?? 0; //性别
$routineInfo['language'] = isset($routine['language']) ?? ''; //语言
$routineInfo['city'] = isset($routine['city']) ?? ''; //城市
$routineInfo['province'] = isset($routine['province']) ?? ''; //省份
$routineInfo['country'] = isset($routine['country']) ?? ''; //国家
$routineInfo['headimgurl'] = $routine['avatarUrl'] ?? ''; //头像
$routineInfo['openid'] = $routine['openId'];
$routineInfo['session_key'] = isset($routine['session_key']) ?? ''; //会话密匙
$routineInfo['unionid'] = $routine['unionId']; //用户在开放平台的唯一标识符
$routineInfo['user_type'] = $routine['login_type']; //用户类型
$routineInfo['phone'] = $routine['phone'] ?? $routine['purePhoneNumber'] ?? '';
$spid = $routine['spid'] ?? 0; //绑定关系uid
//获取是否有扫码进小程序
/** @var QrcodeServices $qrcode */
/* $qrcode = app()->make(QrcodeServices::class);
if (isset($routine['code']) && $routine['code'] && ($info = $qrcode->get($routine['code']))) {
$spid = $info['third_id'];
} */
return [$routine['openId'], $routineInfo, $spid, $routine['login_type'] ?? 'routine', $routine['login_type'] ?? 'routine'];
}
}