バージョン選択

フォーラム

メニュー

オンライン状況

80 人のユーザが現在オンラインです。 (65 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 79
bureau もっと...

サイト内検索

質問 > フロント機能 > イプシロンの「カード決済」を携帯で行うと「不正なページ移動です。」となる。

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
topo
投稿日時: 2008/8/28 21:18
対応状況: −−−
常連
登録日: 2008/6/11
居住地: 岡山
投稿: 64
うまく行きません・・・
>john様、yaris様
イプシロンどうしてもうまく行きません・・・
助けてください><

■環境
EC-CUBEバージョン 2.1.2
PHPバージョン PHP 5.2.6
DBバージョン MySQL 5.0.27-standard-log
ファーストサーバ ギガント2

以下、モバイルの.htaccessの中身です。
ファーストサーバではAllowOverrideを制限しているらしく、一階層上の内容も記載しています。

引用:

# ■■■ /.htaccessファイルの中身を以下に展開 ■■■
#基本はphp_ini.incで設定するが、ini_setで反映されないものはここで設定する
php_value mbstring.language Japanese
php_value output_handler mb_output_handler
php_flag mbstring.encoding_translation 1
php_flag magic_quotes_gpc 0

# INI_ALL なのにもかかわらず, ini_set で指定しても反映されない環境がある...
php_value mbstring.internal_encoding UTF-8

# デフォルトテンプレートの状態で 2M近くになるため
php_value upload_max_filesize 5M

# php_flag mbstring.encoding_translation off
php_value default_charset “UTF-8″

# ■■■ 本来のmobile/.htaccessはここから ■■■
php_flag mbstring.encoding_translation 0
php_value output_handler null
php_value variables_order EGPS
php_flag session.auto_start 0
php_flag session.use_trans_sid 1
# 以下、追加
php_value session.hash_function 1
php_value session.hash_bits_per_character 4


■useRequestで固定する
→パラメータの「SESSION_KEEP_METHOD」は「useCookie」に変更。

引用:

function getInstance() {

$type = defined('SESSION_KEEP_METHOD')
? SESSION_KEEP_METHOD
: '';
// *******************************************************
// モバイル用ページの場合はセッション管理をuseRequestで固定。
$type = defined('MOBILE_SITE') ? 'useRequest' : $type;
// *******************************************************

switch($type) {
// セッションの維持にリクエストパラメータを使用する
case 'useRequest':
$session = new SC_SessionFactory_UseRequest;
defined('MOBILE_SITE')
? $session->setState('mobile')
: $session->setState('pc');
break;

// クッキーを使用する
case 'useCookie':
default:
$session = new SC_SessionFactory_UseCookie;
break;
}

return $session;
}


■『IP』を外す

引用:

data/class/session/sessionfactory/SC_SessionFactory_UseRequest.phpファイルの
(デフォルトで)467行目あたり
<修正前>
 $this->validate = array('NameSpace', 'Model', 'Ip', 'Expire');

<修正後>
 $this->validate = array('NameSpace', 'Model', 'Expire');



■現象
・PCでは問題なくイプシロン決済可能。
・携帯でイプシロン決済しようとするとイプシロンのカード入力画面を経て
 『不正なページ移動です。』となり完了しない。
・携帯で例えば銀行振り込みなどで購入しても普通に購入は出来る。

もう何がなんだかさっぱりです。。。
よろしければ設定と違うような点がございましたらアドバイス頂けると助かりますm(._.)m
topo
投稿日時: 2008/8/29 10:34
対応状況: −−−
常連
登録日: 2008/6/11
居住地: 岡山
投稿: 64
【追加】テスト結果1
携帯のURLを一画面ずつ確認しながら追っかけてみました。

引用:

【1】トップページ
PHPSESSID=d6e92e76a3f....

【2】カテゴリ一覧
PHPSESSID=d6e92e76a3f....

【3】商品詳細
PHPSESSID=d6e92e76a3f....

【4】数量指定
PHPSESSID=d6e92e76a3f....

【5】かご表示
PHPSESSID=d6e92e76a3f....

【6】ご注文手続き(ここ以下はSSL)
product_id=8
PHPSESSID=d6e92e76a3f....

【7】配送先指定
※引数無し

【8】支払方法指定
PHPSESSID=d6e92e76a3f....
transactionid=29b771813...

【9】配達日時指定
※引数無し

【10】ご注文内容確認
PHPSESSID=d6e92e76a3f....
transactionid=29b771813...

【11】クレジットカード決済(イプシロン画面)
trans_code=127164

【12】登録ボタン押下後の画面
※『不正なページ移動です。』になる。

trans_code=127164
user_id=1
result=1
order_number=57
PHPSESSID=4da0164a9466db...(違うセッションになっている)


やはり以下のスレッドでmanbow様がおっしゃっていたように
セッションの受け渡しが上手くいってない感じです。

■2.0以降のイプシロン携帯決済が動作しません
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=1914&forum=11

引用:

戻り時の
「shopping/load_payment_module.php」の30行目
SC_Utils::sfIsPrePage($objSiteSess);
にて、エラーになっているので、セッションの受け渡しが上手くいってないのは分かるのですが、
設定の問題なのか、バグなのか判断が出来ていません。


で、該当しそうなテーブルの中身を漁ってみたのですが
dtb_mobile_ext_session_idをちゃんと取得して引数にして
くれればうまく動きそうなものなのですが・・・

引用:

■dtb_mobile_ext_session_idの中身を確認。

session_id=d6e92e76a3f....
param_key=order_number
param_value=57


ちょっとソースコードとにらめっこしてみたいと思います><
yamane
投稿日時: 2008/8/29 10:49
対応状況: −−−
半人前
登録日: 2008/8/18
居住地:
投稿: 11
Re: 【追加】テスト結果1
yamaneです。

こちらによると携帯のセッション周りに何かあったみたいですね。
この変更を加えたら治るかも?
私はまだ試せてないのですが参考になればと思いました。

http://svn.ec-cube.net/open_trac/changeset/17560
topo
投稿日時: 2008/8/29 11:06
対応状況: −−−
常連
登録日: 2008/6/11
居住地: 岡山
投稿: 64
【追加】テスト結果2
yamane様

情報有難うございます。さっそく試してみたいと思います。
またテスト結果2も投下しておきます。
もし何かアドバイスいただける点がございましたら幸甚でございますm(._.)m

引用:

----------------------------------------
【1】www\shopping\load_payment_module.php(32)
→イプシロンの決済が終わってからコールするURL。
 『SC_Utils::sfIsPrePage』で問題があるみたい。

$objSiteSess = new SC_SiteSession();
$objCartSess = new SC_CartSession();
$objQuery = new SC_Query();

// 前のページで正しく登録手続きが行われた記録があるか判定
SC_Utils::sfIsPrePage($objSiteSess);

----------------------------------------
【2】data\class\sc_sitesession.php(27)
→渡している『$objSiteSess』の中身を作成する処理

/* コンストラクタ */
function SC_SiteSession() {
SC_Utils_Ex::sfDomainSessionStart();
// 前ページでの登録成功判定を引き継ぐ
$_SESSION['site']['pre_regist_success'] =
isset($_SESSION['site']['regist_success'])
? $_SESSION['site']['regist_success'] : "";

$_SESSION['site']['regist_success'] = false;
$_SESSION['site']['pre_page'] =
isset($_SESSION['site']['now_page'])
? $_SESSION['site']['now_page'] : "";

$_SESSION['site']['now_page'] = $_SERVER['PHP_SELF'];
}

----------------------------------------
【3】data\class\util\sc_utils.php(966)
→『sfDomainSessionStart』の中身

/**
* ドメイン間で有効なセッションのスタート
* 共有SSL対応のための修正により、この関数は廃止します。
* セッションはrequire.phpを読み込んだ際に開始されます。
*/
function sfDomainSessionStart() {
/**
* 2.1.1ベータからはSC_SessionFactory_UseCookie::initSession()で処理するため、
* ここでは何も処理しない
*/
if (defined('SESSION_KEEP_METHOD')) {
return;
}

if (session_id() === "") {

session_set_cookie_params(0, "/", DOMAIN_NAME);

if (!ini_get("session.auto_start")) {
// セッション開始
session_start();
}
}
}

----------------------------------------
【4】data\class\util\sc_utils.php(211)
/* 前のページで正しく登録が行われたか判定 */
function sfIsPrePage(&$objSiteSess, $is_mobile = false) {
$ret = $objSiteSess->isPrePage();
if($ret != true) {
// エラーページの表示
SC_Utils::sfDispSiteError(PAGE_ERROR, $objSiteSess, false, "", $is_mobile);
}
}

----------------------------------------
【5】data\class\sc_sitesession.php(43)
/* 前ページが正当であるかの判定 */
function isPrePage() {
if($_SESSION['site']['pre_page'] != "" && $_SESSION['site']['now_page'] != "") {
if($_SESSION['site']['pre_regist_success'] || $_SESSION['site']['pre_page'] == $_SESSION['site']['now_page']) {
return true;
}
}
return false;
}

----------------------------------------
【EX】data\class\helper\sc_helper_mobile.php(83)
→この処理がうまく使えていれば問題ないはずだが・・・?

function lfMobileGetExtSessionId() {
if (!preg_match('|^' . URL_DIR . '(.*)$|', $_SERVER['SCRIPT_NAME'], $matches)) {
return null;
}

$url = $matches[1];
$time = date('Y-m-d H:i:s', time() - MOBILE_SESSION_LIFETIME);
$objQuery = new SC_Query;

foreach ($_REQUEST as $key => $value) {
$session_id = $objQuery->get('dtb_mobile_ext_session_id', 'session_id',
'param_key = ? AND param_value = ? AND url = ? AND create_date >= ?',
array($key, $value, $url, $time));
if (isset($session_id)) {
return $session_id;
}
}

return null;
}

----------------------------------------


topo
投稿日時: 2008/8/29 12:41
対応状況: −−−
常連
登録日: 2008/6/11
居住地: 岡山
投稿: 64
【追加】テスト結果3
yamane様

情報提供有難うございました。
ただ残念ながら類似処理で『useRequestで固定』をしておりましたので
ご指摘頂いた点は問題ないと思われます。
お手数になりますが他に何かありましたらアドバイス頂けますと助かりますm(._.)m

引用:

// *******************************************************
// モバイル用ページの場合はセッション管理をuseRequestで固定。
$type = defined('MOBILE_SITE') ? 'useRequest' : $type;
// *******************************************************

switch($type) {
// セッションの維持にリクエストパラメータを使用する
case 'useRequest':
$session = new SC_SessionFactory_UseRequest;
defined('MOBILE_SITE')
? $session->setState('mobile')
: $session->setState('pc');
break;





またjohn様がうまくいった環境が『2.2.0-beta』でしたので
色々差をみておりましたが気になる点が出てきました。

----------------------------------------
【1】\www\shopping\load_payment_module.php
→イプシロン側でのカード入力を終えた後にこのURLにリダイレクトする。
 以下の『require.php』を読むがちょっと動きが怪しい気がする。
 [ C-CUBEバージョン 2.1.2 ]

引用:

require_once("../require.php");


----------------------------------------
【2】www\require.php
→以下の処理を実行するがモバイルなのでリダイレクト処理に入り、
 exitするので『セッション初期化・開始』を実行しない。

引用:

// セッションハンドラ開始
$objSession = new SC_Helper_Session_Ex();

// インストールチェック
SC_Utils_Ex::sfInitInstall();

// 携帯端末の場合は mobile 以下へリダイレクトする。
if (SC_MobileUserAgent::isMobile()) {
$url = "";
if (SC_Utils_Ex::sfIsHTTPS()) {
$url = MOBILE_SSL_URL;
} else {
$url = MOBILE_SITE_URL;
}

if (preg_match('|^' . URL_DIR . '(.*)$|', $_SERVER['REQUEST_URI'], $matches)) {
$path = $matches[1];
} else {
$path = '';
}

header("Location: ". SC_Utils_Ex::sfRmDupSlash($url . $path));
exit;
}

// セッション初期化・開始
require_once CLASS_PATH . 'session/SC_SessionFactory.php';
$sessionFactory = SC_SessionFactory::getInstance();
$sessionFactory->initSession();


----------------------------------------
【3】www\mobile\shopping\load_payment_module.php
→読み込んでもPC版に行くので【1】に戻る。

引用:

// PC版と同じファイルを読み込む
require_once("../../shopping/load_payment_module.php");
?>


----------------------------------------
【4】www\shopping\load_payment_module.php
→『require_once』なので2回目は無視。
 結局【2】の『セッション初期化・開始』が行われない?

引用:

require_once("../require.php");

$objSiteSess = new SC_SiteSession();
$objCartSess = new SC_CartSession();
$objQuery = new SC_Query();

// 前のページで正しく登録手続きが行われた記録があるか判定
SC_Utils::sfIsPrePage($objSiteSess);


----------------------------------------
【5】eccube-2.3.0-rc1モジュールとの比較
→『eccube-2.3.0-rc1』の『www\require.php』を見ると以下の
 処理に修正されていました。

引用:

$require_php_dir = realpath(dirname( __FILE__));
require_once($require_php_dir . "/define.php");
require_once($require_php_dir . HTML2DATA_DIR . "require_base.php");

// 携帯端末の場合は mobile 以下へリダイレクトする。
if (SC_MobileUserAgent::isMobile()) {
$url = "";
if (SC_Utils_Ex::sfIsHTTPS()) {
$url = MOBILE_SSL_URL;
} else {
$url = MOBILE_SITE_URL;
}

if (preg_match('|^' . URL_DIR . '(.*)$|', $_SERVER['REQUEST_URI'], $matches)) {
$path = $matches[1];
} else {
$path = '';
}

header("Location: ". SC_Utils_Ex::sfRmDupSlash($url . $path));
exit;
}


『require_base.php』に基本的な処理が包括されており、以下の
『セッション初期化・開始』が携帯リダイレクトの前に処理される点が大きな差だと感じました。

引用:

// セッション初期化・開始
require_once CLASS_PATH . 'session/SC_SessionFactory.php';
$sessionFactory = SC_SessionFactory::getInstance();
$sessionFactory->initSession();


----------------------------------------

以上の5点を確認し、『eccube-2.3.0-rc1』の『www\require.php』に
ならう形で『セッション初期化・開始』を『mobile 以下へリダイレクトする』
処理の前に持ってきましたが結局動作は変わりません。。。

他にも色々修正が入った上でjohn様がうまくいったように『2.2.0-beta』だと
動くんでしょうか・・・。

もしそうだとしてもベータ版を入れて他の問題を生む可能性を考えると
軽々しくもインストール出来ないのが現状です。。。

引き続き調べたいと思いますがもしお気づきの点がありましたら
是非ご指摘頂けると助かりますm(._.)m
topo
投稿日時: 2008/8/29 17:37
対応状況: −−−
常連
登録日: 2008/6/11
居住地: 岡山
投稿: 64
【解決!】テスト結果4
seasoft様から『2.3.0-RC』がかなり本気だと伺ったので
現状の『正式版2.1.2』と『2.3.0-RC』の比較をしっかりしてみました。

結果として原因判明しました!
どうも私のとっている環境での設定が問題解決の邪魔を1つしていたようでした・・・><

ひとまず解決しましたのでご報告しておきます。
ご協力頂いた方々、有難うございました〜!

----------------------------------------
【0】www\data\install.php
→クライアントの要望により携帯のパスを『mobile』から変更していた。

引用:

define ('MOBILE_HTML_PATH', HTML_PATH . 'i/');
define ('MOBILE_SITE_URL', SITE_URL . 'i/');
define ('MOBILE_SSL_URL', SSL_URL . 'i/');
define ('MOBILE_URL_DIR', URL_DIR . 'i/');


----------------------------------------
【1】data\shopping\load_payment_module.php
→以下の処理が増えているものの今回の話には関係なさそうなので
 考えない事とする。

引用:

// SPSモジュール連携用
if (file_exists(MODULE_PATH . 'mdl_sps/inc/include.php')
&& !$objCartSess->getTotalQuantity()) {

require_once MODULE_PATH . 'mdl_sps/inc/include.php';
header("Location: " . ERROR_URL);
exit;
}


----------------------------------------
【2】www\require.php
→『require_base.php』に大部分の処理がまとまっている。
 【追加】テスト結果3のようにセッションの取得位置が違うので
 リダイレクトの前に持ってくる。

引用:

// セッション初期化・開始
require_once CLASS_PATH . 'session/SC_SessionFactory.php';
$sessionFactory = SC_SessionFactory::getInstance();
$sessionFactory->initSession();


----------------------------------------
【3】www\data\class\session\sc_sessionfactory.php
→比較を取ってみたが特に変更は無し。
 成功事例にならって以下のロジックは追加。
 
引用:

// *******************************************************
// モバイル用ページの場合はセッション管理をuseRequestで固定。
$type = defined('MOBILE_SITE') ? 'useRequest' : $type;
// *******************************************************

switch($type) {


----------------------------------------
【4】data\class\session\sessionfactory\sc_sessionfactory_userequest.php
→比較を取ってみたが特に変更は無し。
 結局ここで既存のセッションが取れず『session_start();』に行ってしまうのが問題か?

引用:

function initSession() {
// セッションIDの受け渡しにクッキーを使用しない。
ini_set('session.use_cookies', '0');

// パラメーターから有効なセッションIDを取得する。
$sessionId = $this->getSessionId();

if (!$sessionId) {
session_start();
}

// セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成
// し、セッションデータを初期化する。
if ($sessionId === false || !$this->validateSession()) {
session_regenerate_id(true);
// セッションデータの初期化
$this->state->inisializeSessionData();

// 新しいセッションIDを付加してリダイレクトする。
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
// GET の場合は同じページにリダイレクトする。
$objMobile = new SC_Helper_Mobile_Ex;
header('Location: ' . $objMobile->gfAddSessionId());
} else {
// GET 以外の場合はトップページへリダイレクトする。
header('Location: ' . URL_SITE_TOP . '?' . SID);
}
exit;
}

// 有効期限を更新する.
$this->state->updateExpire();
}


----------------------------------------
【5】data\class\session\sessionfactory\sc_sessionfactory_userequest.php
→問題の『getSessionId』の箇所。
 本当の要は『getExtSessionId』でデータがどれるかどうか。

引用:

function getSessionId() {
// パラメーターからセッションIDを取得する。
$sessionId = @$_POST[session_name()];
if (!isset($sessionId)) {
$sessionId = @$_GET[session_name()];
}
if (!isset($sessionId)) {
$sessionId = $this->getExtSessionId();
}
if (!isset($sessionId)) {
return false;
}

// セッションIDの存在をチェックする。
$objSession = new SC_Helper_Session_Ex();
if ($objSession->sfSessRead($sessionId) === null) {
GC_Utils_Ex::gfPrintLog("Non-existent session id : sid=$sessionId");
return false;
}
return session_id($sessionId);
}


----------------------------------------
【6】data\class\session\sessionfactory\sc_sessionfactory_userequest.php
→ここでのデータ取得に失敗しているので結局うまく動かない。
 以下のようにデバッグプリントを仕込む。

引用:

function getExtSessionId() {
if (!preg_match('|^' . URL_DIR . '(.*)$|', $_SERVER['SCRIPT_NAME'], $matches)) {
return null;
}

$url = $matches[1];
$lifetime = $this->state->getLifeTime();
$time = date('Y-m-d H:i:s', time() - $lifetime);
$objQuery = new SC_Query;

$test_msg = "" ;

foreach ($_REQUEST as $key => $value) {
$session_id = $objQuery->get("dtb_mobile_ext_session_id", "session_id",
"param_key = ? AND param_value = ? AND url = ? AND create_date >= ?",
array($key, $value, $url, $time));

$test_msg = $test_msg . "$key, $value, $url, $time : $session_id #" ;

if (isset($session_id)) {
return $session_id;
}
}

// モバイルサイトの時だけ特別エラーへ
if ( defined('MOBILE_SITE') && $test_msg ) {
SC_Utils_Ex::sfDispSiteError(FREE_ERROR_MSG, "", true, "$test_msg");
}

return null;
}


----------------------------------------
【7】www\data\downloads\module\mdl_epsilon\lc_page_mdl_epsilon_credit.php
→原因判明!
 『mobile/shopping...』のように書いてある為に『dtb_mobile_ext_session_id』テーブルの『url』カラムに
 入ってくるデータが『mobile/shopping...』になり、当社で求めている『i/shopping...』では無い為に
 セッションIDが取れていない事が判明。修正して解決へ!

引用:

// 携帯端末の場合は、セッションID・オーダー番号・戻ってくるURLを保存しておく。
if (is_callable("SC_MobileUserAgent", "isMobile") && SC_MobileUserAgent::isMobile()) {
SC_Helper_Mobile::sfMobileSetExtSessionId('order_number', $arrData['order_id'], 'mobile/shopping/load_payment_module.php');
SC_Helper_Mobile::sfMobileSetExtSessionId('order_number', $arrData['order_id'], 'mobile/shopping/confirm.php');
}

nakata
投稿日時: 2008/8/29 18:23
対応状況: −−−
EC-CUBE開発チーム
登録日: 2006/10/12
居住地:
投稿: 7
Re: 【解決!】テスト結果4
topoさま

お世話になっております。開発チームの中田と申します。
解決策が判明した旨、ご丁寧に弊社までご連絡をいただきまして
ありがとうございます。

他のユーザ様にも有益な情報を共有していただきましてありがと
うございます。
弊社内の状況により、なかなか開発コミュニティでお困りの皆様
に十分対応できておらず申し訳ございませんが、どうぞ今後とも
宜しくお願い申し上げます。



topo
投稿日時: 2008/8/29 18:47
対応状況: −−−
常連
登録日: 2008/6/11
居住地: 岡山
投稿: 64
Re: 【解決!】テスト結果4
>nakata様
すいません、逆にうちの人間が不躾にご質問のお電話をさせて頂き申し訳ありませんでした。
結果報告も兼ねてお電話させて頂きましたがこのようにコメントつけて頂きますと恐縮です。

今回の件も含めて次のVerに繋がっていくといいですね!
開発たいへんかと思いますが頑張ってくださいませm(._.)m
« 1 (2)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,014名です
総投稿数は110,020件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.