たちまちメモる

開発中に気になったことをメモしてます。

【EC-CUBE】2回に1回失敗して『不正なページ移動です。』ページに遷移する。

f:id:hamkiti:20150310172228p:plain

試しにEC-CUBE公式のデモサイトのAPIを叩いてみても同じ症状が出ているので持病っぽい。
(15'3/10 現在)


EC-CUBE APIテストページ
f:id:hamkiti:20150310172230p:plain
http://tachimachi.hmkt.me/150221_get_eccube_version/

テストページの使い方
(1)『APIのURL』欄にEC-CUBEAPIの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.
  }
    
}