123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- <?php
- /**
- * api接口公共基类
- */
- class ApiBaseController extends CController{
- //api访问前进行签名验证
- /**
- * @return bool
- */
- protected function verify() {
- if(!empty(Yii::app()->request->getParam('no_sign'))&&(YII_DEBUG == true)){
- return true;
- }
- if(Yii::app()->request->getParam('app_client_id') == 1){
- $this->check_version();
- }
- $result = $this->api_check_sign();
- return $result;
- }
- //用户行为需要增加爪币,调用此方法
- protected function addScore($user_id,$action){
- $result = Service::factory('ScoreService')->syncScore($user_id,$action);
- if($result){
- $score_value = Service::factory('VariableService')->getVariable($action);
- return array('status'=>true,'score'=>intval($score_value),'current_score'=>$result);
- }else{
- return array('status'=>false);
- }
- }
- /**
- * 增加用户活跃天数
- * @param string $user_id
- */
- protected function addActive($user_id){
- $cache = new ARedisCache();
- $key = 'user_active_'.date('Ymd').$user_id;
- $status = $cache->get($key);
- if($status){
- return false;
- }else{
- $cache->set($key,1,86400);
- $list = new ARedisList('user_active_list');
- $list->push($user_id);
- return true;
- }
- }
-
- //判断用户是否是当日首次访问应用,可以将一些定期任务放入此方法内调用
- protected function today_first_login($user_id){
- $date = date('Ymd');
- $Key = HelperKey::generateUserActionKey('login',$date,$user_id);
- $status = UserActionRedis::get($Key);
- if(!$status && !empty($user_id)){
- UserActionRedis::set($Key,true);//设置用户状态为已签到
- $syncData['user_id'] = $user_id;
- $syncData['app_client_id'] = intval(Yii::app()->request->getParam('app_client_id'));
- $syncData['device_id'] = Yii::app()->request->getParam('device_id');
- $syncData['channel'] = Yii::app()->request->getParam('channel');
- $syncData['app_version'] = Yii::app()->request->getParam('app_version');
- $syncData['phone_type'] = Yii::app()->request->getParam('phone_type');
- $syncData['os_version'] = Yii::app()->request->getParam('os_version');
- $syncData['last_visit_time'] = time();
- $list = new ARedisList('user_info_update');
- $list->push(serialize($syncData));
- $add_score = $this->addScore($user_id,'score_first_open');
- if($add_score['status']){
- return $add_score;
- }
- }
- }
- //所有访问者 记录资料信息 通过device_id
- protected function log_visitor($request){
- $mongo = new MongoClient(DB_CONNETC);
- $device_id = CommonFn::get_val_if_isset($request,'device_id',"");
- $os_version = CommonFn::get_val_if_isset($request,'os_version',"");
- $api_version = CommonFn::get_val_if_isset($request,'api_version',"");
- $app_version = CommonFn::get_val_if_isset($request,'app_version',"");
- $phone_type = CommonFn::get_val_if_isset($request,'phone_type',"");
- $user_id = CommonFn::get_val_if_isset($request,'user_id',"");
- $channel = CommonFn::get_val_if_isset($request,'channel',"");
- $app_client_id = CommonFn::get_val_if_isset($request,'app_client_id',"");
- if(isset($request['city_info']) && $request['city_info']){
- $city_info = json_decode($request['city_info'],true);
- //防止city_info出现非法数据
- if(!isset($city_info['province'])){
- $city_info['province'] = '';
- $city_info['city'] = '';
- $city_info['area'] = '';
- }elseif(!isset($city_info['city'])){
- $city_info['city'] = '';
- $city_info['area'] = '';
- }elseif(!isset($city_info['area'])){
- $city_info['area'] = '';
- }
- }
- if(isset($request['position']) && $request['position']){
- $position_arr = json_decode($request['position'],true);
- $position[0] = isset($position_arr['lng'])?floatval($position_arr['lng']):0;
- $position[1] = isset($position_arr['lat'])?floatval($position_arr['lat']):0;
- }
- if($device_id){
- $criteria = new EMongoCriteria();
- $criteria->device_id('==',$device_id);
- $visitor = Visitors::model()->find($criteria);
- if($visitor){
- $visitor->device_id = $device_id;
- $visitor->os_version = $os_version;
- $visitor->api_version = $api_version;
- $visitor->time = time();
- if(!isset($visitor->first_time) || !$visitor->first_time){
- $visitor->first_time = time();
- }
- $visitor->channel = $channel;
- $visitor->app_version = $app_version;
- $visitor->phone_type = $phone_type;
- $visitor->user_id = $user_id;
- $visitor->app_client_id = $app_client_id;
- if(isset($city_info) && !empty($city_info)){
- $visitor->city_info = $city_info;
- }
- if(isset($position) && !empty($position)){
- $visitor->position = $position;
- }
- $visitor->update(array('device_id','os_version','api_version','first_time','time','channel','app_version','phone_type','user_id','app_client_id','city_info','position'));
- }else{
- $visitor = new Visitors();
- $visitor->device_id = $device_id;
- $visitor->os_version = $os_version;
- $visitor->api_version = $api_version;
- $visitor->time = time();
- $visitor->first_time = time();
- $visitor->channel = $channel;
- $visitor->app_version = $app_version;
- $visitor->phone_type = $phone_type;
- $visitor->user_id = $user_id;
- $visitor->app_client_id = $app_client_id;
- if(isset($city_info) && !empty($city_info)){
- $visitor->city_info = $city_info;
- }
- if(isset($position) && !empty($position)){
- $visitor->position = $position;
- }
- $visitor->save();
- }
- }
- }
- //签名验证方法
- //每次GET/POST请求的参数,凡是在这个列表以内的参数名字:["id","app_client_id","time","topic_id","group_id","user_id","post_id"]加上private_key按key字母升序排列拼接,然后md5运算之后生成
- protected function api_check_sign(){
- //return true;
- $need_args=array('device_id','os_version','api_version','time','channel','app_client_id','app_version','sign');
- $sign_args=array("id","app_client_id","time","topic_id","group_id","user_id","post_id","app_version");
- $request=array();
- if(is_array($_GET)){
- foreach($_GET as $k=>$v){
- $request[$k]=$v;
- }
- }
- if(is_array($_POST)){
- foreach($_POST as $k=>$v){
- $request[$k]=$v;
- }
- }
- $device_id = CommonFn::get_val_if_isset($request,'device_id',"");
- $temp_args=array();
- $sign='';
- if(is_array($request)){
- foreach($request as $_key => $_value) {
- if($_key!='sign'){
- if(in_array($_key,$sign_args)){
- $temp_args[$_key]=$_value;
- }
- }else{
- $sign = $_value;
- }
- }
- }
- if($sign){
- if($request['app_client_id'] == 2){
- $temp_args['private_key'] = Yii::app()->params['androidPrivateKey'];
- }elseif($request['app_client_id'] == 1){
- $temp_args['private_key'] = Yii::app()->params['iosPrivateKey'];
- }else{
- CommonFn::requestAjax(false,'签名验证失败');
- }
- if(isset($temp_args)&&!empty($temp_args)){
- ksort($temp_args);
- }
- $arg_str='';
- foreach($temp_args as $k=>$v){
- if($arg_str==''){
- $arg_str .= $k.'='.$v;
- }else{
- $arg_str .= '&'.$k.'='.$v;
- }
- }
- $new_sign=md5($arg_str);
- if($new_sign!=$sign){
- CommonFn::requestAjax(false,'签名验证失败');
- }
- }else{
- CommonFn::requestAjax(false,'签名验证失败');
- }
- return true;
- }
- public function syncPosition(){
- $position_arr = json_decode(Yii::app()->request->getParam('position'),true);
- $position[0] = isset($position_arr['lng'])?floatval($position_arr['lng']):0;
- $position[1] = isset($position_arr['lat'])?floatval($position_arr['lat']):0;
- $user_id = Yii::app()->request->getParam('user_id','');
- $city_info = json_decode(Yii::app()->request->getParam('city_info'),true);
- if($user_id && ($city_info || $position[0])){
- $user_obj = RUser::get(new MongoId($user_id));
- if($user_obj && (!isset($user_obj->position[0]) || !$user_obj->position[0])){
- $user_obj->city_info = $city_info;
- $user_obj->position = $position;
- $user_obj->update(array('city_info','position'),true);
- }
- }
- }
- public function check_version(){
- $version = Yii::app()->request->getParam('app_version');
- $app_client_id = Yii::app()->request->getParam('app_client_id');
- if(Yii::app()->request->getParam('no_sign')){
- return true;
- }
- if( empty($version)||empty($app_client_id)){
- CommonFn::requestAjax(false,CommonFn::getMessage('message','request_illegal'));
- }
- if($app_client_id == 2){
- $limit_version = Yii::app()->params['android_latest_version'];
- $leatest_version = Service::factory('VariableService')->getVariable('android_new_version');
- }elseif($app_client_id == 1){
- $limit_version = Yii::app()->params['ios_latest_version'];
- $leatest_version = Service::factory('VariableService')->getVariable('ios_new_version');
- }else{
- CommonFn::requestAjax(false,CommonFn::getMessage('message','request_illegal'));
- }
- if(!CommonFn::compareVersion(Yii::app()->request->getParam('app_version',''),$limit_version)){
- if($app_client_id == 2){
- $download_url = 'http://7xjqyz.com5.z0.glb.clouddn.com/wozhua_guanwang.apk';
- $info = array('new_version'=>$leatest_version,'download'=>$download_url);
- }else{
- $info = array('new_version'=>$leatest_version);
- }
- CommonFn::requestAjax(true,CommonFn::getMessage('message', 'have_newer'),$info,203);
- }
- }
- }
|