ApiBaseController.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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 today_first_login($user_id){
  22. $date = date('Ymd');
  23. $Key = HelperKey::generateUserActionKey('login',$date,$user_id);
  24. $status = UserActionRedis::get($Key);
  25. if(!$status && !empty($user_id)){
  26. UserActionRedis::set($Key,true);//设置用户状态为已签到
  27. $syncData['user_id'] = $user_id;
  28. $syncData['app_client_id'] = intval(Yii::app()->request->getParam('app_client_id'));
  29. $syncData['device_id'] = Yii::app()->request->getParam('device_id');
  30. $syncData['channel'] = Yii::app()->request->getParam('channel');
  31. $syncData['app_version'] = Yii::app()->request->getParam('app_version');
  32. $syncData['phone_type'] = Yii::app()->request->getParam('phone_type');
  33. $syncData['os_version'] = Yii::app()->request->getParam('os_version');
  34. $syncData['last_visit_time'] = time();
  35. $list = new ARedisList('user_info_update');
  36. $list->push(serialize($syncData));
  37. $add_score = $this->addScore($user_id,'score_first_open');
  38. if($add_score['status']){
  39. return $add_score;
  40. }
  41. }
  42. }
  43. //签名验证方法
  44. //每次GET/POST请求的参数,凡是在这个列表以内的参数名字:["id","app_client_id","time","topic_id","group_id","user_id","post_id"]加上private_key按key字母升序排列拼接,然后md5运算之后生成
  45. protected function api_check_sign(){
  46. return true;
  47. $need_args=array('device_id','os_version','api_version','time','channel','app_client_id','app_version','sign');
  48. $sign_args=array("id","app_client_id","time","topic_id","group_id","user_id","post_id","app_version");
  49. $request=array();
  50. if(is_array($_GET)){
  51. foreach($_GET as $k=>$v){
  52. $request[$k]=$v;
  53. }
  54. }
  55. if(is_array($_POST)){
  56. foreach($_POST as $k=>$v){
  57. $request[$k]=$v;
  58. }
  59. }
  60. $device_id = CommonFn::get_val_if_isset($request,'device_id',"");
  61. $temp_args=array();
  62. $sign='';
  63. if(is_array($request)){
  64. foreach($request as $_key => $_value) {
  65. if($_key!='sign'){
  66. if(in_array($_key,$sign_args)){
  67. $temp_args[$_key]=$_value;
  68. }
  69. }else{
  70. $sign = $_value;
  71. }
  72. }
  73. }
  74. if($sign){
  75. if($request['app_client_id'] == 2){
  76. $temp_args['private_key'] = Yii::app()->params['androidPrivateKey'];
  77. }elseif($request['app_client_id'] == 1){
  78. $temp_args['private_key'] = Yii::app()->params['iosPrivateKey'];
  79. }else{
  80. CommonFn::requestAjax(false,'签名验证失败');
  81. }
  82. if(isset($temp_args)&&!empty($temp_args)){
  83. ksort($temp_args);
  84. }
  85. $arg_str='';
  86. foreach($temp_args as $k=>$v){
  87. if($arg_str==''){
  88. $arg_str .= $k.'='.$v;
  89. }else{
  90. $arg_str .= '&'.$k.'='.$v;
  91. }
  92. }
  93. $new_sign=md5($arg_str);
  94. if($new_sign!=$sign){
  95. CommonFn::requestAjax(false,'签名验证失败');
  96. }
  97. }else{
  98. CommonFn::requestAjax(false,'签名验证失败');
  99. }
  100. return true;
  101. }
  102. public function syncPosition(){
  103. $position_arr = json_decode(Yii::app()->request->getParam('position'),true);
  104. $position[0] = isset($position_arr['lng'])?floatval($position_arr['lng']):0;
  105. $position[1] = isset($position_arr['lat'])?floatval($position_arr['lat']):0;
  106. $user_id = Yii::app()->request->getParam('user_id','');
  107. $city_info = json_decode(Yii::app()->request->getParam('city_info'),true);
  108. if($user_id && ($city_info || $position[0])){
  109. $user_obj = RUser::get(new MongoId($user_id));
  110. if($user_obj && (!isset($user_obj->position[0]) || !$user_obj->position[0])){
  111. $user_obj->city_info = $city_info;
  112. $user_obj->position = $position;
  113. $user_obj->update(array('city_info','position'),true);
  114. }
  115. }
  116. }
  117. }