/** * API実行 * * @param array $arrPost リクエストパラメーター * @return array(string レスポンス名, array レスポンス配列) */ public function doApiAction($arrPost) { // 実行時間計測用 $start_time = microtime(true); $objFormParam = new SC_FormParam_Ex(); SC_Api_Operation_Ex::setApiBaseParam($objFormParam); $objFormParam->setParam($arrPost); $objFormParam->convParam(); $arrErr = SC_Api_Operation_Ex::checkParam($objFormParam); if (SC_Utils_Ex::isBlank($arrErr)) { $arrParam = $objFormParam->getHashArray(); $operation_name = $arrParam['Operation']; $service_name = $arrParam['Service']; $style_name = $arrParam['Style']; $validate_flag = $arrParam['Validate']; $api_version = $arrParam['Version']; SC_Api_Utils_Ex::printApiLog('access', $start_time, $operation_name); // API設定のロード $arrApiConfig = SC_Api_Utils_Ex::getApiConfig($operation_name); if (SC_Api_Operation_Ex::checkOperationAuth($operation_name, $arrPost, $arrApiConfig)) { SC_Api_Utils_Ex::printApiLog('Authority PASS', $start_time, $operation_name); // オペレーション権限OK // API オブジェクトをロード $objApiOperation = SC_Api_Utils_Ex::loadApiOperation($operation_name, $arrParam); if (is_object($objApiOperation) && method_exists($objApiOperation, 'doAction')) { // API オペレーション実行 $operation_result = $objApiOperation->doAction($arrPost); // オペレーション結果処理 if ($operation_result) { $arrOperationRequestValid = $objApiOperation->getRequestValidate(); $arrResponseBody = $objApiOperation->getResponseArray(); $response_group_name = $objApiOperation->getResponseGroupName(); } else { $arrErr = $objApiOperation->getErrorArray(); } } else { $arrErr['ECCUBE.Operation.NoLoad'] = 'オペレーションをロード出来ませんでした。'; } } else { $arrErr['ECCUBE.Authority.NoAuthority'] = 'オペレーションの実行権限がありません。'; } } if (count($arrErr) == 0) { // 実行成功 $arrResponseValidSection = array('Request' => array('IsValid' => 'True', $operation_name . 'Request' => $arrOperationRequestValid)); $response_outer = $operation_name . 'Response'; SC_Api_Utils_Ex::printApiLog('Operation SUCCESS', $start_time, $response_outer); } else { // 実行失敗 $arrResponseErrorSection = array(); foreach ($arrErr as $error_code => $error_msg) { $arrResponseErrorSection[] = array('Code' => $error_code, 'Message' => $error_msg); } $arrResponseValidSection = array('Request' => array('IsValid' => 'False', 'Errors' => array('Error' => $arrResponseErrorSection))); if (is_object($objApiOperation)) { $response_outer = $operation_name . 'Response'; } else { $response_outer = 'ECCUBEApiCommonResponse'; } SC_Api_Utils_Ex::printApiLog('Operation FAILED', $start_time, $response_outer); } $arrResponse = array(); $arrResponse['OperationRequest'] = SC_Api_Operation_Ex::getOperationRequestEcho($arrPost, $start_time); $arrResponse[$response_group_name] = array(); // Items $arrResponse[$response_group_name] = $arrResponseValidSection; if (is_array($arrResponseBody)) { $arrResponse[$response_group_name] = array_merge((array) $arrResponse[$response_group_name], (array) $arrResponseBody); } return array($response_outer, $arrResponse); }
/** * オペレーション名に対応した認証の設定情報を取得する * Configが無い場合は、APIデフォルトを取得する * * @param string $operation_name * @return array 設定配列 */ public function getApiConfig($operation_name) { // 設定優先度 DB > plugin default > base $objQuery =& SC_Query_Ex::getSingletonInstance(); $where = 'operation_name Like ? AND del_flg = 0 AND enable = 1'; $arrApiConfig = $objQuery->getRow('*', 'dtb_api_config', $where, array($operation_name)); if (SC_Utils_Ex::isBlank($arrApiConfig)) { $objApi = SC_Api_Utils_Ex::loadApiOperation($operation_name); if (is_object($objApi)) { $arrApiConfig = $objApi->getDefaultConfig(); } if (!SC_Utils_Ex::isBlank($arrApiConfig)) { // デフォルト設定がロード出来た場合は自動で設定に反映 $arrData = $arrApiConfig; $arrData['update_date'] = 'CURRENT_TIMESTAMP'; $arrData['api_config_id'] = $objQuery->nextVal('dtb_api_config_api_config_id'); $objQuery->insert('dtb_api_config', $arrData); } else { // ロード出来ない場合はAPI_Defaultを適用 $operation_name = 'Default'; $objApi = SC_Api_Utils_Ex::loadApiOperation($operation_name); $arrApiConfig = $objApi->getDefaultConfig(); } } return $arrApiConfig; }