response->format = \yii\web\Response::FORMAT_JSON; return [ 'message' => 'API test Ok!', 'code' => 100, ]; // return $this->render('index'); } /** * login check * * @return mixed */ public function actionMqinsert() { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $params=Yii::$app->request->get();//获取参数 $rabbitdata=$this->validate($params); if($rabbitdata){ PhpClient::CallMq($rabbitdata); return [ 'message' => 'rabbit insert Ok!', 'action' => 'insert', 'rabbitdata' => $params, 'code' => 100, ]; } } /** * Displays homepage. * * @return mixed */ public function actionPage() { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $params=Yii::$app->request->get();//获取参数 $rabbitdata=$this->validate($params); if($rabbitdata){ PhpClient::CallMq($rabbitdata); return [ 'message' => 'rabbit insert Ok!', 'action' => 'insert', 'rabbitdata' => $params, 'code' => 100, ]; } } /** * Displays homepage. * * @return mixed * * * 登入接口修改后的分为两个步骤: 1.接收数据api,存到mq里返回ok 异步:队列开始运行调取登入接口, 如果json返回队列信息那么跟新消息信息,期间令牌保存处理状态 如果登入成功改令牌状态修改为处理完毕 2.根据令牌查找这个队列的信息 * * 策略一,2个接口判断 * 策略二,一个接口判断2个redis 是否还在队列中 * */ public function actionLogin() { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $params=Yii::$app->request->get();//获取参数 //不做加密校验 unset($params['r']); //begin checklogin ------------- //判断是否已经登入 //do something 2018-01-24 //end checklogin ------------- $isLogin=false;//假设没有登入 if(!$isLogin){ //begin login ------------- //redis 初始化 登入一次设置一次 所以该状态不作为登入的状态信息 $redis = \Yii::$app->redis; $key = 'get-one-login-user-id-by-phone-' . $params['mobile']; // $redis->set($key,'');//暂时不需要 //退出登入是做该操作就可以 //可以多次请求接口 保持更新 // die; //取出reidis的值 $loginAnswer=json_decode($redis->get($key));//取出 redis的值 //如果 有数据 则判断是否被 队列处理 获取了 登入结果信息 //开始判断 if(empty($loginAnswer)){//如果是空说明第一次 //判断该接口第一次请求登入该用户,并且队里中没有该用户登入的处理队里消息 //传入mq中同步 //如果没有请求则 插入请求状态 标识 请求处理中 $loginAnswer=[ 'message' => 'handing', 'code' => 102,//表示队里还没有处理到 需要再次请求以获取处理结果 'status' =>200, 'rabbit'=>'handing' ]; //插入redis 标识 改请求已经 在处理中了 $redis->set($key,json_encode($loginAnswer)); $insertMq=RabbitBase::CallMq(json_encode($params)) ;//插入队列 if($insertMq){ //取出reidis的值 //因为队列消息处理处理速度可能和 上下文时间同时发生所以在此校验 一下该信息是否已经被队列处理完成避免多次网络请求 $loginAnswer=json_decode($redis->get($key)); //获取到储存在redis里面消费队列请求的结果并且返回给前段,如果消息队列里面没有放入到redis里面则判断为没有操作登入返回登入失败处理 } }else{ //用户显示一次刷新一次 如果是单个用户第二次请求不同的token // var_dump($loginAnswer);die; if($loginAnswer->code!=102){ $loginAnswer=json_decode($redis->get($key)); $redis->set($key,''); //可以多次请求接口 保持更新 } } //不是第一次 直接返回redis内容 因为 队列消费已经处理保存进去了 //end login ------------- }else{ $loginAnswer=[ 'message' => 'have logined', 'code' => 101, 'status' => 200,//表示队里还没有处理到 需要再次请求以获取处理结果 'rabbit'=>'you have logined' ]; } return $loginAnswer; } /** * Displays homepage. * * @return mixed */ private function validate($params) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; if(isset($params["signature"]) && isset($params["timestamp"]) && isset($params["rabbitdata"])){ $signature = $params["signature"];//本地签名 $timestamp = $params["timestamp"];//时间戳 $rabbitdata = $params["rabbitdata"];//rabbitdata 存入mq中的数据 unset($params['r'],$params['signature'],$params['rabbitdata']); //valid signature , option if($this->checkSignature($params,$timestamp,$signature)){ return $rabbitdata;//返回rabbitdata }else if(!$this->checkRabbitdata($rabbitdata)){ return false; }else{ exit(json_encode([ 'message' => 'signature test fail!', 'code' => 201, ])); } }else{ exit(json_encode([ 'message' => 'params key canot be null!', 'code' => 203, ])); } } private static function getSign($params, $appkey, $appSecret, $time) { $sign = ''; if (!empty($params)) { ksort($params); $string = http_build_query($params); $result = md5($appkey . $string . $appSecret . $time); $sign = strtoupper($result); } return $sign; } private function checkSignature($params,$timestamp,$signature) { defined('APP_ID') or define("APP_ID", "disanbo"); defined('APP_SECRET') or define("APP_SECRET", "di~sanbo1"); $appkey = APP_ID; $appSecret = APP_SECRET; $sign= $this->getSign($params, $appkey, $appSecret, $timestamp); // var_dump($sign);die; if( $sign == $signature ){ //do something return true; }else{ return false; } } /* rabbitdata * * * */ private function checkRabbitdata($rabbitdata) { //其他验证 dosomething if(!empty($rabbitdata)){ return true; }else{ exit(json_encode([ 'message' => 'rabbitdata cannot be null!', 'code' => 202, ])); } } }