ECCUBE 2.13系 * 同一のSHOPIDでサイト毎に決済する@GMOペイメント

相変わらず、普通は「出来ない」と断るような注文を受けておりますが、
出来ると言ってしまった「しわ寄せ」での、追加作業で、

今回は、

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 の最後の識別文字を削除するように!
でないと、無限ループに陥ります。

うー、今日もマニアックでした・・・

ECCUBE 2.13系 * 同一のSHOPIDでサイト毎に決済する@GMOペイメント