【EC-CUBE】2回に1回失敗して『不正なページ移動です。』ページに遷移する。
試しにEC-CUBE公式のデモサイトのAPIを叩いてみても同じ症状が出ているので持病っぽい。
(15'3/10 現在)
EC-CUBE APIテストページ
http://tachimachi.hmkt.me/150221_get_eccube_version/
テストページの使い方
(1)『APIのURL』欄にEC-CUBEのAPIのURLを入力
(2)『送信』ボタンを押す
(3)APIのレスポンス値が出力される
(jsonAPIであればjson形式の文字列がそのまま出力される)
原因
APIも通常のページ表示と同じクラス(LC_Page_Ex)を継承していて
doValidToken()関数がPOSTアクセスのtransactionidの妥当性チェック処理で
つまずいていたようだった。
LC_Page_Exの派生元のLC_Pageクラスをのぞいてみると実際の処理が記述してあって
コメントにも、必要があればオーバーライドして個別に設定を行うようにアナウンスしてあった。
data/class/pages/LC_Page.php
<?php /** * POST アクセスの妥当性を検証する. * * 生成されたトランザクショントークンの妥当性を検証し, * 不正な場合はエラー画面へ遷移する. * * この関数は, 基本的に init() 関数で呼び出され, POST アクセスの場合は自動的に * トランザクショントークンを検証する. * ページによって検証タイミングなどを制御する必要がある場合は, この関数を * オーバーライドし, 個別に設定を行うこと. * * @access protected * @param boolean $is_admin 管理画面でエラー表示をする場合 true * @return void */ public function doValidToken($is_admin = false) { if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (!SC_Helper_Session_Ex::isValidToken(false)) { if ($is_admin) { SC_Utils_Ex::sfDispError(INVALID_MOVE_ERRORR); } else { SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true); } SC_Response_Ex::actionExit(); } } }
修正対応でやったこと
※EC-CUBE 2.13.2の場合
jsonAPIを動かす上でこの処理は不要なので
doValidToken()関数をオーバーライドして、何もしないように変更した。
data/class_extends/page_extends/api/LC_Page_Api_Json_Ex.php
<?php /** * API のページクラス(拡張). * * LC_Page_Api_Json をカスタマイズする場合はこのクラスを編集する. * * @package Page * @author LOCKON CO.,LTD. * @version $Id$ */ class LC_Page_Api_Json_Ex extends LC_Page_Api_Json { /** * Page を初期化する. * * @return void */ function init() { parent::init(); } /** * Page のプロセス. * * @return void */ function process() { parent::process(); } //以下追記 /** * APIではトランザクショントークンの自動検証は行わない */ public function doValidToken() { // queit. } }
参考サイト
EC CUBE APIがPOSTだと「不正なページ移動です」になる | TIGERTECH Inc.
http://tigertech.jp/ec-cube-api%E3%81%8Cpost%E3%81%A0%E3%81%A8%E3%80%8C%E4%B8%8D%E6%AD%A3%E3%81%AA%E3%83%9A%E3%83%BC%E3%82%B8%E7%A7%BB%E5%8B%95%E3%81%A7%E3%81%99%E3%80%8D%E3%81%AB%E3%81%AA%E3%82%8B