添加网站文件

This commit is contained in:
2025-12-22 13:59:40 +08:00
commit 117aaf83d1
19468 changed files with 2111999 additions and 0 deletions

View File

@@ -0,0 +1,558 @@
<?php
// +----------------------------------------------------------------------
// | likeshop100%开源免费商用商城系统
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | 开源版本可自由商用可去除界面版权logo
// | 商业版本务必购买商业授权,以免引起法律纠纷
// | 禁止对系统程序代码以任何目的,任何形式的再发布
// | gitee下载https://gitee.com/likeshop_gitee
// | github下载https://github.com/likeshop-github
// | 访问官网https://www.likeshop.cn
// | 访问社区https://home.likeshop.cn
// | 访问手册http://doc.likeshop.cn
// | 微信公众号likeshop技术社区
// | likeshop团队 版权所有 拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeshopTeam
// +----------------------------------------------------------------------
namespace app\api\controller;
use app\api\logic\LoginLogic;
use app\common\server\ConfigServer;
use app\common\server\WeChatServer;
use app\api\server\UserServer;
use app\api\cache\TokenCache;
use think\facade\Config;
use think\Db;
class Account extends ApiBase
{
public $like_not_need_login = ['register','applogin', 'login', 'mnplogin', 'codeurl', 'oalogin', 'oplogin','logout','smslogin', 'uinAppLogin', 'silentLogin', 'authLogin','stafflogin'];
/**
* note 注册接口
* create_time 2020/10/23 18:42
*/
public function register(){
$post = $this->request->post();
$post['check_code'] = ConfigServer::get('register_setting', 'open', 0);
$result = $this->validate($post,'app\api\validate\Register');
if($result ===true){
$data = LoginLogic::register($post);
if($data){
$this->_success('注册成功',$data);
}
$this->_error('获取失败',$result,0);
}$this->_error($result,'',0);
}
/**
* showdoc
* @catalog 接口/账号
* @title 手机号账号登录
* @description 手机号账号登录
* @method post
* @url /account/login
* @return {"code":1,"msg":"登录成功","data":["token":"3237676fa733d73333341",//登录令牌"nickname":"好象cms-小林",//昵称"avatar":"http://b2c.yixiangonline.com/uploads/user/avatar/3f102df244d5b40f21c4b25dc321c5ab.jpeg",//头像url"level":0,//等级],"show":0,"time":"0.775400"}
* @param account 必填 string 账号或手机号
* @param id 必填 int 1-密码登录-2-验证码登录
* @param password 必填 string 密码
* @param client 必填 int 客户端类型2-h53-ios4-android
* @return_param token string 登录令牌
* @return_param nickname string 昵称
* @return_param avatar string 头像
* @remark
* @number 1
*/
public function login()
{
$post = $this->request->post();
$check = $this->validate($post, 'app\api\validate\Login.password');
if (true !== $check) {
$this->_error($check);
}
$data = LoginLogic::login($post);
$this->_success('登录成功', $data);
}
/**
* 验证码登录
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
* @throws \think\exception\PDOException
*/
public function smsLogin(){
$post = $this->request->post();
$post['message_key'] = 'YZMDL';
$check = $this->validate($post, 'app\api\validate\Login.code');
if (true !== $check) {
$this->_error($check);
}
$data = LoginLogic::login($post);
$this->_success('登录成功', $data);
}
/**
* showdoc
* @catalog 接口/账号
* @title 小程序登录
* @description 小程序登录
* @method post
* @url /account/mnpLogin
* @return {"code":1,"msg":"登录成功","data":["token":"3237676fa733d73333341",//登录令牌"nickname":"好象cms-小林",//昵称"avatar":"http://b2c.yixiangonline.com/uploads/user/avatar/3f102df244d5b40f21c4b25dc321c5ab.jpeg",//头像url"level":0,//等级],"show":0,"time":"0.775400"}
* @param code 必填 string code
* @param iv 必填 string iv
* @param encrypted_data 必填 string encrypted_data
* @return_param token string 登录令牌
* @return_param nickname string 昵称
* @return_param avatar string 头像
* @remark
* @number 1
*/
public function mnpLogin()
{
$post = $this->request->post();
$check = $this->validate($post, 'app\api\validate\MnpLogin');
if (true !== $check) {
$this->_error($check);
}
$data = LoginLogic::mnpLogin($post);
$this->_success($data['msg'], $data['data'], $data['code'], $data['show']);
}
/**
* showdoc
* @catalog 接口/账号
* @title 获取获取向微信请求code的链接
* @description
* @method get
* @url /account/codeurl
* @param url 必填 varchar 前端当前url
* @return_param url string codeurl
* @remark 这里是备注信息
* @number 0
* @return {"code":1,"msg":"获取成功","data":{"url":'http://mp.weixin……'}}
*/
public function codeUrl()
{
$url = $this->request->get('url');
$this->_success('获取成功', ['url' => LoginLogic::codeUrl($url)], 1);
}
/**
* showdoc
* @catalog 接口/账号
* @title 微信H5登录
* @description 微信H5登录
* @method post
* @url /account/oalogin
* @return {"code":1,"msg":"登录成功","data":["token":"3237676fa733d73333341",//登录令牌"nickname":"好象cms-小林",//昵称"avatar":"http://b2c.yixiangonline.com/uploads/user/avatar/3f102df244d5b40f21c4b25dc321c5ab.jpeg",//头像url"level":0,//等级],"show":0,"time":"0.775400"}
* @param code 必填 string code
* @return_param token string 登录令牌
* @return_param nickname string 昵称
* @return_param avatar string 头像
* @remark
* @number 1
*/
public function oaLogin()
{
$post = $this->request->post();
$check = $this->validate($post, 'app\api\validate\OaLogin');
if (true !== $check) {
$this->_error($check);
}
$data = LoginLogic::oaLogin($post);
$this->_success($data['msg'], $data['data'], $data['code']);
}
/**
* showdoc
* @catalog 接口/账号
* @title 微信第三方app登录
* @description 微信第三方app登录
* @method post
* @url /account/oplogin
* @return {"code":1,"msg":"登录成功","data":["token":"3237676fa733d73333341",//登录令牌"nickname":"好象cms-小林",//昵称"avatar":"http://b2c.yixiangonline.com/uploads/user/avatar/3f102df244d5b40f21c4b25dc321c5ab.jpeg",//头像url"level":0,//等级],"show":0,"time":"0.775400"}
* @param code 必填 string code
* @param client 必填 int 客户端类型3-ios4-android
* @return_param token string 登录令牌
* @return_param nickname string 昵称
* @return_param avatar string 头像
* @remark
* @number 1
*/
public function opLogin()
{
$post = $this->request->post();
$check = $this->validate($post, 'app\api\validate\OpLogin');
if (true !== $check) {
$this->_error($check);
}
$data = LoginLogic::opLogin($post);
$this->_success($data['msg'], $data['data'], $data['code']);
}
/**
* 退出登录
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
* @throws \think\exception\PDOException
*/
public function logout()
{
LoginLogic::logout($this->user_id, $this->client);
//退出登录只有成功
$this->_success();
}
/**
* Notes: uniapp微信登录
* @author 段誉(2021/3/16 16:00)
*/
public function uinAppLogin()
{
$post = $this->request->post();
$data = LoginLogic::uinAppLogin($post);
$this->_success($data['msg'], $data['data'], $data['code']);
}
public function getrandstr($length = 10){
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$len = strlen($str)-1;
$randstr = '';
for ($i=0;$i<$length;$i++) {
$num=mt_rand(0,$len);
$randstr .= $str[$num];
}
return $randstr;
}
//2021-0419 小程序新版登录调整
/**
* Notes: 小程序登录(旧系统用户,返回用户信息,否则返回空)
* @author 段誉(2021/4/19 16:50)
*/
public function silentLogin()
{
$post = $this->request->post();
if(!empty($post['login_type']) && $post['login_type'] == 'toutiao'){
return $this->silentLogin_toutiao($post);
}
if (empty($post['code'])) {
$this->_error('参数缺失');
}
$data = LoginLogic::silentLogin($post);
$this->_success($data['msg'], $data['data'], $data['code'], $data['show']);
}
public function silentLogin_toutiao($data){
$url='https://developer.toutiao.com/api/apps/v2/jscode2session';
$data=[
'appid'=>'tt0523739e9a12236501',
'secret'=>'58280e4f36d88e93d7a4be9f0e590b2302a462c5',
'code'=>$data['code'],
//'anonymous_code'=>$anonymousCode,
];
$res=$this->json_post($url,$data);
// array(3) {
// ["err_no"]=>
// int(0)
// ["err_tips"]=>
// string(7) "success"
// ["data"]=>
// array(5) {
// ["session_key"]=>
// string(24) "xDIPf7whhzHFz+5ppTanFA=="
// ["openid"]=>
// string(36) "_000dypj-umBDuy6oz-nKqesccbK29flyIws"
// ["anonymous_openid"]=>
// string(0) ""
// ["unionid"]=>
// string(36) "eb8fbd8b-4124-595d-abf4-9fbca7ef3611"
// ["dopenid"]=>
// string(0) ""
// }
// }
$res=json_decode($res,true);
if(empty($res['data']['openid'])){
$this->_error('登录失败:'.json_encode($res));
}
$openid = $res['data']['openid'];
$unionid = $res['data']['unionid'];
$user_id =Db::name('user_auth')->where('openid',$openid)->find();
$response['headimgurl'] = $this->getrandstr();
$response['headimgurl'] = 'https://web.dulmao.com/uploads/images/202404240124289ecef8304.png';
$response['openid'] = $openid;
$response['unionid'] = $unionid;
if (empty($user_id)) {
$user_info = UserServer::createUser($response,8);
} else {
$user_info = UserServer::updateUser($response,8, $user_id);
}
//验证用户信息
$check_res = self::checkUserInfo($user_info);
if (true !== $check_res) {
return $this->_error($check_res);
}
//创建会话
$user_info['token'] = self::createSession($user_info['id'], 8);
unset($user_info['id'], $user_info['disable']);
return $this->_success('登录成功', $user_info);
}
public static function createSession($user_id, $client)
{
//清除之前缓存
$token = Db::name('session')
->where(['user_id' => $user_id, 'client' => $client])
->value('token');
if($token) {
$token_cache = new TokenCache($token);
$token_cache->del();
}
$result = Db::name('session')
->where(['user_id' => $user_id, 'client' => $client])
->find();
$time = time();
$expire_time = $time + Config::get('project.token_expire_time');
$token = md5($user_id . $client . $time);
$data = [
'user_id' => $user_id,
'token' => $token,
'client' => $client,
'update_time' => $time,
'expire_time' => $expire_time,
];
if (empty($result)) {
Db::name('session')->insert($data);
} else {
Db::name('session')
->where(['user_id' => $user_id, 'client' => $client])
->update($data);
}
//更新登录信息
$login_ip = $ip = request()->ip();
Db::name('user')
->where(['id' => $user_id])
->update(['login_time' => $time, 'login_ip' => $login_ip]);
//创建新的缓存
(new TokenCache($token, ['token' => $token]))->set(300);
return $token;
}
public static function checkUserInfo($user_info)
{
if (empty($user_info)) {
return '登录失败:user';
}
if ($user_info['disable']) {
return '该用户被禁用';
}
return true;
}
public function json_post($url, $data = [])
{
//$data=http_build_query($data);
//$data=json_encode($data);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
if(!$data){
return 'data is null';
}
if(is_array($data))
{
$data = json_encode($data);
}
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_HTTPHEADER,array(
'Content-Type: application/json; charset=utf-8',
'Content-Length:' . strlen($data),
'Cache-Control: no-cache',
'Pragma: no-cache'
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($curl);
$errorno = curl_errno($curl);
if ($errorno) {
return $errorno;
}
curl_close($curl);
return $res;
}
/**
* Notes: 小程序登录(新用户登录->需要提交昵称和头像参数)
* @author 段誉(2021/4/19 16:49)
*/
public function authLogin()
{
$post = $this->request->post();
$post['nickname'] = $this->getrandstr();
$post['headimgurl'] = 'https://web.dulmao.com/uploads/images/202404240124289ecef8304.png';
//|
if (empty($post['code']) || empty($post['nickname']) || empty($post['phone_code'])) {
$this->_error('参数缺失');
}
$phone = $this->code_phone($post['phone_code']);
$data = LoginLogic::authLogin($post,$phone);
$this->_success($data['msg'], $data['data'], $data['code'], $data['show']);
}
//获取手机号
public function code_phone($code){
$data['code'] = $code;
$config = WeChatServer::getMnpConfig();
$accessToken = '';
$cache = cache('wx_mini_token');
if(!empty($cache) && !empty($cache['token']) && $cache['exp'] > time()){
$accessToken = $cache['token'];
}else{
$token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$config['app_id']."&secret=".$config['secret']."";
$_accessToken = file_get_contents($token_url);
$_accessToken = json_decode($_accessToken);
if(!empty($_accessToken)){
$accessToken = $_accessToken->access_token;
cache('wx_mini_token',['token'=>$accessToken,'exp'=>time()+6000]);
}else{
$this->_error('获取token失败');
}
}
$url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=$accessToken";
$info = $this->http_request($url,json_encode($data),'json');
// 一定要注意转json否则汇报47001错误
$tmpinfo = json_decode($info,true);
if(empty($tmpinfo)){
$this->_error('获取手机号失败');
}
if(!empty($tmpinfo['errcode'])){
$this->_error($tmpinfo['errmsg']);
}
return $tmpinfo['phone_info']['phoneNumber'];
}
public function getAccessToken()
{
$appid = '填写自己的appID';
$secret = '填写自己的秘钥';
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret."";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$res = curl_exec($ch);
curl_close($ch);
return $res;
exit();
}
//图片合法性验证
public function http_request($url, $data = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json'
));
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
// 获取手机号
public function getPhoneNumber(){
$tmp = $this->getAccessToken();
$tmptoken = json_decode($tmp);
$token = $tmptoken->access_token;
$data['code'] = $_GET['code'];//前端获取code
$url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=$token";
$info = $this->http_request($url,json_encode($data),'json');
// 一定要注意转json否则汇报47001错误
$tmpinfo = json_decode($info);
$code = $tmpinfo->errcode;
$phone_info = $tmpinfo->phone_info;
//手机号
$phoneNumber = $phone_info->phoneNumber;
if($code == '0'){
echo json_encode(['code'=>1,'msg'=>'请求成功','phoneNumber'=>$phoneNumber]);
die();
}else{
echo json_encode(['code'=>2,'msg'=>'请求失败']);
die();
}
}
//员工端登入接口
public function stafflogin(){
$get = $this->request->get();
//判断是不是员工
$pass=md5(md5($get['password']));
$phone=Db::name('staff')->where('mobile',$get['phone'])->where('password','like',$pass)->find();
if($phone){
$this->_success('登入成功',$phone);
}else{
$this->_error('登入失败,请检查账号和密码');
}
}
}