相変わらず、普通は「出来ない」と断るような注文を受けておりますが、
出来ると言ってしまった「しわ寄せ」での、追加作業で、
今回は、
GMOペイメントにおいて、サイトA・サイトBで、
同一のSHOPIDで、サイトごとに決済処理する
です。
***
単に、SHOPIDを追加すればよいのですが、
SHOPID毎に、登録費用がかかるので、単一SHOPIDで、
かつ、
30サイトもECCUBEを作ってしまうと、管理が大変!!!
ということで、
1つのコアで、ドメイン毎にテンプレートを切り替えて運用している、
(カンタンに言うと、define.phpや、Config.phpでドメインごとに分岐(後述))
超特殊なECCUBEの環境下での、お話です。
※サーバーやディレクトリーが別の場合でも、通知を受けるPHPにて、
対象ドメインの同pg_mulpay_recv.phpにPOSTで通知してやれば、動くはずです。
* 受取るデータ構造のチェック
まずは、どういうデータが渡されるのかを、知る必要があり、
pg_mulpay_recv.phpにて、渡されたデータを確認
$_ = dirname(__FILE__). '/pg_mulpay_recv.log'; error_log(print_r($_REQUEST, true), 3, $_);
ずらーっと、配列データのある中、
まず当たりをつけたのは「Order_ID」
* モジュール「 EC-CUBEペイメント決済モジュール(2.13系)」
ソースを追いましょう。
まずは、
[OrderID] => 361-18114653を生成しているところを、Grepし、特定。
client/SC_Mdl_PG_MULPAY_Client_Base.php
function sendOrderRequest($url, $arrSendKey, $arrOrder, $arrParam, $arrPaymentInfo, $arrMdlSetting) { $arrReqParam = $arrParam; $arrOrder = SC_Util_PG_MULPAY_Ex::getOrderPayData($arrOrder['order_id']); if (SC_Utils_Ex::isBlank($arrOrder['OrderID'])) { $arrOrder['OrderID'] = $arrOrder['order_id'] . '-' . date('dHis'); $OrderID = $arrOrder['OrderID']; } (以下省略)
試しに、5行目に、なんか追加してみます。
$arrOrder['OrderID'] = $arrOrder['order_id'] . '-' . date('dHis'. '-ABC');
で、決済してみたところ、
なんか、普通に動いてる!
pg_mulpay_recv.logには、ちゃんと
[OrderID] => 361-18114653-ABC
と、渡されているのに、決済後の処理は、変更前と変わらず、
ちゃんと、PaymentID = 6 「支払い済み」になってる!
***
GMOからの通知後の処理をするpage/LC_Page_Mdl_PG_MULPAY_Recv.phpを調べてみると、
function lfGetOrderId($param_OrderID) { list($order_id, $dummy) = explode('-', $param_OrderID); if (SC_Utils_Ex::isBlank($order_id) && !SC_Utils::sfIsInt($order_id)) { return; } else { return $order_id; } }
order_idをハイフォンで分解し、先頭のものをOrder_IDとして、返しています。
つまり、このあとに何をつけようが、先頭の2つしか、使われないので、
Order_IDの後に、ハイフォンをつけ、
ドメインが特定出来るように文字を足してやれば良さそうです。
***
* さて、実装です!!
原則、できるだけソースをいじらないをモットーの改造ポリシーですので、
いじるところは、上記のここだけ。
client/SC_Mdl_PG_MULPAY_Client_Base.php
function sendOrderRequest($url, $arrSendKey, $arrOrder, $arrParam, $arrPaymentInfo, $arrMdlSetting) { $arrReqParam = $arrParam; $arrOrder = SC_Util_PG_MULPAY_Ex::getOrderPayData($arrOrder['order_id']); if (SC_Utils_Ex::isBlank($arrOrder['OrderID'])) { $arrOrder['OrderID'] = $arrOrder['order_id'] . '-' . date('dHis'). '-ABC'; $OrderID = $arrOrder['OrderID']; } (以下省略)
オリジナルに書き加えると、不注意なアップデートで、大番狂わせを食らうので、
ちゃんと、class_exの方に、「sendOrderRequest」をコピーして、使いましょう!
また、文字制限があるようです。
足せる出来るのは、13文字(ハイフォン込)ですが、
実際には一桁目のOrder_IDがまだ3桁なので、一応6桁まで増えるとして、
残り使える文字数は、10文字。
こうなると、ドメイン名を直接いれることは、もう無理です。
また、英数・ハイフォン以外は無効な文字として、跳ねられます。
なので、4文字程度の略語か数字で、
ドメイン対応表を基に、割り出すのが良さそうです。
この定義は、config.php で宣言。
変数でやってみたのですが、うまくいかず、
あと、記号が入ってると、決済時にエラーが表示されるので、要注意!
値が宣言されてない場合でも、sitecodeがついてしまいますが、正常に動きます。
define('sitecode', 'HND'); // (例)羽田空港の略
***
あとは、受信側「pg_mulpay_recv.php」で、処理先を振分けてやれば良いだけです。
まず、対応表を作成し、受信したOrder_IDの3つ目の値と照合。
$seller_siteurl = array( 'HND' => 'www.tokyo-airport-bldg.co.jp/', 'NRT' => 'www.narita-airport.jp/jp/', 'KIX' => 'kansai-airport.or.jp/' );
if (preg_match('/\d+-\d+-(.{3,})/', $_Request['order_id'], $m) { if (isset($seller_siteurl[$m[1]])) { file_get_contents(ほげほげ) } }
あとは、こちらを参考に、コードを足して下さい。
うちの環境では、単にデータベースを切り替えるだけで済むのですが、
細かなところを見直すと、ちょっとおかしな部分があって、
結局、file_get_contetsで、データを投げてることで、偽装しました。
あと、データを投げるときは、order_id の最後の識別文字を削除するように!
でないと、無限ループに陥ります。
うー、今日もマニアックでした・・・