汪总电商平台
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.
 
 
 
 
 
 

1214 lines
44 KiB

<?php
namespace app\api\controller\wanlshop;
use app\common\controller\Api;
use addons\wanlshop\library\EasyWeChat\Easywechat;
use addons\wanlshop\library\WanlChat\WanlChat;
use app\common\library\Sms;
use fast\Random;
use fast\Http;
use think\Validate;
use think\Exception;
use think\exception\PDOException;
use think\exception\ValidateException;
/**
* WanlShop会员接口
*/
class User extends Api
{
protected $noNeedLogin = ['login', 'logout', 'mobilelogin', 'register', 'resetpwd', 'changeemail', 'changemobile', 'third', 'phone', 'perfect'];
protected $noNeedRight = ['*'];
public function _initialize()
{
parent::_initialize();
//WanlChat 即时通讯调用
$this->wanlchat = new WanlChat();
// Auth 写入
$this->auth->setAllowFields(['id','username','nickname','mobile','avatar','level','gender','birthday','bio','money','score','successions','maxsuccessions','prevtime','logintime','loginip','jointime']);
// Auth 读取
$this->auth->getAllowFields(['id','username','nickname','mobile','avatar','level','gender','birthday','bio','money','score','successions','maxsuccessions','prevtime','logintime','loginip','jointime']);
}
/**
* 会员登录
* @ApiMethod (POST)
* @param string $account 账号
* @param string $password 密码
*/
public function login()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$account = $this->request->post('account');
$password = $this->request->post('password');
$client_id = $this->request->post('client_id');
if (!$account || !$password) {
$this->error(__('Invalid parameters'));
}
$ret = $this->auth->login($account, $password);
if ($ret) {
if($client_id){
$this->wanlchat->bind($client_id, $this->auth->id);
}
$this->success(__('Logged in successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
}
$this->error(__('非法请求'));
}
/**
* 手机验证码登录
* @ApiMethod (POST)
* @param string $mobile 手机号
* @param string $captcha 验证码
*/
public function mobilelogin()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$mobile = $this->request->post('mobile');
$captcha = $this->request->post('captcha');
$client_id = $this->request->post('client_id');
if (!$mobile || !$captcha) {
$this->error(__('Invalid parameters'));
}
if (!Validate::regex($mobile, "^1\d{10}$")) {
$this->error(__('Mobile is incorrect'));
}
if (!Sms::check($mobile, $captcha, 'mobilelogin')) {
$this->error(__('Captcha is incorrect'));
}
$user = \app\common\model\User::getByMobile($mobile);
if ($user) {
if ($user->status != 'normal') {
$this->error(__('Account is locked'));
}
//如果已经有账号则直接登录
$ret = $this->auth->direct($user->id);
} else {
$ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []);
}
if ($ret) {
Sms::flush($mobile, 'mobilelogin');
if($client_id){
$this->wanlchat->bind($client_id, $this->auth->id);
}
$this->success(__('Logged in successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
}
$this->error(__('非法请求'));
}
/**
* 小程序手机号登录
* @ApiMethod (POST)
* @param string $encryptedData
* @param string $iv
*/
public function phone()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$post = $this->request->post();
if (!isset($post['iv'])) {
$this->error(__('获取手机号异常'));
}
// 1.1.9升级 改为Easywechat
try{
$auth = Easywechat::app()
->auth
->session($post['code']);
} catch (\Exception $e) {
$this->error($e->getMessage());
}
if(isset($auth['errcode'])){
$this->error($auth['errmsg']);
}
// 判断third是否存在ID,存在快速登录
if(isset($auth['unionid'])){
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'mp_weixin', 'unionid' => $auth['unionid']]);
}else{
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'mp_weixin', 'openid' => $auth['openid']]);
}
//如果已经有账号则直接登录
if ($third && $third['user_id'] != 0) {
$ret = $this->auth->direct($third['user_id']);
} else {
// 手机号解码
try{
$encryptor = Easywechat::app()
->encryptor
->decryptData($auth['session_key'], $post['iv'], $post['encryptedData']);
} catch (\Exception $e) {
$this->error($e->getMessage());
}
// 开始登录
$mobile = $encryptor['phoneNumber'];
$user = \app\common\model\User::getByMobile($mobile);
if ($user) {
if ($user->status != 'normal') {
$this->error(__('Account is locked'));
}
//如果已经有账号则直接登录
$ret = $this->auth->direct($user->id);
} else {
$ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []);
}
}
if ($ret) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$this->success(__('Logged in successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
}
$this->error(__('非法请求'));
}
/**
* 注册会员
* @ApiMethod (POST)
* @param string $mobile 手机号
* @param string $code 验证码
*/
public function register()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$mobile = $this->request->post('mobile');
$code = $this->request->post('captcha');
$client_id = $this->request->post('client_id');
if ($mobile && !Validate::regex($mobile, "^1\d{10}$")) {
$this->error(__('Mobile is incorrect'));
}
$ret = Sms::check($mobile, $code, 'register');
if (!$ret) {
$this->error(__('Captcha is incorrect'));
}
$ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []);
if ($ret) {
if($client_id){
$this->wanlchat->bind($client_id, $this->auth->id);
}
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
}
$this->error(__('非法请求'));
}
/**
* 注销登录
*/
public function logout($client_id = null)
{
// 踢出即时通讯 1.2.0升级
foreach ($this->wanlchat->getUidToClientId($this->auth->id) as $client_id) {
$this->wanlchat->destoryClient($client_id);
}
// 退出登录
$this->auth->logout();
$this->success(__('Logout successful'));
}
/**
* 修改会员个人信息
* @ApiMethod (POST)
*
* @param string $avatar 头像地址
* @param string $username 用户名
* @param string $nickname 昵称
* @param string $bio 个人简介
*/
public function profile()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$user = $this->auth->getUser();
$avatar = $this->request->post('avatar', '', 'trim,strip_tags,htmlspecialchars');
if($avatar){
$user->avatar = $avatar;
}else{
$username = $this->request->post('username');
$nickname = $this->request->post('nickname');
$bio = $this->request->post('bio');
// 1.1.9升级 生日和性别并不会提交到后台保存
$gender = $this->request->post('gender');
$birthday = $this->request->post('birthday');
// 1.1.9升级 优化为Easywechat
if($bio){
$bioCheck = true;
try{
$security = Easywechat::app()
->content_security
->checkText($bio);
if($security['errcode'] == 87014){
$bioCheck = false;
}
} catch (\Exception $e) {
$this->error('内容审核失败:可能后台小程序的appid、appsecret配置错误,具体:'. $e->getMessage());
}
if(!$bioCheck){
$this->error(__('风控审核:签名包含敏感词汇'));
}
}
if($nickname){
$nicknameCheck = true;
try{
$security = Easywechat::app()
->content_security
->checkText($nickname);
if($security['errcode'] == 87014){
$nicknameCheck = false;
}
} catch (\Exception $e) {
$this->error('内容审核失败:可能后台小程序的appid、appsecret配置错误,具体:'. $e->getMessage());
}
if(!$nicknameCheck){
$this->error(__('风控审核:昵称包含敏感词汇'));
}
}
if ($username) {
$usernameCheck = true;
try{
$security = Easywechat::app()
->content_security
->checkText($username);
if($security['errcode'] == 87014){
$usernameCheck = false;
}
} catch (\Exception $e) {
$this->error('内容审核失败:可能后台小程序的appid、appsecret配置错误,具体:'. $e->getMessage());
}
if(!$usernameCheck){
$this->error(__('风控审核:用户名包含敏感词汇'));
}
$exists = \app\common\model\User::where('username', $username)->where('id', '<>', $this->auth->id)->find();
if ($exists) {
$this->error(__('Username already exists'));
}
$user->username = $username;
}
$user->nickname = $nickname;
$user->bio = $bio;
// 1.1.9升级 生日和性别并不会提交到后台保存
$user->gender = $gender;
$user->birthday = $birthday;
}
$user->save();
$this->success('返回成功',$user);
}
$this->error(__('非法请求'));
}
/**
* 修改手机号
* @ApiMethod (POST)
* @param string $email 手机号
* @param string $captcha 验证码
*/
public function changemobile()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$user = $this->auth->getUser();
$mobile = $this->request->request('mobile');
$captcha = $this->request->request('captcha');
if (!$mobile || !$captcha) {
$this->error(__('Invalid parameters'));
}
if (!Validate::regex($mobile, "^1\d{10}$")) {
$this->error(__('Mobile is incorrect'));
}
if (\app\common\model\User::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) {
$this->error(__('Mobile already exists'));
}
$result = Sms::check($mobile, $captcha, 'changemobile');
if (!$result) {
$this->error(__('Captcha is incorrect'));
}
$verification = $user->verification;
$verification->mobile = 1;
$user->verification = $verification;
$user->mobile = $mobile;
$user->save();
Sms::flush($mobile, 'changemobile');
$this->success();
}
$this->error(__('非法请求'));
}
/**
* 重置密码
* @ApiMethod (POST)
* @param string $mobile 手机号
* @param string $newpassword 新密码
* @param string $captcha 验证码
*/
public function resetpwd()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$mobile = $this->request->post("mobile");
$newpassword = $this->request->post("newpassword");
$captcha = $this->request->post("captcha");
if (!$newpassword || !$captcha || !$mobile) {
$this->error(__('Invalid parameters'));
}
if (!Validate::regex($mobile, "^1\d{10}$")) {
$this->error(__('Mobile is incorrect'));
}
$user = \app\common\model\User::getByMobile($mobile);
if (!$user) {
$this->error(__('User not found'));
}
$ret = Sms::check($mobile, $captcha, 'resetpwd');
if (!$ret) {
$this->error(__('Captcha is incorrect'));
}
Sms::flush($mobile, 'resetpwd');
//模拟一次登录
$this->auth->direct($user->id);
$ret = $this->auth->changepwd($newpassword, '', true);
if ($ret) {
$this->success(__('Reset password successful'));
} else {
$this->error($this->auth->getError());
}
}
$this->error(__('非法请求'));
}
/**
* 第三方登录-web登录
* @ApiMethod (POST)
* @param string $platform 平台名称
*/
public function third_web()
{
$this->error(__('暂未开放'));
}
/**
* 第三方登录
* @ApiMethod (POST)
* @param string $platform 平台名称
* @param string $code Code码
*/
public function third()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
// 获取登录配置
$config = get_addon_config('wanlshop');
// 获取前端参数
$post = $this->request->post();
// 登录项目
$time = time();
$platform = $post['platform'];
// 开始登录
switch ($platform)
{
// 微信小程序登录
case 'mp_weixin':
// 1.1.9升级 改为Easywechat
try{
$auth = Easywechat::app()
->auth
->session($post['loginData']['code']);
} catch (\Exception $e) {
$this->error($e->getMessage());
}
if(isset($auth['errcode'])){
$this->error($auth['errmsg']);
}
if(isset($auth['unionid'])){
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'weixin_open', 'unionid' => $auth['unionid']]);
}else{
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'weixin_open', 'openid' => $auth['openid']]);
}
// 成功登录
if ($third) {
$user = model('app\common\model\User')->get($third['user_id']);
if (!$user) {
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third['token']
]);
}
$third->save([
'access_token' => $auth['session_key'],
'expires_in' => 7776000,
'logintime' => $time,
'expiretime' => $time + 7776000
]);
$ret = $this->auth->direct($user->id);
if ($ret) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
} else {
// 新增$third
$third = model('app\api\model\wanlshop\Third');
$third->platform = 'weixin_open';
if(isset($auth['unionid'])){
$third->unionid = $auth['unionid'];
}else{
$third->openid = $auth['openid'];
}
$third->access_token = $auth['session_key'];
$third->expires_in = 7776000;
$third->logintime = $time;
$third->expiretime = $time + 7776000;
// 判断当前是否登录
if($this->auth->isLogin()){
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$third->user_id = $this->auth->id;
$third->save();
// 直接绑定自动完成
$this->success('绑定成功', [
'binding' => 1
]);
} else {
$third->token = Random::uuid();
$third->save();
// 通知客户端绑定
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third->token
]);
}
}
break;
// 微信App登录
case 'app_weixin':
$params = [
'access_token' => $post['loginData']['authResult']['access_token'],
'openid' => $post['loginData']['authResult']['openid']
];
$result = Http::sendRequest("https://api.weixin.qq.com/sns/userinfo", $params, 'GET');
if ($result['ret']) {
$json = (array)json_decode($result['msg'], true);
if(isset($json['unionid'])){
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'weixin_open', 'unionid' => $json['unionid']]);
}else{
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'weixin_open', 'openid' => $json['openid']]);
}
// 成功登录
if ($third) {
$third->save([
'access_token' => $post['loginData']['authResult']['access_token'],
'refresh_token' => $post['loginData']['authResult']['refresh_token'],
'expires_in' => $post['loginData']['authResult']['expires_in'],
'logintime' => $time,
'expiretime' => $time + $post['loginData']['authResult']['expires_in']
]);
$ret = $this->auth->direct($third['user_id']);
if ($ret) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
} else {
// 新增$third
$third = model('app\api\model\wanlshop\Third');
$third->platform = 'weixin_open';
if(isset($json['unionid'])){
$third->unionid = $json['unionid'];
}else{
$third->openid = $json['openid'];
}
$third->access_token = $post['loginData']['authResult']['access_token'];
$third->refresh_token = $post['loginData']['authResult']['refresh_token'];
$third->expires_in = $post['loginData']['authResult']['expires_in'];
$third->logintime = $time;
$third->expiretime = $time + $post['loginData']['authResult']['expires_in'];
// 判断当前是否登录,否则注册
if($this->auth->isLogin()){
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$third->user_id = $this->auth->id;
$third->save();
// 直接绑定自动完成
$this->success('绑定成功', [
'binding' => 1
]);
} else {
$username = $json['nickname'];
$auth = [];
$mobile = '';
$gender = $json['sex'] == 1 ? 1 : 0;
$avatar = $json['headimgurl'];
// 1.1.3升级
if(isset($json['unionid'])){
// 1.1.3升级 查询其他unionid的user_id进行登录
$unionid = model('app\api\model\wanlshop\Third')
->where('user_id','<>', 0)
->where('unionid','=', $json['unionid'])
->find();
if($unionid){
$auth = $this->auth->direct($unionid['user_id']);
}else{
// 注册账户
$auth = $this->auth->register('u_'.Random::alnum(6), Random::alnum(), '', $mobile, [
'gender' => $gender,
'nickname' => $username,
'avatar' => $avatar
]);
}
}else{
// 注册账户
$auth = $this->auth->register('u_'.Random::alnum(6), Random::alnum(), '', $mobile, [
'gender' => $gender,
'nickname' => $username,
'avatar' => $avatar
]);
}
if ($auth) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
// 更新第三方登录
$third->user_id = $this->auth->id;
$third->openname = $username;
$third->save();
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
}
}
}else{
$this->error('API异常,App登录失败');
}
break;
// 微信公众号登录
case 'h5_weixin':
$params = [
'appid' => $config['sdk_qq']['gz_appid'],
'secret' => $config['sdk_qq']['gz_secret'],
'code' => $post['code'],
'grant_type' => 'authorization_code'
];
$result = Http::sendRequest('https://api.weixin.qq.com/sns/oauth2/access_token', $params, 'GET');
if ($result['ret']) {
$access = (array)json_decode($result['msg'], true);
//获取用户信息
$queryarr = [
"access_token" => $access['access_token'],
"openid" => $access['openid']
];
$ret = Http::sendRequest("https://api.weixin.qq.com/sns/userinfo", $queryarr, 'GET');
if ($ret['ret']) {
$json = (array)json_decode($ret['msg'], true);
if(isset($json['unionid'])){
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'weixin_h5', 'unionid' => $json['unionid']]);
}else{
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'weixin_h5', 'openid' => $json['openid']]);
}
// 成功登录
if ($third) {
$third->save([
'openid' => $json['openid'], // 1.1.2升级
'access_token' => $access['access_token'],
'refresh_token' => $access['refresh_token'],
'expires_in' => $access['expires_in'],
'logintime' => $time,
'expiretime' => $time + $access['expires_in']
]);
// 登录客户端
$ret = $this->auth->direct($third['user_id']);
if ($ret) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
} else {
// 新增$third
$third = model('app\api\model\wanlshop\Third');
$third->platform = 'weixin_h5';
// 1.1.2升级
if(isset($json['unionid'])){
$third->unionid = $json['unionid'];
$third->openid = $json['openid'];
}else{
$third->openid = $json['openid'];
}
$third->access_token = $access['access_token'];
$third->refresh_token = $access['refresh_token'];
$third->expires_in = $access['expires_in'];
$third->logintime = $time;
$third->expiretime = $time + $access['expires_in'];
// 获取到的用户信息
$username = $json['nickname'];
$auth = [];
$mobile = '';
$gender = $json['sex'] == 1 ? 1 : 0;
$avatar = $json['headimgurl'];
// 1.1.3升级
if(isset($json['unionid'])){
// 1.1.3升级 查询其他unionid的user_id进行登录
$unionid = model('app\api\model\wanlshop\Third')
->where('user_id','<>', 0)
->where('unionid','=', $json['unionid'])
->find();
if($unionid){
$auth = $this->auth->direct($unionid['user_id']);
}else{
// 注册账户
$auth = $this->auth->register('u_'.Random::alnum(6), Random::alnum(), '', $mobile, [
'gender' => $gender,
'nickname' => $username,
'avatar' => $avatar
]);
}
}else{
// 注册账户
$auth = $this->auth->register('u_'.Random::alnum(6), Random::alnum(), '', $mobile, [
'gender' => $gender,
'nickname' => $username,
'avatar' => $avatar
]);
}
if ($auth) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
// 更新第三方登录
$third->user_id = $this->auth->id;
$third->openname = $username;
$third->save();
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
}
}else{
$this->error('获取用户信息失败!');
}
}else{
$this->error('获取openid失败!');
}
break;
// QQ小程序登录
case 'mp_qq':
$params = [
'appid' => $config[$platform]['appid'],
'secret' => $config[$platform]['appsecret'],
'js_code' => $post['loginData']['code'],
'grant_type' => 'authorization_code'
];
$result = Http::sendRequest("https://api.q.qq.com/sns/jscode2session", $params, 'GET');
if ($result['ret']) {
$json = (array)json_decode($result['msg'], true);
if(isset($json['unionid'])){
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'qq_open', 'unionid' => $json['unionid']]);
}else{
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'qq_open', 'openid' => $json['openid']]);
}
// 成功登录
if ($third) {
$user = model('app\common\model\User')->get($third['user_id']);
if (!$user) {
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third['token']
]);
}
$third->save([
'access_token' => $json['session_key'],
'expires_in' => 7776000,
'logintime' => $time,
'expiretime' => $time + 7776000
]);
$ret = $this->auth->direct($user->id);
if ($ret) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
} else {
// 新增$third
$third = model('app\api\model\wanlshop\Third');
$third->platform = 'qq_open';
if(isset($json['unionid'])){
$third->unionid = $json['unionid'];
}else{
$third->openid = $json['openid'];
}
$third->access_token = $json['session_key'];
$third->expires_in = 7776000;
$third->logintime = $time;
$third->expiretime = $time + 7776000;
// 判断当前是否登录
if($this->auth->isLogin()){
// 1.1.4升级
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$third->user_id = $this->auth->id;
$third->save();
// 直接绑定自动完成
$this->success('绑定成功', [
'binding' => 1
]);
} else {
$third->token = Random::uuid();
$third->save();
// 通知客户端绑定
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third->token
]);
}
}
}else{
$this->error('API异常,微信小程序登录失败');
}
break;
// QQ App登录
case 'app_qq':
$params = [
'access_token' => $post['loginData']['authResult']['access_token']
];
$options = [
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded'
]
];
$result = Http::sendRequest("https://graph.qq.com/oauth2.0/me", $params, 'GET' ,$options);
if ($result['ret']) {
$json = (array)json_decode(str_replace(" );","",str_replace("callback( ","",$result['msg'])), true);
if ($json['openid'] == $post['loginData']['authResult']['openid']) {
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'qq_open', 'openid' => $json['openid']]);
if ($third) {
$user = model('app\common\model\User')->get($third['user_id']);
if (!$user) {
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third['token']
]);
}
$third->save([
'access_token' => $post['loginData']['authResult']['access_token'],
'expires_in' => $post['loginData']['authResult']['expires_in'],
'logintime' => $time,
'expiretime' => $time + $post['loginData']['authResult']['expires_in']
]);
$ret = $this->auth->direct($third['user_id']);
if ($ret) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
} else {
// 新增$third
$third = model('app\api\model\wanlshop\Third');
$third->platform = 'qq_open';
$third->openid = $json['openid'];
$third->access_token = $post['loginData']['authResult']['access_token'];
$third->expires_in = $post['loginData']['authResult']['expires_in'];
$third->logintime = $time;
$third->expiretime = $time + $post['loginData']['authResult']['expires_in'];
// 判断当前是否登录
if($this->auth->isLogin()){
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$third->user_id = $this->auth->id;
$third->save();
// 直接绑定自动完成
$this->success('绑定成功', [
'binding' => 1
]);
} else {
$third->token = Random::uuid();
$third->save();
// 通知客户端绑定
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third->token
]);
}
}
} else {
$this->error(__('非法请求,机器信息已提交'));
}
}else{
$this->error('API异常,App登录失败');
}
break;
// QQ 网页登录
case 'h5_qq':
// 后续版本上线
break;
// 微博App登录
case 'app_weibo':
$params = [
'access_token' => $post['loginData']['authResult']['access_token']
];
$options = [
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded'
],
CURLOPT_POSTFIELDS => http_build_query($params),
CURLOPT_POST => 1
];
$result = Http::post("https://api.weibo.com/oauth2/get_token_info", $params, $options);
$json = (array)json_decode($result, true);
if($json['uid'] == $post['loginData']['authResult']['uid']){
$third = model('app\api\model\wanlshop\Third')->get(['platform' => 'weibo_open', 'openid' => $json['uid']]);
if ($third) {
$user = model('app\common\model\User')->get($third['user_id']);
if (!$user) {
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third['token']
]);
}
$third->save([
'access_token' => $post['loginData']['authResult']['access_token'],
'expires_in' => $json['expire_in'],
'logintime' => $json['create_at'],
'expiretime' => $json['create_at'] + $json['expire_in']
]);
$ret = $this->auth->direct($third['user_id']);
if ($ret) {
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
} else {
// 新增$third
$third = model('app\api\model\wanlshop\Third');
$third->platform = 'weibo_open';
$third->openid = $json['uid'];
$third->access_token = $post['loginData']['authResult']['access_token'];
$third->expires_in = $json['expire_in'];
$third->logintime = $json['create_at'];
$third->expiretime = $json['create_at'] + $json['expire_in'];
// 判断当前是否登录
if($this->auth->isLogin()){
// 1.1.4升级
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
$third->user_id = $this->auth->id;
$third->save();
// 直接绑定自动完成
$this->success('绑定成功', [
'binding' => 1
]);
} else {
$third->token = Random::uuid();
$third->save();
// 通知客户端绑定
$this->success('尚未绑定用户', [
'binding' => 0,
'token' => $third->token
]);
}
}
}else{
$this->error(__('非法请求,机器信息已提交'));
}
break;
// 小米App登录
case 'app_xiaomi':
break;
// 苹果登录
case 'apple':
// 后续版本上线
break;
default:
$this->error('暂并不支持此方法登录');
}
}
$this->error(__('10086非正常请求'));
}
/**
* 进一步完善资料
* @ApiMethod (POST)
*/
public function perfect()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$post = $this->request->post();
// 判断token没有绑定 1.1.4升级
$third = model('app\api\model\wanlshop\Third')
->where('token', '=', $post['token'])
->find();
// 当user_id 不为空可以绑定
if($third['user_id'] == 0 && $third){
$username = $post['nickName'];
$auth = [];
$mobile = '';
$gender = $post['gender'];
$avatar = $post['avatarUrl'];
// 1.1.9升级
if ($username) {
$usernameCheck = true;
try{
$security = Easywechat::app()
->content_security
->checkText($username);
if($security['errcode'] == 87014){
$usernameCheck = false;
}
} catch (\Exception $e) {
$this->error('内容审核失败:可能后台小程序的appid、appsecret配置错误,具体:'. $e->getMessage());
}
if(!$usernameCheck){
$this->error(__('风控审核:用户名包含敏感词汇'));
}
}
// 1.1.4升级
if($third['unionid']){
// 1.1.3升级 查询其他unionid的user_id进行登录
$unionid = model('app\api\model\wanlshop\Third')
->where('id','<>', $third['id'])
->where('unionid','=', $third['unionid'])
->find();
if($unionid){
$auth = $this->auth->direct($unionid['user_id']);
}else{
$auth = $this->auth->register('u_'.Random::alnum(6), Random::alnum(), '', $mobile, [
'gender' => $gender,
'nickname' => $username,
'avatar' => $avatar
]);
}
}else{
$auth = $this->auth->register('u_'.Random::alnum(6), Random::alnum(), '', $mobile, [
'gender' => $gender,
'nickname' => $username,
'avatar' => $avatar
]);
}
if ($auth) {
// 1.1.4升级
if (isset($post['client_id']) && $post['client_id'] != null) {
$this->wanlchat->bind($post['client_id'], $this->auth->id);
}
// 更新第三方登录
$third->save([
'user_id' => $this->auth->id,
'openname' => $username
]);
$this->success(__('Sign up successful'), self::userInfo());
} else {
$this->error($this->auth->getError());
}
}else{
$this->error(__('非法请求,机器信息已提交'));
}
}
$this->error(__('非法请求'));
}
/**
* 刷新用户中心
* @ApiMethod (POST)
*/
public function refresh()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$this->success(__('刷新成功'), self::userInfo());
}
$this->error(__('非法请求'));
}
/**
* 数据统计 - 内部使用,开发者不要调用
*/
private function userInfo()
{
$user_id = $this->auth->id;
// 查询订单
$order = model('app\api\model\wanlshop\Order')
->where('user_id', $user_id)
->select();
$orderCount = array_count_values(array_column($order,'state'));
// 物流列表
$logistics = [];
foreach ($order as $value)
{
if($value['state'] >=3 && $value['state'] <=6){
//需要查询的订单
}
}
// 统计数量
$collection = [];
$concern = [];
// 1.1.0升级
$footgoodsprint = [];
$footgroupsprint = [];
foreach (model('app\api\model\wanlshop\GoodsFollow')->where('user_id', $user_id)->select() as $row) {
if($row['goods_type'] === 'goods'){
if(model('app\api\model\wanlshop\Goods')->get($row['goods_id'])){
$collection[] = $row['id'];
}
}else if($row['goods_type'] === 'groups'){
if(model('app\api\model\wanlshop\groups\Goods')->get($row['goods_id'])){
$collection[] = $row['id'];
}
}
}
// 1.0.8升级 通过uuid查询足迹
$uuid = $this->request->server('HTTP_UUID');
if(!isset($uuid)){
$charid = strtoupper(md5($this->request->header('user-agent').$this->request->ip()));
$uuid = substr($charid, 0, 8).chr(45).substr($charid, 8, 4).chr(45).substr($charid,12, 4).chr(45).substr($charid,16, 4).chr(45).substr($charid,20,12);
}
foreach (model('app\api\model\wanlshop\Record')->where('uuid', $uuid)->select() as $row) {
if($row['goods_type'] === 'goods'){
if(model('app\api\model\wanlshop\Goods')->get($row['goods_id'])){
$footgoodsprint[] = $row['goods_id'];
}
}else if($row['goods_type'] === 'groups'){
if(model('app\api\model\wanlshop\groups\Goods')->get($row['goods_id'])){
$footgroupsprint[] = $row['goods_id'];
}
}
}
// 查询动态 、收藏夹、关注店铺、足迹、红包卡券
$finish = isset($orderCount[6]) ? $orderCount[6] : 0;
$pay = isset($orderCount[1]) ? $orderCount[1] : 0;
$delive = isset($orderCount[2]) ? $orderCount[2] : 0;
$receiving = isset($orderCount[3]) ? $orderCount[3] : 0;
$evaluate = isset($orderCount[4]) ? $orderCount[4] : 0;
// 订单状态:1=待支付,2=待成团,3=待发货,4=待收货,5=待评论,6=已完成,7=已取消
$groups = model('app\api\model\wanlshop\groups\Order')
->where('user_id', 'eq', $user_id)
->where('state', 'neq', 7)
->count();
return [
'userinfo' => $this->auth->getUserinfo(),
'statistics' => [
'dynamic' => [
'collection' => count($collection),
'concern' => model('app\api\model\wanlshop\find\Follow')->where('user_id', $user_id)->count(),
'footprint' => count(array_flip($footgoodsprint)) + count(array_flip($footgroupsprint)),
'coupon' => model('app\api\model\wanlshop\CouponReceive')->where(['user_id' => $user_id, 'state' => '1'])->count(),
'accountbank' => model('app\api\model\wanlshop\PayAccount')->where('user_id', $user_id)->count()
],
'order' => [
'whole' => $finish + $pay + $delive + $receiving + $evaluate,
'groups' => $groups,
'pay' => $pay,
'delive' => $delive,
'receiving' => $receiving,
'evaluate' => $evaluate,
// 1.1.6升级 退款状态:0=申请退款,1=卖家同意,2=卖家拒绝,3=申请平台介入,4=成功退款,5=退款已关闭,6=已提交物流,7=第三方退款中,8=退款失败
'customer' => model('app\api\model\wanlshop\Refund')->where(['state' => ['in','0,1,2,3,6,7,8'], 'user_id' => $this->auth->id])->count()
],
'logistics' => $logistics
]
];
}
/**
* 获取评论列表
*
* @ApiSummary (WanlShop 获取我的所有评论)
* @ApiMethod (GET)
*
* @param string $list_rows 每页数量
* @param string $page 当前页
*/
public function comment()
{
$list = model('app\api\model\wanlshop\GoodsComment')
->where('user_id', $this->auth->id)
->field('id,images,score,goods_id,order_goods_id,state,content,createtime')
->order('createtime desc')
->paginate()
->each(function($data, $key){
$data['order_goods'] = $data->order_goods ? $data->order_goods->visible(['id','title','image','price']):'';
return $data;
});
$this->success('返回成功', $list);
}
/**
* 获取积分明细
*/
public function scoreLog()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$list = model('app\common\model\ScoreLog')
->where('user_id', $this->auth->id)
->order('createtime desc')
->paginate();
$this->success('ok',$list);
}
$this->error(__('非法请求'));
}
}