| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 | <?phpnamespace Passport\Src;use Dever;use Passport\Lib\Base;# 小程序class Applet extends Base{    private $cache = 'applet_sessionKey_';    public function init()    {        $uid = $this->check();        $user = Dever::load('passport/user-one', $uid);        if ($user && $user['birthday']) {            $user['birthday'] = date('Y-m-d', $user['birthday']);        }        return $user;    }    /**     * 用户绑定 生成用户信息     *     * @return mixed     */    public function bind_commit()    {        $create = Dever::input('create', 3);        $data = $this->getLoginInfo();        if ($create == 1) {            # 直接返回用户信息            $info = Dever::db('passport/wechat')->one(array('openid' => $data['openid']));            $data = array('uid' => false);            if ($info) {                //$user = Dever::db('passport/user')->one($uid);                $data = $this->getSign($info['uid'], $info['id']);            }        } elseif ($create == 2) {            # 未授权,会生成临时用户,针对有的项目,不需要授权,但是还要生成用户            $data = $this->create($data, false);        }        return $data;    }    /**     * 一次性登录:通过code或者openid、sessionkey来注册用户,此时已经授权,可以直接拿到unioinid,相当于注册     *     * @return mixed     */    public function login_commit()    {        $data = array();        $data = $this->getLoginInfo();        $data += $this->getWechatData($data['session_key']);        $mobile = Dever::input('mobile');        if ($mobile) {            $data['mobile'] = Dever::load('passport/reg')->checkMobileExists(false);        }        $data['username'] = Dever::input('nickname');        $data['avatar'] = Dever::input('avatarurl');        $data['sex'] = Dever::input('gender');        $data['city'] = Dever::input('city');        $data['province'] = Dever::input('province');        $data['country'] = Dever::input('country');        $user['county'] = Dever::input('county');        $result = $this->create($data);        return $result;    }    /**     * 更新用户信息     *     * @return mixed     */    public function update_commit()    {        $uid = $this->check();        $vid = Dever::input('vid');        $info = Dever::db('passport/user')->one($uid);        if ($info) {            if ($info['temp'] == 1) {                # 针对未授权,生成临时用户的用户进行设置积分                Dever::score($uid, 'bind_wechat', '用户微信授权');            }            $data['temp'] = 2;            $data['username'] = Dever::input('nickname');            $data['avatar'] = Dever::input('avatar');            $data['sex'] = Dever::input('gender');            $data['city'] = Dever::input('city');            $data['province'] = Dever::input('province');            $data['country'] = Dever::input('country');            if ($data['sex'] == 1) {                $data['sex'] = 1;            } elseif ($data['sex'] == 2) {                $data['sex'] = 2;            } else {                $data['sex'] = 3;            }            $this->updateUser($uid, $data);        } else {            Dever::alert('无效的用户id,请重新登录');        }        $result = $this->getSign($uid, $vid);        return $result;    }    /**     * 更新用户信息 手机号     *     * @return mixed     */    public function mobile()    {        $uid = $this->check();        $vid = Dever::input('vid');        if (!$vid) {            $mobile = Dever::input('mobile');            if (!$mobile) {                Dever::alert('无效的用户id,请重新登录');            }        }        $code = Dever::input('code');        if ($code) {            Dever::load('passport/applet.login_commit');        }        $result = array();        $mobile = $phoneNumber = '';        $iv = Dever::input('iv');        $encryptedData = Dever::input('encryptedData');                if ($iv && $encryptedData) {            $key = $this->cache . $vid;            $session_key = Dever::cache($key);            if (!$session_key) {                $vinfo = Dever::db('passport/wechat')->one($vid);                $session_key = $vinfo['session_key'];            }                        $data = $this->getWechatData($session_key);            if ($data && $data['mobile']) {                $mobile = $data['mobile'];                $phoneNumber = $data['phone'];            }        }        if ($mobile && $uid) {            $uid = $this->combine($uid, $mobile, 'mobile');            $info = Dever::load('passport/user-one', $uid);            $result['mobile'] = $mobile;            if ($info) {                if (!$info['mobile']) {                    Dever::score($uid, 'bind_mobile', '绑定手机号');                }                $avatar = Dever::input('avatar');                if ($avatar) {                    $update['avatar'] = $avatar;                }                $update['mobile'] = $mobile;                $update['bind'] = 1;                $update['where_id'] = $uid;                $name = '商城会员' . substr($mobile, -5);                if (!$info['username'] || strstr($info['username'], 'G')) {                    $update['username'] = $name;                }                Dever::db('passport/user')->update($update);                $state = Dever::config('base', 'project')->regSendSms;                if ($state) {                    Dever::setInput('skin', $state);                    $this->send($mobile, $uid);                }            } else {                Dever::alert('无效的用户id,请重新登录');            }        }        $result = $this->getSign($uid, $vid, $mobile);        $user = Dever::load('passport/user-one', array('id' => $uid, 'clear' => true));        $result['user'] = $user;        return $result;    }    /**     * 生成用户,返回uid     *     * @return int     */    public function create($data, $state = true)    {        $uid = 0;        $data['system'] = Dever::input('system', 1);        $system_source = Dever::input('system_source', 5);        $info = Dever::db('passport/wechat')->one(array('openid' => $data['openid']));        $wechat = array();        if (!$info) {            if (isset($data['unionid']) && $data['unionid']) {                $info = Dever::db('passport/wechat')->one(array('unionid' => $data['unionid']));                if (!$info) {                    $uid = 0;                } else {                    # 判断用户是否存在,是否需要合并                    //$uid = $this->combine($info['uid'], $data['unionid']);                    $uid = $info['uid'];                }                $wechat['unionid'] = $data['unionid'];            }            if (!$uid) {                $uid = $this->reg('applet', $system_source, $data);                if ($state) {                    Dever::score($uid, 'bind_wechat', '用户微信授权');                }            }                         $wechat['openid'] = $data['openid'];            $wechat['session_key'] = $data['session_key'];            $wechat['uid'] = $uid;            # 微信小程序            $wechat['type'] = 1;//即将废弃,统一            $wechat['system_source'] = $system_source;            $wechat['system_id'] = $data['system'];            $id = Dever::db('passport/wechat')->insert($wechat);            $key = $this->cache . $id;            $cache = Dever::cache($key, $data['session_key']);        } else {            $uid = $info['uid'];            $id = $info['id'];            /*            if (isset($data['unionid']) && $data['unionid']) {                # 判断用户是否存在,是否需要合并                $wechat['uid'] = $this->combine($uid, $data['unionid']);                if ($wechat['uid'] != $uid) {                    $uid = $wechat['uid'];                }            }            */            $key = $this->cache . $id;            $cache = Dever::cache($key, $data['session_key']);            $wechat['session_key'] = $data['session_key'];            if ($wechat) {                $wechat['where_id'] = $id;                Dever::db('passport/wechat')->update($wechat);            }        }        $user = Dever::db('passport/user')->one($uid);        $result = $this->getSign($uid, $id);              if (isset($user['mobile']) && $user['mobile']) {            $result['mobile'] = $user['mobile'];        }        $result['user'] = $user;        return $result;    }    private function unionid($session_key)    {        $data = $this->decryptData($session_key);        if ($data && isset($data->unionId)) {            return $data->unionId;        }                return false;    }    private function getWechatData($session_key)    {        $result = array();        $data = $this->decryptData($session_key);        $result['openid'] = '';        $result['unionid'] = '';        $result['mobile'] = '';        $result['phone'] = '';        if ($data && isset($data->openId)) {            $result['openid'] = $data->openId;            if (isset($data->unionId)) {                $result['unionid'] = $data->unionId;            }        }        if ($data && isset($data->phoneNumber)) {            if (isset($data->phoneNumber)) {                $result['phone'] = $data->phoneNumber;            }        }        if ($data && isset($data->purePhoneNumber)) {              if (isset($data->purePhoneNumber)) {                $result['mobile'] = $data->purePhoneNumber;            }        }                return $result;    }    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;        }        /*        $applet = Dever::config('base', 'project')->applet;        $appid = $applet['appid'];        if($dataObj->watermark->appid != $appid) {            return false;        }*/        return $dataObj;    }    private function getApplet()    {        $applet = Dever::config('base', 'project')->applet;        $project = false;        $system = Dever::input('system', 1);        if (Dever::project('token')) {            $project = Dever::db('token/project')->find($system);        }        if (!$project) {            if (isset($applet['project']) && $applet['project']) {                $project = Dever::db($applet['project'])->find($system);            }        }        if ($project) {            $applet['appid'] = $project['appid'];            $applet['secret'] = $project['secret'];        }        if (!$applet || !$applet['appid'] || !$applet['secret']) {            Dever::alert('错误的appid');        }        return $applet;    }    public function getLoginInfo()    {        $session_key = Dever::input('session_key');        if ($session_key) {            return array('session_key' => $session_key, 'openid' => $openid);        }        $applet = $this->getApplet();        $appid = $applet['appid'];        $secret = $applet['secret'];        $url = $applet['url'];        $code = Dever::input('code');        if (!$applet || !$applet['appid'] || !$applet['secret']) {            Dever::alert('错误的appid');        }        $url .= '?appid=' . $appid;        $url .= '&secret=' . $secret;        $url .= '&js_code=' . $code;        $url .= '&grant_type=authorization_code';        $data = Dever::curl($url);        Dever::log($data, 'passport_applet');        //YzJkOThpRFhwZ1lQTF9mZl9hLVZjZnFXemJVenlYcDQ3d3JWekk0b1I4NjBBQ0Naejg4a0VQa0U=        //$data = '{"session_key":"aNAXk7nG\/DRYI\/G0KzJRsw==","openid":"oIZ895RZs2ZkywasoZIv6WavPZlQ"}';        if (strstr($data, 'errcode')) {            Dever::alert($data);        }        $data = Dever::json_decode($data);        return $data;    }}
 |