From 1cb11b05381998711b6b35c7be7ec397c935e603 Mon Sep 17 00:00:00 2001 From: devil Date: Mon, 21 Sep 2020 10:03:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E4=B8=80=E9=94=AE?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E6=89=8B=E6=9C=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/controller/User.php | 156 ++++++++++-------------- application/service/UserService.php | 43 ++++--- extend/base/Wechat.php | 37 +++--- sourcecode/alipay/pages/login/login.js | 1 - sourcecode/baidu/app.js | 2 +- sourcecode/baidu/pages/login/login.js | 3 +- sourcecode/qq/pages/login/login.js | 1 - sourcecode/toutiao/pages/login/login.js | 1 - sourcecode/weixin/app.js | 2 +- sourcecode/weixin/pages/login/login.js | 3 +- 10 files changed, 108 insertions(+), 141 deletions(-) diff --git a/application/api/controller/User.php b/application/api/controller/User.php index b9e57ddc8..f30ff321d 100755 --- a/application/api/controller/User.php +++ b/application/api/controller/User.php @@ -160,28 +160,22 @@ class User extends Common */ public function WechatUserAuth() { - // 参数 - if(empty($this->data_post['authcode'])) - { - return DataReturn('授权码为空', -1); - } - // 授权 - $result = (new \base\Wechat(MyC('common_app_mini_weixin_appid'), MyC('common_app_mini_weixin_appsecret')))->GetAuthSessionKey($this->data_post['authcode']); - if($result !== false) + $result = (new \base\Wechat(MyC('common_app_mini_weixin_appid'), MyC('common_app_mini_weixin_appsecret')))->GetAuthSessionKey($this->data_post); + if($result['status'] == 0) { // 先从数据库获取用户信息 - $user = UserService::AppUserInfoHandle(null, 'weixin_openid', $result); + $user = UserService::AppUserInfoHandle(null, 'weixin_openid', $result['data']); if(empty($user)) { - return DataReturn('授权登录成功', 0, ['is_user_exist'=>0, 'openid'=>$result]); + return DataReturn('授权登录成功', 0, ['is_user_exist'=>0, 'openid'=>$result['data']]); } // 标记用户存在 $user['is_user_exist'] = 1; return DataReturn('授权登录成功', 0, $user); } - return DataReturn('授权登录失败', -100); + return DataReturn($result['msg'], -10); } /** @@ -223,14 +217,13 @@ class User extends Common if(empty($user)) { $result = (new \base\Wechat(MyC('common_app_mini_weixin_appid'), MyC('common_app_mini_weixin_appsecret')))->DecryptData($this->data_post['encrypted_data'], $this->data_post['iv'], $this->data_post['openid']); - - if(!empty($result) && is_array($result)) + if($result['status'] == 0 && !empty($result['data'])) { - $result['nick_name'] = isset($result['nickName']) ? $result['nickName'] : ''; - $result['avatar'] = isset($result['avatarUrl']) ? $result['avatarUrl'] : ''; - $result['gender'] = empty($result['gender']) ? 0 : (($result['gender'] == 2) ? 1 : 2); - $result['weixin_unionid'] = isset($result['unionId']) ? $result['unionId'] : ''; - $result['openid'] = $result['openId']; + $result['nick_name'] = isset($result['data']['nickName']) ? $result['data']['nickName'] : ''; + $result['avatar'] = isset($result['data']['avatarUrl']) ? $result['data']['avatarUrl'] : ''; + $result['gender'] = empty($result['data']['gender']) ? 0 : (($result['data']['gender'] == 2) ? 1 : 2); + $result['weixin_unionid'] = isset($result['data']['unionId']) ? $result['data']['unionId'] : ''; + $result['openid'] = $result['data']['openId']; $result['referrer']= isset($this->data_post['referrer']) ? $this->data_post['referrer'] : 0; return UserService::AuthUserProgram($result, 'weixin_openid'); } @@ -558,14 +551,14 @@ class User extends Common } /** - * 百度小程序用户手机绑定 + * 小程序用户手机一键绑定 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2020-09-20 * @desc description */ - public function BaiduUserMobileBind() + public function OnekeyUserMobileBind() { // 参数校验 $p = [ @@ -591,85 +584,60 @@ class User extends Common return DataReturn($ret, -1); } - // 解密数据 - $config = [ - 'appid' => MyC('common_app_mini_baidu_appid'), - 'key' => MyC('common_app_mini_baidu_appkey'), - 'secret' => MyC('common_app_mini_baidu_appsecret'), - ]; - $result = (new \base\Baidu($config))->DecryptData($this->data_post['encrypted_data'], $this->data_post['iv'], $this->data_post['openid'], 'mobile_bind'); - if($result['status'] == 0 && !empty($result['data'])) + // 根据不同平台处理数据解密逻辑 + $mobile = ''; + $error_msg = ''; + switch(APPLICATION_CLIENT_TYPE) { - $data = [ - 'openid' => $this->data_post['openid'], - 'mobile' => $result['data']['mobile'], - 'nickname' => isset($this->data_post['nickname']) ? $this->data_post['nickname'] : '', - 'avatar' => isset($this->data_post['avatar']) ? $this->data_post['avatar'] : '', - 'province' => isset($this->data_post['province']) ? $this->data_post['province'] : '', - 'city' => isset($this->data_post['city']) ? $this->data_post['city'] : '', - 'gender' => isset($this->data_post['gender']) ? intval($this->data_post['gender']) : '', - 'referrer' => isset($this->data_post['referrer']) ? intval($this->data_post['referrer']) : 0, - 'is_onekey_mobile_bind' => 1, - ]; - return UserService::AuthUserProgram($data, 'baidu_openid'); - } else { - return DataReturn($result['msg'], -1); - } - } + // 微信 + case 'weixin' : + $result = (new \base\Wechat(MyC('common_app_mini_weixin_appid'), MyC('common_app_mini_weixin_appsecret')))->DecryptData($this->data_post['encrypted_data'], $this->data_post['iv'], $this->data_post['openid']); + if($result['status'] == 0 && !empty($result['data']) && !empty($result['data']['purePhoneNumber'])) + { + $mobile = $result['data']['purePhoneNumber']; + } else { + $error_msg = $result['msg']; + } + break; - /** - * 微信小程序用户手机绑定 - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @date 2020-09-20 - * @desc description - */ - public function WeixinUserMobileBind() - { - // 参数校验 - $p = [ - [ - 'checked_type' => 'empty', - 'key_name' => 'openid', - 'error_msg' => 'openid为空', - ], - [ - 'checked_type' => 'empty', - 'key_name' => 'encrypted_data', - 'error_msg' => '解密数据为空', - ], - [ - 'checked_type' => 'empty', - 'key_name' => 'iv', - 'error_msg' => 'iv为空,请重试', - ] - ]; - $ret = ParamsChecked($this->data_post, $p); - if($ret !== true) + // 百度 + case 'baidu' : + $config = [ + 'appid' => MyC('common_app_mini_baidu_appid'), + 'key' => MyC('common_app_mini_baidu_appkey'), + 'secret' => MyC('common_app_mini_baidu_appsecret'), + ]; + $result = (new \base\Baidu($config))->DecryptData($this->data_post['encrypted_data'], $this->data_post['iv'], $this->data_post['openid'], 'mobile_bind'); + if($result['status'] == 0 && !empty($result['data']) && !empty($result['data']['mobile'])) + { + $mobile = $result['data']['mobile']; + } else { + $error_msg = $result['msg']; + } + break; + + // 默认 + default : + return DataReturn(APPLICATION_CLIENT_TYPE.'平台还未开发手机一键登录', -1); + } + if(empty($mobile)) { - return DataReturn($ret, -1); + return DataReturn(empty($error_msg) ? '数据解密失败' : $error_msg, -1); } - // 解密数据 - $result = (new \base\Wechat(MyC('common_app_mini_weixin_appid'), MyC('common_app_mini_weixin_appsecret')))->DecryptData($this->data_post['encrypted_data'], $this->data_post['iv'], $this->data_post['openid']); - if(!empty($result) && is_array($result) && !empty($result['purePhoneNumber'])) - { - $data = [ - 'openid' => $this->data_post['openid'], - 'mobile' => $result['purePhoneNumber'], - 'nickname' => isset($this->data_post['nickname']) ? $this->data_post['nickname'] : '', - 'avatar' => isset($this->data_post['avatar']) ? $this->data_post['avatar'] : '', - 'province' => isset($this->data_post['province']) ? $this->data_post['province'] : '', - 'city' => isset($this->data_post['city']) ? $this->data_post['city'] : '', - 'gender' => isset($this->data_post['gender']) ? intval($this->data_post['gender']) : '', - 'referrer' => isset($this->data_post['referrer']) ? intval($this->data_post['referrer']) : 0, - 'is_onekey_mobile_bind' => 1, - ]; - return UserService::AuthUserProgram($data, 'weixin_openid'); - } else { - return DataReturn($result, -1); - } + // 用户信息处理 + $data = [ + 'openid' => $this->data_post['openid'], + 'mobile' => $mobile, + 'nickname' => isset($this->data_post['nickname']) ? $this->data_post['nickname'] : '', + 'avatar' => isset($this->data_post['avatar']) ? $this->data_post['avatar'] : '', + 'province' => isset($this->data_post['province']) ? $this->data_post['province'] : '', + 'city' => isset($this->data_post['city']) ? $this->data_post['city'] : '', + 'gender' => isset($this->data_post['gender']) ? intval($this->data_post['gender']) : '', + 'referrer' => isset($this->data_post['referrer']) ? intval($this->data_post['referrer']) : 0, + 'is_onekey_mobile_bind' => 1, + ]; + return UserService::AuthUserProgram($data, APPLICATION_CLIENT_TYPE.'_openid'); } } ?> \ No newline at end of file diff --git a/application/service/UserService.php b/application/service/UserService.php index 019e1db46..9333e2f57 100755 --- a/application/service/UserService.php +++ b/application/service/UserService.php @@ -2024,11 +2024,6 @@ class UserService 'key_name' => 'verify', 'error_msg' => '验证码不能为空', ], - [ - 'checked_type' => 'empty', - 'key_name' => 'app_type', - 'error_msg' => '终端用户类型不能为空', - ], ]; $ret = ParamsChecked($params, $p); if($ret !== true) @@ -2061,24 +2056,20 @@ class UserService } // 用户信息 - $accounts_field = $params['app_type'].'_openid'; + $accounts_field = APPLICATION_CLIENT_TYPE.'_openid'; if(empty($params[$accounts_field])) { return DataReturn('用户openid不能为空', -20); } - // 是否需要审核 - $common_register_is_enable_audit = MyC('common_register_is_enable_audit', 0); - // 用户数据 $data = array( $accounts_field => $params[$accounts_field], 'mobile' => $params['mobile'], - 'status' => ($common_register_is_enable_audit == 1) ? 3 : 0, ); // 获取用户信息 - $temp_user = Db::name('User')->where([ + $mobile_user = Db::name('User')->where([ ['mobile', '=', $data['mobile']], ['is_delete_time', '=', 0], ])->find(); @@ -2088,40 +2079,48 @@ class UserService ])->find(); // 如果手机号码存在,并且openid也已存在,则更新掉之前的openid - if(!empty($temp_user)) + if(!empty($mobile_user)) { if(!empty($open_user)) { Db::name('User')->where(['id'=>$open_user['id']])->update([$accounts_field=>'', 'upd_time'=>time()]); } } else { - $temp_user = $open_user; + $mobile_user = $open_user; + } + + // 如果用户不存在则新增用户状态字段 + if(empty($mobile_user) && empty($open_user)) + { + // 是否需要审核 + $common_register_is_enable_audit = MyC('common_register_is_enable_audit', 0); + $data['status'] = ($common_register_is_enable_audit == 1) ? 3 : 0; } // 额外信息 - if(empty($temp_user['nickname']) && !empty($params['nickname'])) + if(empty($mobile_user['nickname']) && !empty($params['nickname'])) { $data['nickname'] = $params['nickname']; } - if(empty($temp_user['avatar']) && !empty($params['avatar'])) + if(empty($mobile_user['avatar']) && !empty($params['avatar'])) { $data['avatar'] = $params['avatar']; } - if(empty($temp_user['province']) && !empty($params['province'])) + if(empty($mobile_user['province']) && !empty($params['province'])) { $data['province'] = $params['province']; } - if(empty($temp_user['city']) && !empty($params['city'])) + if(empty($mobile_user['city']) && !empty($params['city'])) { $data['city'] = $params['city']; } - if(empty($temp_user) && isset($params['gender'])) + if(empty($mobile_user) && isset($params['gender'])) { $data['gender'] = intval($params['gender']); } // 不存在添加/则更新 - if(empty($temp_user)) + if(empty($mobile_user)) { $user_ret = self::UserInsert($data, $params); if($user_ret['code'] == 0) @@ -2135,7 +2134,7 @@ class UserService $unionid = self::UserUnionidHandle($params); if(!empty($unionid['field']) && !empty($unionid['value'])) { - if(empty($temp_user[$unionid['field']])) + if(empty($mobile_user[$unionid['field']])) { // unionid放入用户data中 $data[$unionid['field']] = $unionid['value']; @@ -2143,9 +2142,9 @@ class UserService } $data['upd_time'] = time(); - if(Db::name('User')->where(['id'=>$temp_user['id']])->update($data)) + if(Db::name('User')->where(['id'=>$mobile_user['id']])->update($data)) { - $user_id = $temp_user['id']; + $user_id = $mobile_user['id']; } } diff --git a/extend/base/Wechat.php b/extend/base/Wechat.php index 1f26d5bf1..495f88ffd 100755 --- a/extend/base/Wechat.php +++ b/extend/base/Wechat.php @@ -59,52 +59,57 @@ class Wechat $session_data = cache($login_key); if(empty($session_data)) { - return 'session key不存在'; + return ['status'=>-1, 'msg'=>'session key不存在']; } // iv长度 if(strlen($iv) != 24) { - return 'iv长度错误'; + return ['status'=>-1, 'msg'=>'iv长度错误']; } // 加密函数 if(!function_exists('openssl_decrypt')) { - return 'openssl不支持'; + return ['status'=>-1, 'msg'=>'openssl不支持']; } $result = openssl_decrypt(base64_decode($encrypted_data), "AES-128-CBC", base64_decode($session_data['session_key']), 1, base64_decode($iv)); $data = json_decode($result, true); if($data == NULL) { - return '请重试!'; + return ['status'=>-1, 'msg'=>'请重试!']; } if($data['watermark']['appid'] != $this->_appid) { - return 'appid不匹配'; + return ['status'=>-1, 'msg'=>'appid不匹配']; } // 缓存存储 $data_key = 'wechat_user_info_'.$openid; cache($data_key, $data); - return $data; + return ['status'=>0, 'data'=>$data]; } /** - * [GetAuthSessionKey 根据授权code获取 session_key 和 openid] + * 用户授权 * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @datetime 2017-12-30T18:20:53+0800 - * @param [string] $authcode [用户授权码] - * @return [string|boolean] [失败false, 成功返回appid|] + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-11-06 + * @desc description + * @param [array] $params [输入参数] */ - public function GetAuthSessionKey($authcode) + public function GetAuthSessionKey($params = []) { + if(empty($params['authcode'])) + { + return ['status'=>-1, 'msg'=>'授权码有误']; + } + // 请求获取session_key - $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$this->_appid.'&secret='.$this->_appsecret.'&js_code='.$authcode.'&grant_type=authorization_code'; + $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$this->_appid.'&secret='.$this->_appsecret.'&js_code='.$params['authcode'].'&grant_type=authorization_code'; $result = $this->HttpRequestGet($url); if(!empty($result['openid'])) { @@ -113,9 +118,9 @@ class Wechat // 缓存存储 cache($key, $result); - return $result['openid']; + return ['status'=>0, 'msg'=>'授权成功', 'data'=>$result['openid']]; } - return false; + return ['status'=>-1, 'msg'=>$result['errmsg']]; } /** diff --git a/sourcecode/alipay/pages/login/login.js b/sourcecode/alipay/pages/login/login.js index 07672e456..39e6b9fb3 100644 --- a/sourcecode/alipay/pages/login/login.js +++ b/sourcecode/alipay/pages/login/login.js @@ -141,7 +141,6 @@ Page({ e.detail.value['province'] = this.data.user.province; e.detail.value['city'] = this.data.user.city; e.detail.value['gender'] = this.data.user.gender; - e.detail.value['app_type'] = 'alipay'; e.detail.value['referrer'] = (params == null || (params.data || null) == null) ? (this.data.user.referrer || 0) : (params.data.referrer || 0); if(app.fields_check(e.detail.value, validation)) { diff --git a/sourcecode/baidu/app.js b/sourcecode/baidu/app.js index a69f95e5b..7d50aa906 100755 --- a/sourcecode/baidu/app.js +++ b/sourcecode/baidu/app.js @@ -71,7 +71,7 @@ App({ // 请求地址 request_url: "{{request_url}}", request_url: 'http://shopxo.com/', - // request_url: 'https://dev.shopxo.net/', + request_url: 'https://dev.shopxo.net/', // 基础信息 application_title: "{{application_title}}", diff --git a/sourcecode/baidu/pages/login/login.js b/sourcecode/baidu/pages/login/login.js index a48696a08..803bccfb4 100755 --- a/sourcecode/baidu/pages/login/login.js +++ b/sourcecode/baidu/pages/login/login.js @@ -142,7 +142,6 @@ Page({ e.detail.value['province'] = this.data.user.province; e.detail.value['city'] = this.data.user.city; e.detail.value['gender'] = this.data.user.gender; - e.detail.value['app_type'] = 'baidu'; e.detail.value['referrer'] = (params == null) ? this.data.user.referrer || 0 : params.referrer || 0; if (app.fields_check(e.detail.value, validation)) { swan.showLoading({ title: '处理中...' }); @@ -213,7 +212,7 @@ Page({ swan.showLoading({ title: "处理中..." }); var self = this; swan.request({ - url: app.get_request_url('baiduusermobilebind', 'user'), + url: app.get_request_url('onekeyusermobilebind', 'user'), method: 'POST', data: data, dataType: 'json', diff --git a/sourcecode/qq/pages/login/login.js b/sourcecode/qq/pages/login/login.js index f36783ffd..ce8fee4ce 100755 --- a/sourcecode/qq/pages/login/login.js +++ b/sourcecode/qq/pages/login/login.js @@ -140,7 +140,6 @@ Page({ e.detail.value['city'] = this.data.user.city; e.detail.value['gender'] = this.data.user.gender; e.detail.value['qq_unionid'] = this.data.user.qq_unionid || ''; - e.detail.value['app_type'] = 'qq'; e.detail.value['referrer'] = (params == null) ? (this.data.user.referrer || 0) : (params.referrer || 0); if(app.fields_check(e.detail.value, validation)) { diff --git a/sourcecode/toutiao/pages/login/login.js b/sourcecode/toutiao/pages/login/login.js index 967dbc2f1..5c53956f3 100755 --- a/sourcecode/toutiao/pages/login/login.js +++ b/sourcecode/toutiao/pages/login/login.js @@ -171,7 +171,6 @@ Page({ e.detail.value['province'] = this.data.user.province; e.detail.value['city'] = this.data.user.city; e.detail.value['gender'] = this.data.user.gender; - e.detail.value['app_type'] = 'toutiao'; e.detail.value['referrer'] = (params == null) ? (this.data.user.referrer || 0) : (params.referrer || 0); if(app.fields_check(e.detail.value, validation)) { diff --git a/sourcecode/weixin/app.js b/sourcecode/weixin/app.js index 16dc93f54..0036ea296 100755 --- a/sourcecode/weixin/app.js +++ b/sourcecode/weixin/app.js @@ -71,7 +71,7 @@ App({ // 请求地址 request_url: "{{request_url}}", request_url: 'http://shopxo.com/', - // request_url: 'https://dev.shopxo.net/', + request_url: 'https://dev.shopxo.net/', // 基础信息 application_title: "{{application_title}}", diff --git a/sourcecode/weixin/pages/login/login.js b/sourcecode/weixin/pages/login/login.js index 523093204..1e340c58e 100755 --- a/sourcecode/weixin/pages/login/login.js +++ b/sourcecode/weixin/pages/login/login.js @@ -155,7 +155,6 @@ Page({ e.detail.value['city'] = this.data.user.city; e.detail.value['gender'] = this.data.user.gender; e.detail.value['weixin_unionid'] = this.data.user.weixin_unionid || ''; - e.detail.value['app_type'] = 'weixin'; e.detail.value['referrer'] = (params == null) ? (this.data.user.referrer || 0) : (params.referrer || 0); if(app.fields_check(e.detail.value, validation)) { @@ -230,7 +229,7 @@ Page({ wx.showLoading({ title: "处理中..." }); var self = this; wx.request({ - url: app.get_request_url('weixinusermobilebind', 'user'), + url: app.get_request_url('onekeyusermobilebind', 'user'), method: 'POST', data: data, dataType: 'json',