ApiBaseController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. /**
  3. * api接口公共基类
  4. */
  5. class ApiBaseController extends CController{
  6. //api访问前进行签名验证
  7. /**
  8. * @return bool
  9. */
  10. protected function verify() {
  11. if(!empty(Yii::app()->request->getParam('no_sign'))&&(YII_DEBUG == true)){
  12. return true;
  13. }
  14. if(Yii::app()->request->getParam('app_client_id') == 1){
  15. $this->check_version();
  16. }
  17. $result = $this->api_check_sign();
  18. return $result;
  19. }
  20. //用户行为需要增加爪币,调用此方法
  21. protected function addScore($user_id,$action){
  22. $result = Service::factory('ScoreService')->syncScore($user_id,$action);
  23. if($result){
  24. $score_value = Service::factory('VariableService')->getVariable($action);
  25. return array('status'=>true,'score'=>intval($score_value),'current_score'=>$result);
  26. }else{
  27. return array('status'=>false);
  28. }
  29. }
  30. /**
  31. * 增加用户活跃天数
  32. * @param string $user_id
  33. */
  34. protected function addActive($user_id){
  35. $cache = new ARedisCache();
  36. $key = 'user_active_'.date('Ymd').$user_id;
  37. $status = $cache->get($key);
  38. if($status){
  39. return false;
  40. }else{
  41. $cache->set($key,1,86400);
  42. $list = new ARedisList('user_active_list');
  43. $list->push($user_id);
  44. return true;
  45. }
  46. }
  47. //判断用户是否是当日首次访问应用,可以将一些定期任务放入此方法内调用
  48. protected function today_first_login($user_id){
  49. $date = date('Ymd');
  50. $Key = HelperKey::generateUserActionKey('login',$date,$user_id);
  51. $status = UserActionRedis::get($Key);
  52. if(!$status && !empty($user_id)){
  53. UserActionRedis::set($Key,true);//设置用户状态为已签到
  54. $syncData['user_id'] = $user_id;
  55. $syncData['app_client_id'] = intval(Yii::app()->request->getParam('app_client_id'));
  56. $syncData['device_id'] = Yii::app()->request->getParam('device_id');
  57. $syncData['channel'] = Yii::app()->request->getParam('channel');
  58. $syncData['app_version'] = Yii::app()->request->getParam('app_version');
  59. $syncData['phone_type'] = Yii::app()->request->getParam('phone_type');
  60. $syncData['os_version'] = Yii::app()->request->getParam('os_version');
  61. $syncData['last_visit_time'] = time();
  62. $list = new ARedisList('user_info_update');
  63. $list->push(serialize($syncData));
  64. $add_score = $this->addScore($user_id,'score_first_open');
  65. if($add_score['status']){
  66. return $add_score;
  67. }
  68. }
  69. }
  70. //所有访问者 记录资料信息 通过device_id
  71. protected function log_visitor($request){
  72. $mongo = new MongoClient(DB_CONNETC);
  73. $device_id = CommonFn::get_val_if_isset($request,'device_id',"");
  74. $os_version = CommonFn::get_val_if_isset($request,'os_version',"");
  75. $api_version = CommonFn::get_val_if_isset($request,'api_version',"");
  76. $app_version = CommonFn::get_val_if_isset($request,'app_version',"");
  77. $phone_type = CommonFn::get_val_if_isset($request,'phone_type',"");
  78. $user_id = CommonFn::get_val_if_isset($request,'user_id',"");
  79. $channel = CommonFn::get_val_if_isset($request,'channel',"");
  80. $app_client_id = CommonFn::get_val_if_isset($request,'app_client_id',"");
  81. if(isset($request['city_info']) && $request['city_info']){
  82. $city_info = json_decode($request['city_info'],true);
  83. //防止city_info出现非法数据
  84. if(!isset($city_info['province'])){
  85. $city_info['province'] = '';
  86. $city_info['city'] = '';
  87. $city_info['area'] = '';
  88. }elseif(!isset($city_info['city'])){
  89. $city_info['city'] = '';
  90. $city_info['area'] = '';
  91. }elseif(!isset($city_info['area'])){
  92. $city_info['area'] = '';
  93. }
  94. }
  95. if(isset($request['position']) && $request['position']){
  96. $position_arr = json_decode($request['position'],true);
  97. $position[0] = isset($position_arr['lng'])?floatval($position_arr['lng']):0;
  98. $position[1] = isset($position_arr['lat'])?floatval($position_arr['lat']):0;
  99. }
  100. if($device_id){
  101. $criteria = new EMongoCriteria();
  102. $criteria->device_id('==',$device_id);
  103. $visitor = Visitors::model()->find($criteria);
  104. if($visitor){
  105. $visitor->device_id = $device_id;
  106. $visitor->os_version = $os_version;
  107. $visitor->api_version = $api_version;
  108. $visitor->time = time();
  109. if(!isset($visitor->first_time) || !$visitor->first_time){
  110. $visitor->first_time = time();
  111. }
  112. $visitor->channel = $channel;
  113. $visitor->app_version = $app_version;
  114. $visitor->phone_type = $phone_type;
  115. $visitor->user_id = $user_id;
  116. $visitor->app_client_id = $app_client_id;
  117. if(isset($city_info) && !empty($city_info)){
  118. $visitor->city_info = $city_info;
  119. }
  120. if(isset($position) && !empty($position)){
  121. $visitor->position = $position;
  122. }
  123. $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'));
  124. }else{
  125. $visitor = new Visitors();
  126. $visitor->device_id = $device_id;
  127. $visitor->os_version = $os_version;
  128. $visitor->api_version = $api_version;
  129. $visitor->time = time();
  130. $visitor->first_time = time();
  131. $visitor->channel = $channel;
  132. $visitor->app_version = $app_version;
  133. $visitor->phone_type = $phone_type;
  134. $visitor->user_id = $user_id;
  135. $visitor->app_client_id = $app_client_id;
  136. if(isset($city_info) && !empty($city_info)){
  137. $visitor->city_info = $city_info;
  138. }
  139. if(isset($position) && !empty($position)){
  140. $visitor->position = $position;
  141. }
  142. $visitor->save();
  143. }
  144. }
  145. }
  146. //签名验证方法
  147. //每次GET/POST请求的参数,凡是在这个列表以内的参数名字:["id","app_client_id","time","topic_id","group_id","user_id","post_id"]加上private_key按key字母升序排列拼接,然后md5运算之后生成
  148. protected function api_check_sign(){
  149. //return true;
  150. $need_args=array('device_id','os_version','api_version','time','channel','app_client_id','app_version','sign');
  151. $sign_args=array("id","app_client_id","time","topic_id","group_id","user_id","post_id","app_version");
  152. $request=array();
  153. if(is_array($_GET)){
  154. foreach($_GET as $k=>$v){
  155. $request[$k]=$v;
  156. }
  157. }
  158. if(is_array($_POST)){
  159. foreach($_POST as $k=>$v){
  160. $request[$k]=$v;
  161. }
  162. }
  163. $device_id = CommonFn::get_val_if_isset($request,'device_id',"");
  164. $temp_args=array();
  165. $sign='';
  166. if(is_array($request)){
  167. foreach($request as $_key => $_value) {
  168. if($_key!='sign'){
  169. if(in_array($_key,$sign_args)){
  170. $temp_args[$_key]=$_value;
  171. }
  172. }else{
  173. $sign = $_value;
  174. }
  175. }
  176. }
  177. if($sign){
  178. if($request['app_client_id'] == 2){
  179. $temp_args['private_key'] = Yii::app()->params['androidPrivateKey'];
  180. }elseif($request['app_client_id'] == 1){
  181. $temp_args['private_key'] = Yii::app()->params['iosPrivateKey'];
  182. }else{
  183. CommonFn::requestAjax(false,'签名验证失败');
  184. }
  185. if(isset($temp_args)&&!empty($temp_args)){
  186. ksort($temp_args);
  187. }
  188. $arg_str='';
  189. foreach($temp_args as $k=>$v){
  190. if($arg_str==''){
  191. $arg_str .= $k.'='.$v;
  192. }else{
  193. $arg_str .= '&'.$k.'='.$v;
  194. }
  195. }
  196. $new_sign=md5($arg_str);
  197. if($new_sign!=$sign){
  198. CommonFn::requestAjax(false,'签名验证失败');
  199. }
  200. }else{
  201. CommonFn::requestAjax(false,'签名验证失败');
  202. }
  203. return true;
  204. }
  205. public function syncPosition(){
  206. $position_arr = json_decode(Yii::app()->request->getParam('position'),true);
  207. $position[0] = isset($position_arr['lng'])?floatval($position_arr['lng']):0;
  208. $position[1] = isset($position_arr['lat'])?floatval($position_arr['lat']):0;
  209. $user_id = Yii::app()->request->getParam('user_id','');
  210. $city_info = json_decode(Yii::app()->request->getParam('city_info'),true);
  211. if($user_id && ($city_info || $position[0])){
  212. $user_obj = RUser::get(new MongoId($user_id));
  213. if($user_obj && (!isset($user_obj->position[0]) || !$user_obj->position[0])){
  214. $user_obj->city_info = $city_info;
  215. $user_obj->position = $position;
  216. $user_obj->update(array('city_info','position'),true);
  217. }
  218. }
  219. }
  220. public function check_version(){
  221. $version = Yii::app()->request->getParam('app_version');
  222. $app_client_id = Yii::app()->request->getParam('app_client_id');
  223. if(Yii::app()->request->getParam('no_sign')){
  224. return true;
  225. }
  226. if( empty($version)||empty($app_client_id)){
  227. CommonFn::requestAjax(false,CommonFn::getMessage('message','request_illegal'));
  228. }
  229. if($app_client_id == 2){
  230. $limit_version = Yii::app()->params['android_latest_version'];
  231. $leatest_version = Service::factory('VariableService')->getVariable('android_new_version');
  232. }elseif($app_client_id == 1){
  233. $limit_version = Yii::app()->params['ios_latest_version'];
  234. $leatest_version = Service::factory('VariableService')->getVariable('ios_new_version');
  235. }else{
  236. CommonFn::requestAjax(false,CommonFn::getMessage('message','request_illegal'));
  237. }
  238. if(!CommonFn::compareVersion(Yii::app()->request->getParam('app_version',''),$limit_version)){
  239. if($app_client_id == 2){
  240. $download_url = 'http://7xjqyz.com5.z0.glb.clouddn.com/wozhua_guanwang.apk';
  241. $info = array('new_version'=>$leatest_version,'download'=>$download_url);
  242. }else{
  243. $info = array('new_version'=>$leatest_version);
  244. }
  245. CommonFn::requestAjax(true,CommonFn::getMessage('message', 'have_newer'),$info,203);
  246. }
  247. }
  248. }