dever 7 年之前
父节点
当前提交
b94f0ff745
共有 5 个文件被更改,包括 402 次插入19 次删除
  1. 11 0
      config/base.php
  2. 108 0
      database/wechat.php
  3. 256 0
      src/Applet.php
  4. 25 0
      src/Lib/Base.php
  5. 2 19
      src/User.php

+ 11 - 0
config/base.php

@@ -3,6 +3,15 @@
 # 一些基本配置
 $config['base'] = array
 (
+	# 小程序appid 后续直接使用applet组件
+	'applet' => array
+	(
+		'appid' => '',
+		'secret' => '',
+		'url' => 'https://api.weixin.qq.com/sns/jscode2session',
+	),
+	# 第三方登录的直接用oauth组件即可
+
 	# 站点使用邮箱还是手机作为主账号,如果是手机,请填写手机验证码的配置接口
 	'account' => 'email',
 	# 性别转换 passport里1为男、2为女 3为未知,如果前端定义与这个不同,请做好转换
@@ -13,6 +22,8 @@ $config['base'] = array
 		2 => 2,
 		3 => 3,
 	),
+
+	# 后续直接使用sms组件,暂时先放这里吧
 	'mobileCode' => array
 	(
 		# debug模式

+ 108 - 0
database/wechat.php

@@ -0,0 +1,108 @@
+<?php
+
+return array
+(
+	# 表名
+	'name' => 'wechat',
+	# 显示给用户看的名称
+	'lang' => '微信绑定列表',
+	'order' => 10,
+	'menu' => false,
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			//'search'	=> 'order',
+			'order'		=> 'desc',
+			'list'		=> true,
+		),
+
+		'uid'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '用户',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			//'update'	=> 'select',
+			'search'	=> 'fulltext',
+			'list'		=> '{uid} > 0 ? Dever::load("passport/user-one#username", {uid}) : "未知用户"',
+			//'list'		=> true,
+			//'edit'		=> true,
+		),
+
+		'openid'		=> array
+		(
+			'type' 		=> 'varchar-50',
+			'name' 		=> 'openid-微信的唯一用户id',
+			'default' 	=> '',
+			'desc' 		=> 'openid',
+			'match' 	=> 'is_string',
+			//'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'unionid'		=> array
+		(
+			'type' 		=> 'varchar-50',
+			'name' 		=> 'unionid-微信的唯一用户id',
+			'default' 	=> '',
+			'desc' 		=> 'unionid',
+			'match' 	=> 'is_string',
+			//'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'session_key'		=> array
+		(
+			'type' 		=> 'varchar-50',
+			'name' 		=> 'session_key',
+			'default' 	=> '',
+			'desc' 		=> 'session_key',
+			'match' 	=> 'is_string',
+			//'update'	=> 'text',
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'search'	=> 'date',
+			'insert'	=> true,
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+	
+	'manage' => array
+	(
+		'insert' => false,
+		'edit' => false,
+		'delete' => false,
+	),
+	
+	# request 请求接口定义
+	'request' => array
+	(
+		
+	),
+);

+ 256 - 0
src/Applet.php

@@ -0,0 +1,256 @@
+<?php
+namespace Passport\Src;
+
+use Dever;
+use Passport\Src\Lib\Base;
+
+# 小程序
+
+class Applet extends Base
+{
+    /**
+     * 用户绑定 生成用户信息
+     *
+     * @return mixed
+     */
+    public function bind()
+    {
+        $applet = Dever::config('base')->applet;
+        $appid = $applet['appid'];
+        $secret = $applet['secret'];
+        $url = $applet['url'];
+        $code = Dever::input('code');
+
+        $url .= '?appid=' . $appid;
+        $url .= '&secret=' . $secret;
+        $url .= '&js_code=' . $code;
+        $url .= '&grant_type=authorization_code';
+
+        $data = Dever::curl($url);
+        if (strstr($data, 'errcode')) {
+            Dever::alert($data);
+        }
+
+        //$data = '{"session_key":"aNAXk7nG\/DRYI\/G0KzJRsw==","openid":"oIZ895RZs2ZkywasoZIv6WavPZlQ"}';
+        $data = Dever::decode($data);
+
+        $user = $this->create($data);
+
+        return $user;
+    }
+
+    /**
+     * 生成用户,返回uid
+     *
+     * @return int
+     */
+    private function create($data)
+    {
+        $uid = false;
+        $info = Dever::load('passport/wechat-one', array('option_openid' => $data['openid']));
+
+        if (!$info) {
+            if (isset($data['unionid']) && $data['unionid']) {
+                $info = Dever::load('passport/wechat-one', array('unionid' => $data['unionid']));
+                if (!$info) {
+                    $uid = false;
+                } else {
+                    $uid = $info['uid'];
+                }
+                $wechat['unionid'] = $data['unionid'];
+            }
+            if (!$uid) {
+                $user['username'] = '临时用户';
+                $uid = Dever::load('passport/user-insert', $user);
+            }
+             
+            $wechat['openid'] = $data['openid'];
+            $wechat['session_key'] = $data['session_key'];
+            $wechat['uid'] = $uid;
+            $id = Dever::load('passport/wechat-insert', $wechat);
+        } else {
+            $uid = $info['uid'];
+            if (isset($data['unionid']) && $data['unionid']) {
+                $wechat['unionid'] = $data['unionid'];
+            }
+            
+            $wechat['session_key'] = $data['session_key'];
+            $wechat['where_id'] = $info['id'];
+            $id = $info['id'];
+            Dever::load('passport/wechat-update', $wechat);
+        }
+
+        $user = Dever::load('passport/user-one', $uid);
+
+        $result['vid'] = $id;
+        $result['uid'] = $uid;
+        $result['signature'] = Dever::login($uid);
+
+        return $result;
+    }
+
+    /**
+     * 检测用户有效性
+     *
+     * @return mixed
+     */
+    private function check()
+    {
+    	$signature = Dever::input('signature');
+    	$user = Dever::loginResult($signature);
+    	if (!isset($user['uid'])) {
+    		Dever::alert('user error');
+    	}
+    	return $user['uid'];
+    }
+
+    /**
+     * 更新用户信息 手机号
+     *
+     * @return mixed
+     */
+    public function mobile()
+    {
+        $uid = $this->check();
+        $vid = Dever::input('vid');
+        $result = array();
+        $mobile = $phoneNumber = '';
+        if ($iv && $encryptedData) {
+            $vinfo = Dever::load('passport/wechat-one', $vid);
+            $data = $this->decryptData($vinfo['session_key']);
+            if ($data && isset($data->purePhoneNumber) && isset($data->phoneNumber)) {
+                $mobile = $data->purePhoneNumber;
+                $phoneNumber = $data->phoneNumber;
+            }
+        }
+
+        if ($mobile && $phoneNumber && $uid) {
+            $info = Dever::load('passport/user-one', $uid);
+            $result['mobile'] = $mobile;
+            if ($info) {
+                $update['set_mobile'] = $mobile;
+                $update['where_id'] = $uid;
+                Dever::load('passport/user-update', $update);
+            } else {
+                Dever::alert('无效的用户id,请重新登录');
+            }
+        }
+
+        $result['vid'] = $vid;
+        $result['uid'] = $uid;
+        $result['signature'] = Dever::login($uid);
+
+        return $result;
+    }
+
+    /**
+     * 更新用户信息
+     *
+     * @return mixed
+     */
+    public function update()
+    {
+        $uid = $this->check();
+        $name = Dever::emoji(Dever::input('nickname'));
+        $pic = Dever::input('avatarurl');
+        $sex = Dever::input('gender');
+        $city = Dever::input('city');
+        $mobile = Dever::input('mobile');
+        $province = Dever::input('province');
+        $country = Dever::input('country');
+        $vid = Dever::input('vid');
+
+        $update['set_temp'] = 3;
+        if ($vid) {
+            $vinfo = Dever::load('passport/wechat-one', $vid);
+
+            $unionid = $this->unionid($vinfo['session_key'], $iv);
+            if ($unionid) {
+                $vinfo = Dever::load('passport/wechat-one', array('option_unionid' => $unionid));
+                if (!$vinfo) {
+                    $wechat['set_unionid'] = $unionid;
+                    $wechat['where_id'] = $vid;
+                    Dever::load('passport/wechat-update', $wechat);
+                } elseif ($vinfo && $vinfo['id'] != $vid) {
+                    $wechat['set_unionid'] = $unionid;
+                    $wechat['set_uid'] = $vinfo['uid'];
+                    $wechat['where_id'] = $vid;
+
+                    # 删除user信息
+                    if ($uid != $vinfo['uid']) {
+                        Dever::load('passport/user-update', array('set_state' => 2, 'where_id' => $uid));
+                    }
+                    
+                    $uid = $vinfo['uid'];
+                    Dever::load('passport/wechat-update', $wechat);
+                }
+                
+                $update['set_temp'] = 2;
+            }
+        }
+
+        $info = Dever::load('passport/user-one', $uid);
+        if ($info) {
+            $update['set_username'] = $name;
+            $update['set_sex'] = $this->saveSex($sex);
+            $update['set_avatar'] = $this->saveAvatar($pic);
+            //$update['set_city'] = $city;
+            //$update['set_mobile'] = $mobile;
+            //$update['set_province'] = $province;
+            //$update['set_country'] = $country;
+            //$update['where_id'] = $uid;
+            Dever::load('passport/user-update', $update);
+        } else {
+            Dever::alert('无效的用户id,请重新登录');
+        }
+
+        $result['vid'] = $vid;
+        $result['uid'] = $uid;
+        $result['signature'] = Dever::login($uid);
+
+        return $result;
+    }
+
+    private function unionid($session_key)
+    {
+        $data = $this->decryptData($session_key);
+        if ($data && isset($data->unionId)) {
+            return $data->unionId;
+        }
+        
+        return false;
+    }
+
+    private function decryptData($session_key)
+    {
+    	$iv = Dever::input('iv');
+        $encryptedData = Dever::input('encryptedData');
+
+        if (!$iv || !$encryptedData) {
+        	return false;
+        }
+        if (strlen($session_key) != 24) {
+            return false;
+        }
+        if (strlen($iv) != 24) {
+            return false;
+        }
+
+        $aesKey = base64_decode($session_key);
+
+        $aesIV = base64_decode($iv);
+
+        $aesCipher = base64_decode($encryptedData);
+
+        $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
+
+        $dataObj = json_decode($result);
+        if ($dataObj  == NULL) {
+            return false;
+        }
+        if($dataObj->watermark->appid != $appid) {
+            return false;
+        }
+        return $dataObj;
+    }
+}

+ 25 - 0
src/Lib/Base.php

@@ -202,8 +202,33 @@ class Base
         return 'refer=' . Encrypt::encode(Dever::url(false, 'main'));
     }
 
+    protected function saveSex($sex)
+    {
+        if (!$sex) {
+            return '';
+        }
+        if ($sex || $sex == 0) {
+            $config_sex = Dever::config('base', 'project')->sex;
+            if (isset($config_sex[$sex])) {
+                $sex = $config_sex[$sex];
+            } else {
+                if ($sex == '男') {
+                    $sex = 1;
+                } elseif ($sex == '女') {
+                    $sex = 2;
+                } elseif ($sex == '未知') {
+                    $sex = 3;
+                }
+            }
+        }
+        return $sex;
+    }
+
     protected function saveAvatar($value)
     {
+        if (!$value) {
+            return '';
+        }
         $value = Dever::pic($value);
         $base = Dever::data();
         $date = explode('-', date("Y-m-d"));

+ 2 - 19
src/User.php

@@ -47,25 +47,8 @@ class User extends Base
         $update['set_avatar'] = Dever::input('avatar') ? Dever::input('avatar') . '?v=' . time() : false;
         $update['where_id'] = $this->user['id'];
         $sex = Dever::input('sex', 0);
-
-        if ($sex || $sex == 0) {
-            $config_sex = Dever::config('base', 'project')->sex;
-            if (isset($config_sex[$sex])) {
-                $update['set_sex'] = $config_sex[$sex];
-            } else {
-                if ($sex == '男') {
-                    $update['set_sex'] = 1;
-                } elseif ($sex == '女') {
-                    $update['set_sex'] = 2;
-                } elseif ($sex == '未知') {
-                    $update['set_sex'] = 3;
-                }
-            }
-        }
-
-        if ($update['set_avatar']) {
-            $update['set_avatar'] = $this->saveAvatar($update['set_avatar']);
-        }
+        $update['set_sex'] = $this->saveSex($sex);
+        $update['set_avatar'] = $this->saveAvatar($update['set_avatar']);
 
         Dever::load('passport/user-update', $update);