dggjimai/application/api/controller/AuthController.php

109 lines
3.9 KiB
PHP
Executable File

<?php
namespace app\api\controller;
use app\common\model\User;
use app\common\model\ShopConfig;
use Exception;
use think\Request;
use think\response\Json;
use tools\Crypt;
use tools\WXBizDataCrypt;
class AuthController extends Controller
{
protected $authExcept = [
'login'
];
/**d
* 登录并发放token
* @param Request $request
* @param User $model
* @param UserValidate $validate
* @return Json|void
*/
public function login(Request $request,User $fumodel)
{
$param = $request->param();
$avatar =$param['avatar']??'';
$nickname =$param['nickname']??'';
$code =$param['code']??'';
$distribution_code =$param['distribution_code']??'';
$encryptedData =$param['encryptedData']??'';
$iv =$param['iv']??'';
if(!$avatar || !$nickname || !$code){
return error('参数不足');
}
$user_info = $this->get_openid($code,$encryptedData,$iv);
if (!$user_info['openid']) {
return error('授权失败');
}
$where['mobile'] = array('EQ',$user_info['tel']);
$userinfo = $fumodel->field('id,avatar,nickname,openid')->where($where)->find();
if($userinfo && !$userinfo['openid']){
$data_login['login_ip']=$request->ip();
$data_login['login_time']=time();
$data_login['openid']=$user_info['openid'];
$fumodel->where('id', $userinfo['id'])->update($data_login);
$token = $this->getToken($userinfo['id']);
$uid=Crypt::encrypt($userinfo['id']);
return success(['token' => $token,'uid'=>$uid], '登录成功');
}else if($userinfo && $userinfo['openid']){
$data_login['login_ip']=$request->ip();
$data_login['login_time']=time();
$fumodel->where('id', $userinfo['id'])->update($data_login);
$token = $this->getToken($userinfo['id']);
$uid=Crypt::encrypt($userinfo['id']);
return success(['token' => $token,'uid'=>$uid], '登录成功');
}
//登录逻辑
// 启动事务
$fumodel->startTrans();
try {
$res['sn'] =create_user_sn();
$res['distribution_code'] =generate_invite_code();
$res['nickname']=$nickname;
$res['username'] = '用户'.$res['sn'];
$res['avatar'] = $avatar;
$res['openid'] = $user_info['openid'];
$res['mobile'] = $user_info['tel'];
$res['create_time'] = time();
$res['login_ip']=$request->ip();
$res['login_time']=time();
$fumodel::create($res);
$uid=$fumodel->getLastInsID();
//分销
if($distribution_code){
$fumodel->code($distribution_code,$uid);
}
$fumodel->commit();
} catch (Exception $e) {
$fumodel->rollback();
return client_error($e->getMessage());
}
$uid=Crypt::encrypt($uid);
$token = $this->getToken($uid);
//返回数据
return success(['token' => $token,'uid'=>$uid], '注册成功');
}
//获取用户临时code 用来去获取openid
public function get_openid($code,$encryptedData,$iv)
{
$APPID =ShopConfig::get('website', 'APPID');
$APPSECRET=ShopConfig::get('website', 'APPSECRET');
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $APPID. '&secret=' . $APPSECRET. '&js_code=' . $code . '&grant_type=authorization_code';
$val = curl_request($url);
$user_info = json_decode($val,true);
$encryptedData=urldecode($encryptedData);
$iv = urldecode($iv);
$pc = new WXBizDataCrypt($APPID,$user_info['session_key']);
$errCode = $pc->decryptData($encryptedData,$iv,$data);
$data1 = json_decode($data, true);
$user_info['tel']=$data1['purePhoneNumber'];
return $user_info;
}
}