public static function getToken($force = false) { try { $STO = new SingleTableOperation(); $STO->setTableName("ctoken"); if ($force == false) { $ret = $STO->getObject(); interface_log(DEBUG, 0, "token data get from ctoken: " . json_encode($ret)); if (count($ret) == 1) { $token = $ret[0]['token']; $expire = $ret[0]['expire']; $addTimestamp = $ret[0]['addTimestamp']; $current = time(); if ($addTimestamp + $expire + 30 < $current) { return $token; } } } $para = array("grant_type" => "client_credential", "appid" => WX_API_APPID, "secret" => WX_API_APPSECRET); $url = WX_API_URL . "token"; interface_log(DEBUG, 0, "url:" . $url . " req data:" . json_encode($para)); $ret = doCurlGetRequest($url, $para); interface_log(DEBUG, 0, "response data:" . $ret); $retData = json_decode($ret, true); if (!$retData || $retData['errcode']) { interface_log(ERROR, EC_OTHER, "requst wx to get token error"); return false; } //从返回数据中获取得到的access_token和它的过期时间,更新ctoken表 $token = $retData['access_token']; $expire = $retData['expires_in']; $STO->delObject(); $STO->addObject(array('token' => $token, "expire" => $expire, "addTimestamp" => time())); return $token; } catch (DB_Exception $e) { interface_log(ERROR, EC_DB_OP_EXCEPTION, "operate ctoken error! msg:" . $e->getMessage()); return false; } }
public function process() { //return $this->makeHint("系统正在升级!请稍候使用"); try { if ($this->_msgType != 'image') { $contentStr = FF_HINT_TYPE_ERROR; if ($this->_msgType == 'text') { $contents = (string) trim($this->_postObject->Content); if ($contents == 'Hello2BizUser') { $contentStr = FF_HINT_HELLO; } } if ($this->_msgType == 'event') { $event = (string) trim($this->_postObject->Event); if ($event == 'subscribe') { $contentStr = FF_HINT_HELLO; } } return $this->makeHint($contentStr); } $this->_url = trim($this->_postObject->PicUrl); //下载图片到本地 $fileName = $this->downloadPic(); $this->_url = FF_URL_HEADER . $fileName; // 1.检验是否有脸 $ret = faceStub::detect($this->_url); if ($ret === false) { return $this->makeHint(FF_HINT_FACE_ERROR); } if (count($ret['face']) == 0) { return $this->makeHint(FF_HINT_NO_FACE); } if (count($ret['face']) > 1) { return $this->makeHint(FF_HINT_MULTIPLE_FACE); } $faceId = $ret['face'][0]['face_id']; $oTable = new SingleTableOperation(); // 插入face到cFace $oTable->setTableName('cface'); $oTable->addObject(array('faceId' => $faceId, 'personName' => $this->_fromUserName, 'url' => $ret['url'])); // 2.找到最像的脸 $ret = faceStub::search($faceId, GROUP_NAME, 2); if ($ret === false) { return $this->makeHint(FF_HINT_FACE_ERROR); } $candidates = $ret['candidate']; if (count($candidates) == 0) { return $this->makeHint(FF_HINT_FACE_NO_CANDIDATE); } // 查找查询用户,看是否已上传过face $oTable->setTableName('cperson'); $ret = $oTable->getObject(array('personName' => $this->_fromUserName)); if (count($ret)) { $userFaceIds = array(); foreach ($ret as $item) { $userFaceIds[] = $item['faceId']; } $newCandidate = array(); // 从结果集中删除掉用户自己 foreach ($candidates as $item) { if (!in_array($item['face_id'], $userFaceIds)) { $newCandidate[] = $item; } } $candidates = $newCandidate; // 更新用户的faceId $oTable->updateObject(array('faceId' => $faceId), array('personName' => $this->_fromUserName)); // 更新faceplusplus的person:先删除person的face,再加入该faceId $result = faceStub::removeFaceFromPerson($this->_fromUserName, 'all'); if ($result === false) { return $this->makeHint(FF_HINT_FACE_ERROR); } $result = faceStub::addFaceToPerson($this->_fromUserName, $faceId); if ($result === false) { return $this->makeHint(FF_HINT_FACE_ERROR); } } else { // 插入记录到cPerson $oTable->addObject(array('personName' => $this->_fromUserName, 'faceId' => $faceId)); // 请求faceplusplus创建person和,并加到group中 $result = faceStub::createPerson($this->_fromUserName, $faceId, GROUP_NAME); if ($result === false) { return $this->makeHint(FF_HINT_FACE_ERROR); } } if (count($candidates) == 0) { return $this->makeHint(FF_HINT_FACE_NO_CANDIDATE); } // 从数据库中查询face的url $oTable->setTableName('cface'); $ret = $oTable->getObject(array('faceId' => $candidates[0]['face_id'])); if (count($ret) == 0) { return $this->makeHint(FF_HINT_FACE_NO_CANDIDATE); } $url = $ret[0]['url']; $resultStr = sprintf(SUCC_TPL_FINDFACE, $this->_fromUserName, $this->_toUserName, $this->_time, $url, $url); $oTable->setTableName('cstatus'); $ret = $oTable->getObject(array('key' => 'lastTrain')); $lastTrain = $ret[0]['value']; date_default_timezone_set(PRC); $now = date('YmdG'); if ($now != $lastTrain) { faceStub::train(GROUP_NAME, 'search'); $oTable->updateObject(array('value' => $now), array('key' => 'lastTrain')); } return $resultStr; } catch (Exception $e) { interface_log(ERROR, EC_DB_OP_EXCEPTION, $e->getMessage()); return $this->makeHint(FF_HINT_INNER_ERROR); } }
private function getOperandAndOperator() { //查询用户是否在准备列表中 $STO = new SingleTableOperation("cWaitingUser", "MYZL"); $waitingRet = $STO->getObject(array("userId" => $this->_fromUserName)); interface_log(DEBUG, 0, var_export($waitingRet, true)); //查询用户信息 $STO->setTableName("cUser"); $userInfo = $STO->getObject(array("userId" => $this->_fromUserName)); $this->userInfo = $userInfo; interface_log(DEBUG, 0, var_export($userInfo, true)); //处理用户关注公众帐号的动作 if ($this->_msgType == 'event' && trim((string) $this->_postObject->Event) == "subscribe") { if (empty($userInfo)) { //首次关注,添加用户信息 $this->interfaceName = "AddUser"; return true; } else { //取消关注后再次关注,给用户欢迎信息 $this->interfaceName = "WelcomeBack"; return true; } } //获取用户操作自定义菜单的EvenetKey $eventKey = trim((string) $this->_postObject->EventKey); //获取EventKey中的操作码和操作数 $tmp = explode("_", $eventKey); $operator = trim($tmp[0]); $operand = trim($tmp[1]); interface_log(DEBUG, 0, 'operator:' . $operator . ' operand:' . $operand); //处理“下一步”的情况 if ($operator == "NEXT") { //如果用户在操作准备列表中,则说明匹配尚未成功,设置interfaceName为WaitOp,稍后给到提示 if (!empty($waitingRet)) { $this->interfaceName = "WaitOp"; return true; } //执行GetOp类,获取当前用户需要做的的操作 require_once dirname(__FILE__) . '/../interface/GetOp.php'; $instance = new GetOp(); //执行GetOp类的基本函数 if (!$instance->verifyCommonInput($this->_postObject)) { $ret = $instance->renderOutput(); if ($ret['retVal'] == EC_INVALID_INPUT) { $this->interfaceName = "InputErrorHint"; return true; } } if (!$instance->initialize()) { $ret = $instance->renderOutput(); if ($ret['retVal'] == EC_DB_OP_EXCEPTION) { $this->interfaceName = "DbErrorHint"; return true; } } $instance->prepareData(); if (!$instance->process()) { //如果GetOp类的process函数返回false,获取结果 $ret = $instance->renderOutput(); if ($ret['retVal'] == EC_DB_OP_EXCEPTION) { $this->interfaceName = "DbErrorHint"; return true; } if ($ret['retVal'] == EC_USER_NOT_EXIST) { //在用户不存在的情况下,设定interfaceName为AddUser,表示需要添加用户 $this->interfaceName = "AddUser"; return true; } if ($ret['retVal'] == EC_FIGHT_NOT_EXIST) { //如果游戏记录不存在,表示用户需要加入到准备队列,设置interfaceName为Ready $this->interfaceName = "Ready"; return true; } if ($ret['retVal'] == EC_MULTIPLE_FIGHT) { $this->interfaceName = "MultiFightHint"; return true; } } $ret = $instance->renderOutput(); //在没有返回错误码的情况下,获取GetOp返回的游戏记录数据 $this->fightInfo = $ret['retData']; $this->retStr = $instance->getResponseText(); interface_log(DEUBUG, 0, "this->retStr:" . $this->retStr); if ($this->fightInfo['operation'] == START || $this->fightInfo['operation'] == FIRST_END) { //当操作码为START或者FIRST_END,说明是游戏开始阶段 if ($this->fightInfo['first'] == $this->_fromUserName) { //当前用户为开始游戏的一方,设定interfaceName为Start $this->interfaceName = "Start"; } else { //当前用户不是开始游戏的一方,设定interfaceName为WaitStart,稍后代码逻辑中给到提示 $this->interfaceName = "WaitStart"; } return true; } if ($this->fightInfo['operation'] == SECOND_END) { //获取最后操作结果的情况 $this->interfaceName = "SecondEndHint"; return true; } if ($this->fightInfo['operator'] != $this->_fromUserName) { //等待对方操作的情况 $this->interfaceName = "WaitOperation"; $this->value = $this->fightInfo['operation']; return true; } else { if ($this->fightInfo['operation'] == PUT_MAGIC) { if ($userInfo[0]['xsft'] <= 0 && $userInfo[0]['hdcx'] <= 0 && $userInfo[0]['chxs'] <= 0 && $userInfo[0]['sszm'] <= 0) { //在用户没有道具的情况下,NEXT的操作就是使用道具,但是值为空 $this->interfaceName = "PutMagic"; $this->value = ""; } else { //提示用户按使用道具的自定义菜单使用道具 $this->interfaceName = "PutMagicHint"; } } if ($this->fightInfo['operation'] == CHIP_IN) { //提示用户下注 $this->interfaceName = "ChipInHint"; } if ($this->fightInfo['operation'] == SHOOT) { //如果操作码为SHOOT,NEXT操作就是Shoot $this->interfaceName = "Shoot"; } } } else { if ($operator == "CHIPIN") { $this->interfaceName = "ChipIn"; $this->value = (int) $operand; interface_log(DEBUG, 0, "this->value" . $this->value); } else { if ($operator == "PUTMAGIC") { $this->interfaceName = "PutMagic"; $this->value = $operand; } else { $this->interfaceName = "InputErrorHint"; return true; } } } }