109 lines
3.9 KiB
PHP
Executable File
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;
|
|
}
|
|
} |