提交 1cb11b05 编写于 作者: D devil

小程序一键绑定手机优化

上级 64f0ed86
......@@ -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;
// 百度
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);
}
}
/**
* 微信小程序用户手机绑定
* @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)
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
......@@ -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'];
}
}
......
......@@ -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']];
}
/**
......
......@@ -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))
{
......
......@@ -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}}",
......
......@@ -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',
......
......@@ -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))
{
......
......@@ -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))
{
......
......@@ -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}}",
......
......@@ -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',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册