Ticket #697: include.php

File include.php, 52.0 KB (added by kajiwara, 14 years ago)

修正用ファイル

Line 
1<?php
2/**
3 *
4 * @copyright   2000-2009 LOCKON CO.,LTD. All Rights Reserved.
5 * @version CVS: $Id: mdl_paygent.inc 7162 2009-02-19 09:53:33Z satou $
6 * @link        http://www.lockon.co.jp/
7 *
8 */
9$paygent_credit_php_dir = realpath(dirname( __FILE__));
10
11// include_pathにmdl_paygentのパスを含める
12ini_set('include_path', $paygent_credit_php_dir . PATH_SEPARATOR . ini_get('include_path'));
13
14// paygentモジュールの読込
15$paygent_module_dir = "jp/co/ks/merchanttool/connectmodule/";
16if(file_exists($paygent_credit_php_dir. "/". $paygent_module_dir)) {
17    include_once($paygent_module_dir. "system/PaygentB2BModule.php");
18}
19
20// ペイジェント決済のモジュールコード
21define("MDL_PAYGENT_CODE", "mdl_paygent");
22
23// ログファイルパス(EC-CUBEサイド)
24define("PAYGENT_LOG_PATH_LINK", DATA_PATH. "logs/paygent.log");
25define("PAYGENT_LOG_PATH", DATA_PATH. "logs/paygent_cube.log");
26
27// 決済種別
28define("SETTLEMENT_LINK", 1);
29define("SETTLEMENT_MODULE", 2);
30define("SETTLEMENT_MIX", 3);
31
32$arrSettlement = array(
33    SETTLEMENT_LINK => 'リンク型',
34    SETTLEMENT_MODULE => 'モジュール型',
35    SETTLEMENT_MIX => '混合型',
36);
37
38// 支払いの種類
39define("PAY_PAYGENT_CREDIT", "1");
40define("PAY_PAYGENT_CONVENI_NUM", "2");
41define("PAY_PAYGENT_CONVENI_CALL", "3");
42define("PAY_PAYGENT_ATM", "4");
43define("PAY_PAYGENT_BANK", "5");
44define("PAY_PAYGENT_CAREER", "6");
45define("PAY_PAYGENT_LINK", "50");
46
47$arrPayment = array(
48    PAY_PAYGENT_CREDIT => 'クレジット',
49    PAY_PAYGENT_CONVENI_NUM => 'コンビニ(番号方式)',
50    PAY_PAYGENT_CONVENI_CALL => 'コンビニ(払込票方式)',
51    PAY_PAYGENT_ATM => 'ATM決済',
52    PAY_PAYGENT_BANK => '銀行ネット',
53    PAY_PAYGENT_CAREER => 'キャリア'
54);
55
56// ペイジェントの各払込の対応番号
57/*
58    電文種別を表す区分
59    010:ATM決済申込
60    020:カード決済オーソリ
61    021:カード決済オーソリキャンセル
62    022:カード決済売上
63    023:カード決済売上キャンセル
64    024:カード決済3Dオーソリ
65    025:カード情報設定
66    026:カード情報削除
67    027:カード情報照会
68    029:カード決済補正売上
69    030:コンビニ決済(番号方式)申込
70    040:コンビニ決済(払込票方式)申込
71    050:銀行ネット決済申込
72    060:銀行ネット決済ASP
73    090:決済情報照会
74    091:差分照会
75    100:携帯キャリア決済申込
76    101:携帯キャリア決済売上要求電文
77    102:携帯キャリア決済取消要求電文
78    103:携帯キャリア決済補正売上要求電文
79*/
80define("PAYGENT_ATM", '010');
81define("PAYGENT_CREDIT", '020');
82define("PAYGENT_AUTH_CANCEL", '021');
83define("PAYGENT_CARD_COMMIT", '022');
84define("PAYGENT_CARD_COMMIT_CANCEL", '023');
85define("PAYGENT_CARD_COMMIT_REVICE", '029');
86define("PAYGENT_CARD_3D", '024');
87define("PAYGENT_CARD_STOCK_SET", '025');
88define("PAYGENT_CARD_STOCK_DEL", '026');
89define("PAYGENT_CARD_STOCK_GET", '027');
90define("PAYGENT_CONVENI_NUM", '030');
91define("PAYGENT_CONVENI_CALL", '040');
92define("PAYGENT_BANK", '060');
93define("PAYGENT_CAREER", '100');
94define("PAYGENT_CAREER_COMMIT", '101');
95define("PAYGENT_CAREER_COMMIT_CANCEL", '102');
96define("PAYGENT_CAREER_COMMIT_REVICE", '103');
97
98define("PAYGENT_CAREER_D", '100_1');
99define("PAYGENT_CAREER_A", '100_2');
100define("PAYGENT_CAREER_S", '100_3');
101
102// バッチで使用する。
103define("PAYGENT_REF", '091');
104
105// バッチで使用する決済種別CD
106define("PAYMENT_TYPE_CAREER", '06');
107
108// 無限ループを避ける
109define("PAYGENT_REF_LOOP", 1000);
110
111$arrDispKind = array(
112    PAYGENT_AUTH_CANCEL => 'オーソリキャンセル',
113    PAYGENT_CARD_COMMIT => '売上',
114    PAYGENT_CARD_COMMIT_REVICE => '補正売上',
115    PAYGENT_CARD_COMMIT_CANCEL => '売上キャンセル',
116    PAYGENT_CAREER_COMMIT => '売上',
117    PAYGENT_CAREER_COMMIT_CANCEL => '取消',
118    PAYGENT_CAREER_COMMIT_REVICE => '補正売上'
119);
120
121// 受注時の初期ステータス
122$arrInitStatus = array(
123    PAYGENT_CREDIT => ORDER_NEW,        // クレジットは新規受付
124    PAYGENT_ATM => ORDER_PAY_WAIT,      // ATM決済は入金待ち
125    PAYGENT_CONVENI_NUM => ORDER_PAY_WAIT,  // コンビニ(番号方式)は入金待ち
126    PAYGENT_CONVENI_CALL => ORDER_PAY_WAIT, // コンビニ(払込票方式)は入金待ち
127    PAYGENT_BANK => ORDER_PAY_WAIT,     // 銀行は入金待ち
128    PAYGENT_CAREER =>  ORDER_NEW        // キャリア決済は新規受付
129);
130
131// 利用上限金額
132define ("CHARGE_MAX", 500000);
133define ("SEVEN_CHARGE_MAX", 300000);
134define ("CAREER_CHARGE_MAX", 30000);
135
136// 利用下限金額
137define ("CAREER_CHARGE_MIN", 1);
138
139// 電文バージョン
140define ("TELEGRAM_VERSION", '1.0');
141
142// コンビニコード
143define ("CODE_SEVENELEVEN", "00C001");  // セブンイレブン
144define ("CODE_LOWSON", "00C002");       // ローソン
145define ("CODE_MINISTOP", "00C004");     // ミニストップ
146define ("CODE_FAMILYMART", "00C005");   // ファミリーマート
147define ("CODE_SUNKUS", "00C006");       // サンクス
148define ("CODE_CIRCLEK", "00C007");      // サークルK
149define ("CODE_YAMAZAKI", "00C014");     // デイリーヤマザキ
150define ("CODE_SEICOMART", "00C016");    // セイコーマート
151
152// コンビニの種類
153$arrConvenience = array(
154    CODE_SEICOMART => 'セイコーマート',
155    CODE_LOWSON => 'ローソン',
156    CODE_MINISTOP => 'ミニストップ',
157    CODE_FAMILYMART => 'ファミリーマート',
158    CODE_SUNKUS => 'サンクス',
159    CODE_CIRCLEK => 'サークルK',
160    CODE_YAMAZAKI => 'デイリーヤマザキ',
161    CODE_SEVENELEVEN => 'セブンイレブン'
162);
163
164// キャリアコード
165define ("CAREER_TYPE_DOCOMO", "1");    // docomo
166define ("CAREER_TYPE_AU", "2");        // au
167define ("CAREER_TYPE_SOFTBANK", "3");  // softbank
168
169// キャリアの種類
170$arrCareer = array(
171    CAREER_TYPE_DOCOMO => 'docomo',
172    CAREER_TYPE_AU => 'au',
173    CAREER_TYPE_SOFTBANK => 'softbank'
174);
175
176// 電話区分コード
177define ("TEL_HOME", "1");         // 自宅
178define ("TEL_CALL", "2");         // 呼び出し
179define ("TEL_DORMITORY", "3");    // 寮
180define ("TEL_MOBILE", "5");       // 携帯
181
182// 電話区分(コンビニ払込票方式)の種類
183$arrTelDivision = array(
184    TEL_HOME => '自宅',
185    TEL_CALL => '呼び出し',
186    TEL_DORMITORY => '寮',
187    TEL_MOBILE => '携帯'
188);
189
190// ネットバンクの種類
191$arrNetBank = array(
192    'D005' => 'e-payment',
193    'D008' => 'ネット振込EDI',
194    'D009' => 'One\'s ダイレクト',
195    'D033' => 'ジャパンネット銀行',
196    'D036' => 'イーバンク'
197);
198
199// クレジットの種類
200$arrCredit = array(
201    1 => 'VISA, MASTER, Diners',
202    2 => 'JCB, AMEX'
203);
204
205// クレジット分割回数
206$arrPaymentClass = array(
207    '10' => '一括払い',
208    '61-2' => '分割2回払い',
209    '61-3' => '分割3回払い',
210    '61-6' => '分割6回払い',
211    '61-10' => '分割10回払い',
212    '61-15' => '分割15回払い',
213    '61-20' => '分割20回払い',
214    '80' => 'リボ払い'
215);
216
217// カード支払区分(リンク型)
218$arrCardClass = array(
219    '0' => '1回払いのみ',
220    '1' => '全て',
221    '2' => 'ボーナス一括以外全て'
222);
223
224// オプションの要/不要
225$arrOptionActive = array(
226    '1' => '要',
227    '0' => '不要'
228);
229
230// 文字入力制限(byte)
231define ("PAYGENT_BANK_STEXT_LEN", "12");    // ATM,銀行ネットの利用者名(漢字,カナ)
232define ("PAYGENT_CONVENI_STEXT_LEN", "14"); // コンビニの利用者名(カナ)
233define ("PAYGENT_CONVENI_MTEXT_LEN", "20"); // コンビニの利用者名(漢字)
234define ("PAYGENT_TEL_ITEM_LEN", 11);        // 電話番号各項目制限(11文字:全入力)
235define ("PAYGENT_S_TEL_ITEM_LEN", 4);       // 電話番号各項目制限(4文字:3項目入力)
236define ("PAYGENT_LINK_STEXT_LEN", "12");    // リンク型の利用者名(漢字,カナ)
237
238
239//====================================================================================
240
241/**
242 * 関数名:sfGetPaygentShare
243 * 処理内容:ペイジェント情報送信の共通処理
244 * 戻り値:取得結果
245 */
246function sfGetPaygentShare($telegram_kind, $order_id, $arrParam, $payment_id = "") {
247    /** 共通電文 **/
248    // マーチャントID
249    $arrSend['merchant_id'] = $arrParam['merchant_id'];
250    // 接続ID
251    $arrSend['connect_id'] = $arrParam['connect_id'];
252    // 接続パスワード
253    $arrSend['connect_password'] = $arrParam['connect_password'];
254    // 電文種別ID
255    $arrSend['telegram_kind'] = $telegram_kind;
256    // 電文バージョン
257    $arrSend['telegram_version'] = TELEGRAM_VERSION;
258    // マーチャント取引ID
259    $arrSend['trading_id'] = $order_id;
260    // 決済ID
261    if (strlen($payment_id) > 0) $arrSend['payment_id'] = $payment_id;
262    // EC-CUBEからの電文であることを示す。
263    $arrSend['partner'] = 'lockon';
264
265    return $arrSend;
266}
267
268/**
269 * 電文種別ごとに個別情報を追加しなければならない場合に使用する
270 * @param $arrSend
271 * @param $arrTelegram 個別情報に追加したい値
272 * @param $kind 電文種別ID
273 * @return $arrSend
274 */
275function sfAddDetailToSend($arrSend, $arrTelegram, $kind) {
276    // 携帯キャリア決済補正売上要求電文の場合
277    switch($kind) {
278    case PAYGENT_CAREER_COMMIT_REVICE:
279        $arrSend['amount'] = $arrTelegram[1];
280        break;
281
282    // カード決済補正売上要求電文の場合は, 補正後の取引金額を送信するフラグ追加
283    case PAYGENT_CARD_COMMIT_REVICE:
284        $arrSend['payment_amount'] = $arrTelegram[1]; // 補正後の金額
285        $arrSend['reduction_flag'] = "0"; // 減額フラグ:0(補正後の取引金額)
286        break;
287    default:
288        break;
289    }
290    return $arrSend;
291}
292
293/**
294 * 関数名:sfSendPaygentCredit
295 * 処理内容:クレジット情報の送信
296 * 戻り値:取得結果
297 */
298function sfSendPaygentCredit($arrData, $arrInput, $uniqid) {
299    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
300    $p = new PaygentB2BModule();
301    $p->init();
302
303    // クレジット用パラメータの取得
304    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE, "AND memo03 = '". PAY_PAYGENT_CREDIT . "'");
305    $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']);
306
307    // 共通データの取得
308    $arrSend = sfGetPaygentShare(PAYGENT_CREDIT, $arrData['order_id'], $arrPaymentDB[0]);
309
310    /** 個別電文 **/
311    // 決済金額
312    $arrSend['payment_amount'] = $arrData['payment_total'];
313    // カード番号
314    $arrSend['card_number'] = $arrInput['card_no01'].$arrInput['card_no02'].$arrInput['card_no03'].$arrInput['card_no04'];
315    // カード有効期限(MMYY)
316    $arrSend['card_valid_term'] = $arrInput['card_month'].$arrInput['card_year'];
317    // 支払い区分、分割回数の取得
318    list($payment_class, $split_count) = split("-", $arrInput['payment_class']);
319    // 支払い区分
320    /*
321     * 10:1回
322     * 23:ボーナス1回
323     * 61:分割
324     * 80:リボルビング
325     */
326    $arrSend['payment_class'] = $payment_class;
327    // 分割回数
328    $arrSend['split_count'] = $split_count;
329    /** 3Dセキュア関連 **/
330    if ($arrOtherParam['credit_3d'] != 1 || SC_MobileUserAgent::isMobile()) {
331        // 3Dセキュア不要区分
332        $arrSend['3dsecure_ryaku'] = "1";
333    } else {
334        // HttpAccept
335        $arrSend['http_accept'] = $_SERVER['HTTP_ACCEPT'];
336        // HttpUserAgent
337        $arrSend['http_user_agent'] = $_SERVER['HTTP_USER_AGENT'];
338        // 3Dセキュア戻りURL
339        $arrSend['term_url'] = SSL_URL. "shopping/load_payment_module.php?mode=credit_3d&uniqid=". $uniqid;
340    }
341    /** カード情報お預かり機能 **/
342    if ($arrInput['stock'] == 1) {
343        // 不要
344        unset($arrSend['card_number']);
345        unset($arrSend['card_valid_term']);
346        // カード情報お預かりモード
347        $arrSend['stock_card_mode'] = "1";
348        // 顧客ID
349        $arrSend['customer_id'] = $arrData['customer_id'];
350        // 顧客カードID
351        $arrSend['customer_card_id'] = $arrInput['CardSeq'];
352    }
353
354    // 電文の送付
355    foreach($arrSend as $key => $val) {
356        $p->reqPut($key, $val);
357    }
358    $p->post();
359    // 応答を処理
360    $arrRet = sfPaygentResponse(PAYGENT_CREDIT, $p, $uniqid, $arrInput);
361
362    return $arrRet;
363}
364
365/**
366 * 関数名:sfSendPaygentCredit3d
367 * 処理内容:3Dセキュア情報の送信
368 * 戻り値:取得結果
369 */
370function sfSendPaygetnCredit3d($arrData, $arrInput, $uniqid) {
371    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
372    $p = new PaygentB2BModule();
373    $p->init();
374
375    // クレジット用パラメータの取得
376    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE, "AND memo03 = '". PAY_PAYGENT_CREDIT . "'");
377    $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']);
378
379    // 共通データの取得
380    $arrSend = sfGetPaygentShare(PAYGENT_CARD_3D, $arrData['order_id'], $arrPaymentDB[0], $arrData['memo06']);
381
382    /** 個別電文 **/
383    // ACS応答
384    $arrSend['PaRes'] = $arrInput['PaRes'];
385    // マーチャントデータ
386    $arrSend['MD'] = $arrInput['MD'];
387
388    // 電文の送付
389    foreach($arrSend as $key => $val) {
390        $p->reqPut($key, $val);
391    }
392    $p->post();
393    // 応答を処理
394    $arrRet = sfPaygentResponse(PAYGENT_CREDIT, $p, $uniqid, $arrInput);
395
396    return $arrRet;
397}
398
399/**
400 * 関数名:sfSetPaygentCreditStock
401 * 処理内容:カード情報の設定
402 * 戻り値:取得結果
403 */
404function sfSetPaygentCreditStock($arrData, $arrInput) {
405    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
406    $p = new PaygentB2BModule();
407    $p->init();
408
409    // 設定パラメータの取得
410    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE);
411
412    // 共通データの取得
413    $arrSend = sfGetPaygentShare(PAYGENT_CARD_STOCK_SET, 0, $arrPaymentDB[0]);
414
415    /** 個別電文 **/
416    // 顧客ID
417    $arrSend['customer_id'] = $arrData['customer_id'];
418    // カード番号
419    $arrSend['card_number'] = $arrInput['card_no01'].$arrInput['card_no02'].$arrInput['card_no03'].$arrInput['card_no04'];
420    // カード有効期限(MMYY)
421    $arrSend['card_valid_term'] = $arrInput['card_month'].$arrInput['card_year'];
422    // カード名義人
423    $arrSend['cardholder_name'] = $arrInput['card_name01']." ".$arrInput['card_name02'];
424
425    // 電文の送付
426    foreach($arrSend as $key => $val) {
427        $p->reqPut($key, $val);
428    }
429    $p->post();
430    // 応答を処理
431    $arrRet = sfPaygentResponseCard(PAYGENT_CARD_STOCK_SET, $p, $arrData['customer_id']);
432
433    return $arrRet;
434}
435
436/**
437 * 関数名:sfDelPaygentCreditStock
438 * 処理内容:カード情報の削除
439 * 戻り値:取得結果
440 */
441function sfDelPaygentCreditStock($arrData, $arrInput) {
442    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
443    $p = new PaygentB2BModule();
444    $p->init();
445
446    // 設定パラメータの取得
447    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE);
448
449    // 共通データの取得
450    $arrSend = sfGetPaygentShare(PAYGENT_CARD_STOCK_DEL, 0, $arrPaymentDB[0]);
451
452    /** 個別電文 **/
453    // 顧客ID
454    $arrSend['customer_id'] = $arrData['customer_id'];
455    // 顧客カードID
456    $arrSend['customer_card_id'] = $arrInput['CardSeq'];
457
458    // 電文の送付
459    foreach($arrSend as $key => $val) {
460        $p->reqPut($key, $val);
461    }
462    $p->post();
463    // 応答を処理
464    $arrRet = sfPaygentResponseCard(PAYGENT_CARD_STOCK_DEL, $p, $arrData['customer_id']);
465
466    return $arrRet;
467}
468
469/**
470 * 関数名:sfGetPaygentCreditStock
471 * 処理内容:カード情報の照会
472 * 戻り値:取得結果
473 */
474function sfGetPaygentCreditStock($arrData) {
475    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
476    $p = new PaygentB2BModule();
477    $p->init();
478
479    // 設定パラメータの取得
480    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE);
481
482    // 共通データの取得
483    $arrSend = sfGetPaygentShare(PAYGENT_CARD_STOCK_GET, 0, $arrPaymentDB[0]);
484
485    /** 個別電文 **/
486    // 顧客ID
487    $arrSend['customer_id'] = $arrData['customer_id'];
488    // 顧客カードID
489    $arrSend['customer_card_id'] = $arrInput['delete_card'];
490
491    // 電文の送付
492    foreach($arrSend as $key => $val) {
493        $p->reqPut($key, $val);
494    }
495    $p->post();
496    // 応答を処理
497    $arrRet = sfPaygentResponseCard(PAYGENT_CARD_STOCK_GET, $p, $arrData['customer_id']);
498
499    return $arrRet;
500}
501
502/**
503 * 関数名:sfSendPaygentConveni
504 * 処理内容:コンビニ(番号方式)情報の送信
505 * 戻り値:取得結果
506 */
507function sfSendPaygentConveni($arrData, $arrInput, $uniqid) {
508    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
509    $p = new PaygentB2BModule();
510    $p->init();
511
512    // コンビニ用パラメータの取得
513    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE, "AND memo03 = '". PAY_PAYGENT_CONVENI_NUM . "'");
514    $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']);
515
516    // 共通データの取得
517    $arrSend = sfGetPaygentShare(PAYGENT_CONVENI_NUM, $arrData['order_id'], $arrPaymentDB[0]);
518
519    /** 個別電文 **/
520    // 決済金額
521    $arrSend['payment_amount'] = $arrData['payment_total'];
522    // 利用者姓
523    $arrSend['customer_family_name'] = $arrInput['customer_family_name'];
524    // 利用者名
525    $arrSend['customer_name'] = $arrInput['customer_name'];
526    // 利用者姓半角カナ
527    $arrSend['customer_family_name_kana'] = mb_convert_kana($arrInput['customer_family_name_kana'],'k');
528    $arrSend['customer_family_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_family_name_kana']);
529    // 利用者名半角カナ
530    $arrSend['customer_name_kana'] = mb_convert_kana($arrInput['customer_name_kana'],'k');
531    $arrSend['customer_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_name_kana']);
532    // 利用者電話番号
533    $arrSend['customer_tel'] = $arrInput['customer_tel'];
534    // 支払期限日
535    $arrSend['payment_limit_date'] = $arrOtherParam['payment_limit_date'];
536    // 有効期限日
537    $arrSend['payment_limit_date'] = $arrOtherParam['payment_limit_date'];
538    // コンビニ企業コード
539    $arrSend['cvs_company_id'] =  $arrInput['cvs_company_id'];
540    // 支払種別
541    $arrSend['sales_type'] = '1';
542
543    // 電文の送付
544    foreach($arrSend as $key => $val) {
545        // Shift-JISにエンコードする必要あり
546        $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE);
547        $p->reqPut($key, $enc_val);
548    }
549    $p->post();
550    // 応答を処理
551    $arrRet = sfPaygentResponse(PAYGENT_CONVENI_NUM, $p, $uniqid, $arrInput);
552
553    return $arrRet;
554}
555
556/**
557 * 関数名:sfSendPaygentConveniCall
558 * 処理内容:コンビニ(払込票方式)情報の送信
559 * 戻り値:取得結果
560 */
561function sfSendPaygentConveniCall($arrData, $arrInput, $uniqid) {
562    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
563    $p = new PaygentB2BModule();
564    $p->init();
565
566    // コンビニ用パラメータの取得
567    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE, "AND memo03 = '". PAY_PAYGENT_CONVENI_CALL . "'");
568    $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']);
569
570    // 共通データの取得
571    $arrSend = sfGetPaygentShare(PAYGENT_CONVENI_CALL, $arrData['order_id'], $arrPaymentDB[0]);
572
573    /** 個別電文 **/
574    // 決済金額
575    $arrSend['payment_amount'] = $arrData['payment_total'];
576    // 税区分
577    $arrSend['tax_class'] = 1;
578    // 支払情報
579    $arrSend['site_info'] = $arrOtherParam['site_info'];
580    // 支払期限日
581    $arrSend['payment_limit_date'] = $arrOtherParam['payment_limit_date'];
582    // 有効期限日
583    $arrSend['bill_expiration_date'] = $arrOtherParam['bill_expiration_date'];
584    // 利用者区分
585    $arrSend['customer_type'] = 0;
586    // 利用者姓
587    $arrSend['customer_family_name'] = $arrInput['customer_family_name'];
588    // 利用者名
589    $arrSend['customer_name'] = $arrInput['customer_name'];
590    // 利用者姓半角カナ
591    $arrSend['customer_family_name_kana'] = mb_convert_kana($arrInput['customer_family_name_kana'],'k');
592    $arrSend['customer_family_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_family_name_kana']);
593    // 利用者名半角カナ
594    $arrSend['customer_name_kana'] = mb_convert_kana($arrInput['customer_name_kana'],'k');
595    $arrSend['customer_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_name_kana']);
596    // 利用者郵便番号
597    $arrSend['customer_zip_code'] = $arrInput['customer_zip01'] . $arrInput['customer_zip02'];
598    // 利用者住所1
599    $objMasterData = new SC_DB_MasterData_Ex();
600    $arrPref = $objMasterData->getMasterData("mtb_pref", array("pref_id", "pref_name", "rank"));
601    $arrSend['customer_address_1'] = $arrPref[$arrInput['customer_pref']] . $arrInput['customer_addr01'];
602    // 利用者住所2
603    $arrSend['customer_address_2'] = $arrInput['customer_addr02'];
604    // 利用者電話区分
605    $arrSend['customer_tel_type'] = $arrInput['customer_tel_division'];
606    // 利用者電話番号
607    $arrSend['customer_tel'] = $arrInput['customer_tel01'] . "-" . $arrInput['customer_tel02'] . "-" . $arrInput['customer_tel03'];
608
609    // 電文の送付
610    foreach($arrSend as $key => $val) {
611        // Shift-JISにエンコードする必要あり
612        $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE);
613        $p->reqPut($key, $enc_val);
614    }
615    $p->post();
616    // 応答を処理
617    $arrRet = sfPaygentResponse(PAYGENT_CONVENI_CALL, $p, $uniqid, $arrInput);
618
619    return $arrRet;
620}
621
622/**
623 * 関数名:sfSendPaygentATM
624 * 処理内容:ATM決済情報の送信
625 * 戻り値:取得結果
626 */
627function sfSendPaygentATM($arrData, $arrInput, $uniqid) {
628    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
629    $p = new PaygentB2BModule();
630    $p->init();
631
632    // ATM決済用パラメータの取得
633    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE, "AND memo03 = '". PAY_PAYGENT_ATM . "'");
634    $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']);
635
636    // 共通データの取得
637    $arrSend = sfGetPaygentShare(PAYGENT_ATM, $arrData['order_id'], $arrPaymentDB[0]);
638
639    /** 個別電文 **/
640    // 決済金額
641    $arrSend['payment_amount'] = $arrData['payment_total'];
642    // 利用者姓
643    $arrSend['customer_family_name'] = $arrInput['customer_family_name'];
644    // 利用者名
645    $arrSend['customer_name'] = $arrInput['customer_name'];
646    // 利用者姓半角カナ
647    $arrSend['customer_family_name_kana'] = mb_convert_kana($arrInput['customer_family_name_kana'],'k');
648    $arrSend['customer_family_name_kana'] = preg_replace("/ー/", "-", $arrSend['customer_family_name_kana']);
649    $arrSend['customer_family_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_family_name_kana']);
650    // 利用者名半角カナ
651    $arrSend['customer_name_kana'] = mb_convert_kana($arrInput['customer_name_kana'],'k');
652    $arrSend['customer_name_kana'] = preg_replace("/ー/", "-", $arrSend['customer_name_kana']);
653    $arrSend['customer_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_name_kana']);
654    // 決済内容
655    $arrSend['payment_detail'] = $arrOtherParam['payment_detail'];
656    // 決済内容半角カナ
657    $arrSend['payment_detail_kana'] = mb_convert_kana($arrOtherParam['payment_detail'],'k');
658    $arrSend['payment_detail_kana'] = preg_replace("/ー/", "-", $arrSend['payment_detail_kana']);
659    // 支払期限日
660    $arrSend['payment_limit_date'] = $arrOtherParam['payment_limit_date'];
661
662    // 電文の送付
663    foreach($arrSend as $key => $val) {
664        // Shift-JISにエンコードする必要あり
665        $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE);
666        $p->reqPut($key, $enc_val);
667    }
668    $p->post();
669    // 応答を処理
670    $arrRet = sfPaygentResponse(PAYGENT_ATM, $p, $uniqid, $arrInput);
671
672    return $arrRet;
673}
674
675/**
676 * 関数名:sfSendPaygentBANK
677 * 処理内容:銀行NET決済情報の送信
678 * 戻り値:取得結果
679 */
680function sfSendPaygentBANK($arrData, $arrInput, $uniqid) {
681// 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
682    $p = new PaygentB2BModule();
683    $p->init();
684
685    // 銀行NET用パラメータの取得
686    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE, "AND memo03 = '". PAY_PAYGENT_BANK . "'");
687    $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']);
688
689    // 共通データの取得
690    $arrSend = sfGetPaygentShare(PAYGENT_BANK, $arrData['order_id'], $arrPaymentDB[0]);
691
692    /** 個別電文 **/
693    //$arrSend['bank_code'] = $arrInput['bank_code'];
694    // 決済金額
695    $arrSend['amount'] = $arrData['payment_total'];
696    // 請求内容カナ
697    $arrSend['claim_kana'] = mb_convert_kana($arrOtherParam['claim_kana'],'k');
698    $arrSend['claim_kana'] = preg_replace("/ー/", "-", $arrSend['claim_kana']);
699    // 請求内容漢字
700    $arrSend['claim_kanji'] = $arrOtherParam['claim_kanji'];
701    // 利用者姓
702    $arrSend['customer_family_name'] = $arrInput['customer_family_name'];
703    // 利用者名
704    $arrSend['customer_name'] = $arrInput['customer_name'];
705    // 利用者姓半角カナ
706    $arrSend['customer_family_name_kana'] = mb_convert_kana($arrInput['customer_family_name_kana'],'k');
707    $arrSend['customer_family_name_kana'] = preg_replace("/ー/", "-", $arrSend['customer_family_name_kana']);
708    $arrSend['customer_family_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_family_name_kana']);
709    // 利用者名半角カナ
710    $arrSend['customer_name_kana'] = mb_convert_kana($arrInput['customer_name_kana'],'k');
711    $arrSend['customer_name_kana'] = preg_replace("/ー/", "-", $arrSend['customer_name_kana']);
712    $arrSend['customer_name_kana'] = preg_replace("/゙|゚/", "", $arrSend['customer_name_kana']);
713    // PC-Mobile区分
714    /*
715     * 0:PC
716     * 1:docomo
717     * 2:au
718     * 3:softbank
719     */
720    $arrSend['pc_mobile_type'] = '0';
721    // 店舗名
722    $arrSend['merchant_name'] = $arrOtherParam['claim_kanji'];
723    // 完了後の戻りURL
724    $arrSend['return_url'] = SITE_URL. "index.php";
725    // 戻りボタンURL
726    $arrSend['stop_return_url'] = SSL_URL. "shopping/load_payment_module.php";
727    // コピーライト
728    $arrSend['copy_right'] = $arrOtherParam['copy_right'];
729    // 自由メモ欄
730    $arrSend['free_memo'] = $arrOtherParam['free_memo'];
731    // 支払期間(0DDhhmm)
732    $arrSend['asp_payment_term'] = sprintf("0%02d0000", $arrOtherParam['asp_payment_term']);
733
734    // 電文の送付
735    foreach($arrSend as $key => $val) {
736        // Shift-JISにエンコードする必要あり
737        $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE);
738        $p->reqPut($key, $enc_val);
739    }
740    $p->post();
741    // 応答を処理
742    $arrRet = sfPaygentResponse(PAYGENT_BANK, $p, $uniqid, $arrInput);
743
744    return $arrRet;
745}
746
747/**
748 * 関数名:sfSendPaygentCareer
749 * 処理内容:キャリア決済情報の送信
750 * 戻り値:取得結果
751 */
752function sfSendPaygentCareer($arrData, $arrInput, $uniqid) {
753    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
754    $p = new PaygentB2BModule();
755    $p->init();
756
757    // キャリア用パラメータの取得
758    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE, "AND memo03 = '". PAY_PAYGENT_CAREER . "'");
759    $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']);
760
761    // 共通データの取得
762    $arrSend = sfGetPaygentShare(PAYGENT_CAREER, $arrData['order_id'], $arrPaymentDB[0]);
763
764    // 端末IDを取得
765    $MobileUserAgent = new SC_MobileUserAgent();
766
767    /** 個別電文 **/
768    // キャリア種別
769    $arrSend['career_type'] = $arrInput['career_type'];
770    // 決済金額
771    $arrSend['amount'] = $arrData['payment_total'];
772    // UID
773    $arrSend['uid'] = $_SERVER['HTTP_X_JPHONE_UID'];
774    // オーソリ通知URL
775    $arrSend['return_url'] = SC_Helper_Mobile::gfAddSessionId(MOBILE_URL_SHOP_MODULE);
776    // キャンセル通知URL
777    $arrSend['cancel_url'] = SC_Helper_Mobile::gfAddSessionId(MOBILE_URL_CART_TOP);
778    // 他決済用URL
779    if($arrInput['career_type'] == 1) {
780        $arrSend['other_url'] = SC_Helper_Mobile::gfAddSessionId(MOBILE_URL_CART_TOP);
781    }
782
783    // 電文の送付
784    foreach($arrSend as $key => $val) {
785        // Shift-JISにエンコードする必要あり
786        $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE);
787        $p->reqPut($key, $enc_val);
788    }
789    $p->post();
790    // 応答を処理
791    $arrRet = sfPaygentResponse(PAYGENT_CAREER, $p, $uniqid, $arrInput);
792
793    return $arrRet;
794}
795
796/**
797 * 関数名:sfPaygentResponse
798 * 処理内容:応答を処理する
799 * 戻り値:取得結果
800 */
801function sfPaygentResponse($telegram_kind, $objPaygent, $uniqid, $arrInput) {
802    global $arrConvenience;
803    global $arrInitStatus;
804
805    // 処理結果取得(共通)
806    $resultStatus = $objPaygent->getResultStatus(); # 処理結果 0=正常終了, 1=異常終了
807    $responseCode = $objPaygent->getResponseCode(); # 異常終了時、レスポンスコードが取得できる
808    $responseDetail = $objPaygent->getResponseDetail(); # 異常終了時、レスポンス詳細が取得できる
809    $responseDetail = mb_convert_encoding($responseDetail, CHAR_CODE, "Shift-JIS");
810
811    // 取得した値をログに保存する。
812    if ($resultStatus == 1) {
813        $arrResOther['result'] = $resultStatus;
814        $arrResOther['code'] = $responseCode;
815        $arrResOther['detail'] = $responseDetail;
816        foreach($arrResOther as $key => $val) {
817            GC_Utils::gfPrintLog($key."->".$val, PAYGENT_LOG_PATH);
818        }
819    }
820
821    // レスポンスの取得
822    while($objPaygent->hasResNext()) {
823        # データが存在する限り、取得
824        $arrRes[] = $objPaygent->resNext(); # 要求結果取得
825    }
826
827    // 決済毎に異なる処理
828    switch($telegram_kind) {
829    // クレジット決済の場合
830    case PAYGENT_CREDIT:
831        // 初期ステータスを設定する。
832        $arrVal["status"] = $arrInitStatus[PAYGENT_CREDIT];
833        // 空の配列を格納しておく
834        $arrVal["memo02"] = serialize(array());
835        break;
836    // コンビニ(番号方式)決済の場合
837    case PAYGENT_CONVENI_NUM:
838        // タイトルを設定する
839        $arrMemo['title'] = sfSetConvMSG("コンビニお支払", true);
840        // 決済ベンダ受付番号(コンビニによって名称が異なる)
841        switch ($arrInput['cvs_company_id']) {
842        // セブンイレブン
843        case CODE_SEVENELEVEN:
844            $receipt_num_name = "払込票番号";
845            break;
846        // ローソン,ファミリーマート
847        case CODE_LOWSON:
848        case CODE_FAMILYMART:
849            $receipt_num_name = "お客様番号";
850            break;
851        // ミニストップ,サンクス,サークルK,デイリーヤマザキ
852        case CODE_MINISTOP:
853        case CODE_SUNKUS:
854        case CODE_CIRCLEK:
855        case CODE_YAMAZAKI:
856            $receipt_num_name = "ケータイ/オンライン決済番号";
857            break;
858        // セイコーマート
859        case CODE_SEICOMART:
860            $receipt_num_name = "お客様の受付番号";
861            break;
862        default:
863            break;
864        }
865        $arrMemo['receipt_number'] = sfSetConvMSG($receipt_num_name, $arrRes[0]['receipt_number']);
866        // 払込票URL(PC) : セブンイレブンの場合のみ払込票URLが有効なので表示する。
867        if($arrInput['cvs_company_id'] == CODE_SEVENELEVEN && !SC_MobileUserAgent::isMobile()) {
868            $arrMemo['receipt_print_url'] = sfSetConvMSG("払込票URL", $arrRes[0]['receipt_print_url']);
869        }
870        // 確認番号 : ローソン,ファミリーマートのみ確認番号が必要なので表示する。
871        if ($arrInput['cvs_company_id'] == CODE_LOWSON || $arrInput['cvs_company_id'] == CODE_FAMILYMART) {
872            $arrMemo['confirm_number'] = sfSetConvMSG("確認番号", "400008");
873        }
874        // 対象コンビニ
875        $arrCVS = split("-", $arrRes[0]['usable_cvs_company_id']);
876        foreach($arrCVS as $val) {
877            if($cvsLine != "") {
878                $cvsLine.= ",".$arrConvenience[$val];
879            } else {
880                $cvsLine = $arrConvenience[$val];
881            }
882        }
883        $arrMemo['usable_cvs_company_id'] = sfSetConvMSG("お支払可能なコンビニ", $cvsLine);
884        // 支払期日
885        $arrMemo['payment_limit_date'] = sfSetConvMSG("お支払期日", date("Y年m月d日", strtotime($arrRes[0]['payment_limit_date'])));
886        // ヘルプ画面
887        if (SC_MobileUserAgent::isMobile()) {
888            $arrMemo['help_url'] = sfSetConvMSG("お支払方法の説明", "http://www.paygent.co.jp/mb/pay_help/conv.html");
889        } else {
890            $arrMemo['help_url'] = sfSetConvMSG("お支払方法の説明", "http://www.paygent.co.jp/merchant_info/help/shophelp_cvs.html");
891        }
892        // 受注テーブルに保存
893        $arrVal["memo02"] = serialize($arrMemo);
894        // 初期ステータスを設定する。
895        $arrVal["status"] = $arrInitStatus[PAYGENT_CONVENI_NUM];
896        break;
897    // コンビニ(払込票方式)決済の場合
898    case PAYGENT_CONVENI_CALL:
899        // 初期ステータスを設定する。
900        $arrVal["status"] = $arrInitStatus[PAYGENT_CONVENI_CALL];
901        break;
902    // ATM決済の場合
903    case PAYGENT_ATM:
904        // タイトルを設定する
905        $arrMemo['title'] = sfSetConvMSG("ATMお支払", true);
906        $arrMemo['pay_center_number'] = sfSetConvMSG("収納機関番号", $arrRes[0]['pay_center_number']);
907        $arrMemo['customer_number'] = sfSetConvMSG("お客様番号", $arrRes[0]['customer_number']);
908        $arrMemo['conf_number'] = sfSetConvMSG("確認番号", $arrRes[0]['conf_number']);
909        // 支払期日
910        $arrMemo['payment_limit_date'] = sfSetConvMSG("お支払期日", date("Y年m月d日", strtotime($arrRes[0]['payment_limit_date'])));
911        // ヘルプ画面
912        if (SC_MobileUserAgent::isMobile()) {
913            $arrMemo['help_url'] = sfSetConvMSG("お支払方法の説明", "http://www.paygent.co.jp/mb/pay_help/atm.html");
914        } else {
915            $arrMemo['help_url'] = sfSetConvMSG("お支払方法の説明", "http://www.paygent.co.jp/merchant_info/help/shophelp_atm.html");
916        }
917        // 受注テーブルに保存
918        $arrVal["memo02"] = serialize($arrMemo);
919        // 初期ステータスを設定する。
920        $arrVal["status"] = $arrInitStatus[PAYGENT_ATM];
921        break;
922    // 銀行ネットの場合
923    case PAYGENT_BANK:
924        // 初期ステータスを設定する。
925        $arrVal["status"] = $arrInitStatus[PAYGENT_BANK];
926        // 空の配列を格納しておく
927        $arrVal["memo02"] = serialize(array());
928        break;
929    // キャリア決済の場合
930    case PAYGENT_CAREER:
931        // 支払画面フォームをデコード
932        if (isset($arrRes[0]['redirect_html'])) {
933            $arrRes[0]['redirect_html'] = mb_convert_encoding($arrRes[0]['redirect_html'], CHAR_CODE, "Shift-JIS");
934        }
935        // 初期ステータスを設定する。
936        $arrVal["status"] = $arrInitStatus[PAYGENT_CAREER];
937        break;
938    default:
939        break;
940    }
941
942    // 受注テーブルに記録する
943    $arrVal["memo01"] = MDL_PAYGENT_CODE;       // 処理結果
944
945    // memo02は、支払情報を格納
946    $arrVal["memo03"] = $resultStatus;      // 処理結果
947    $arrVal["memo04"] = $responseCode;      // レスポンスコード
948    $arrVal["memo05"] = $responseDetail;    // エラーメッセージ
949    $arrVal["memo06"] = $arrRes[0]['payment_id'];       // 承認番号
950    $arrVal["memo07"] = "";                 // ステータス取得で使用
951
952    // キャリアの場合はキャリアタイプ(1:docomo,2:au,3:softbank)を$telegram_kindに追記
953    if(strlen($arrInput['career_type']) > 0) {
954        $arrVal["memo08"] = $telegram_kind . "_" . $arrInput['career_type'];
955    }else {
956        $arrVal["memo08"] = $telegram_kind;
957    }
958
959    $arrVal["memo09"] = "";                 // カード、キャリア決済連携で使用
960    $arrVal["memo10"] = "";                 // 再取得用のnotice_idを保存しておく
961
962    // 受注一時テーブルに更新
963    SC_Helper_DB::sfRegistTempOrder($uniqid, $arrVal);
964
965    // 結果とメッセージを返却
966    $arrRes[0]['result'] = $resultStatus;
967    if (preg_match('/^[P|E]/', $responseCode) <= 0) {
968        $arrRes[0]['response'] = "<br />". $responseDetail. "(". $responseCode. ")";
969    } elseif (strlen($responseCode) > 0) {
970        $arrRes[0]['response'] = "(". $responseCode. ")";
971    } else {
972        $arrRes[0]['response'] = "";
973    }
974    return $arrRes[0];
975}
976
977/**
978 * 関数名:sfPaygentResponseCard
979 * 処理内容:応答を処理する
980 * 戻り値:取得結果
981 */
982function sfPaygentResponseCard($telegram_kind, $objPaygent, $customer_id) {
983    $objQuery = new SC_Query();
984
985    // 処理結果取得(共通)
986    $resultStatus = $objPaygent->getResultStatus(); # 処理結果 0=正常終了, 1=異常終了
987    $responseCode = $objPaygent->getResponseCode(); # 異常終了時、レスポンスコードが取得できる
988    $responseDetail = $objPaygent->getResponseDetail(); # 異常終了時、レスポンス詳細が取得できる
989    $responseDetail = mb_convert_encoding($responseDetail, CHAR_CODE, "Shift-JIS");
990
991    // 異常終了
992    if ($resultStatus == 1) {
993        $arrResOther['result'] = $resultStatus;
994        $arrResOther['code'] = $responseCode;
995        $arrResOther['detail'] = $responseDetail;
996        foreach($arrResOther as $key => $val) {
997            GC_Utils::gfPrintLog($key."->".$val, PAYGENT_LOG_PATH);
998        }
999
1000    // 正常終了
1001    } else {
1002        // レスポンスの取得
1003        $arrRes[0]['result'] = $resultStatus;
1004        while($objPaygent->hasResNext()) {
1005            // データが存在する限り取得
1006            $arrRes[] = $objPaygent->resNext(); # 要求結果取得
1007        }
1008        $num_card = (isset($arrRes[1]['num_of_cards'])) ? $arrRes[1]['num_of_cards'] : "0";
1009        switch($telegram_kind) {
1010        // カード情報設定
1011        case PAYGENT_CARD_STOCK_SET:
1012            if ($num_card > 0) {
1013                $objQuery->update("dtb_customer", array("paygent_card" => 1), "customer_id = ?", array($customer_id));
1014            }
1015            break;
1016        // カード情報削除
1017        case PAYGENT_CARD_STOCK_DEL:
1018            if ($num_card <= 0) {
1019                $objQuery->update("dtb_customer", array("paygent_card" => 0), "customer_id = ?", array($customer_id));
1020            }
1021            break;
1022        default:
1023            break;
1024        }
1025    }
1026
1027    // 結果とメッセージを返却
1028    if (preg_match('/^[P|E]/', $responseCode) <= 0) {
1029        $arrRes[0]['response'] = "<br />". $responseDetail. "(". $responseCode. ")";
1030    } else {
1031        $arrRes[0]['response'] = "(". $responseCode. ")";
1032    }
1033    return $arrRes;
1034}
1035
1036/**
1037 * 関数名:sfSetConvMSG
1038 * 処理内容:コンビニ情報表示用
1039 * 戻り値:取得結果
1040 */
1041function sfSetConvMSG($name, $value){
1042    return array("name" => $name, "value" => $value);
1043}
1044
1045/**
1046 * 関数名:sfGetPaymentDB
1047 * 処理内容:必要なデータを取得する。
1048 * 戻り値:取得結果
1049 */
1050function sfGetPaymentDB($module_code, $where = "", $arrWhereVal = array()){
1051    $objQuery = new SC_Query();
1052
1053    $arrVal = array($module_code);
1054    $arrVal = array_merge($arrVal, $arrWhereVal);
1055
1056    $arrRet = array();
1057    $sql = "SELECT
1058                module_code,
1059                memo01 as merchant_id,
1060                memo02 as connect_id,
1061                memo03 as payment,
1062                memo04 as connect_password,
1063                memo05 as other_param
1064            FROM dtb_payment WHERE module_code = ? AND del_flg = 0 ". $where;
1065    $arrRet = $objQuery->getall($sql, $arrVal);
1066    return $arrRet;
1067}
1068
1069/**
1070 * 関数名:sfGetPaymentStatus
1071 * 処理内容:入金ステータス差分照会(差分照会では変更のあったものだけ取得するためorder_idは不要)
1072 * 戻り値:取得結果
1073 */
1074function sfGetPaymentStatus($objPaygent, $arrSend, $notice_id = "") {
1075    // 既に取得した差分を取得
1076    if($notice_id !== "") {
1077        $arrSend['payment_notice_id'] = $notice_id;
1078    }
1079
1080    // 電文の送付
1081    foreach($arrSend as $key => $val) {
1082        $objPaygent->reqPut($key, $val);
1083    }
1084    $objPaygent->post();
1085
1086    // レスポンスの取得
1087    while($objPaygent->hasResNext()) {
1088        # データが存在する限り、取得
1089        $arrRes[] = $objPaygent->resNext(); # 要求結果取得
1090    }
1091    $arrRes[0]['result'] = $objPaygent->getResultStatus(); # 処理結果 0=正常終了, 1=異常終了
1092
1093    foreach($arrRes[0] as $key => $val) {
1094        // Shift-JISで応答があるので、エンコードする。
1095        $arrRes[0][$key] = mb_convert_encoding($val, CHAR_CODE, "Shift-JIS");
1096        if ($arrRes[0]['result'] == 1) {
1097            GC_Utils::gfPrintLog($key."->".$arrRes[0][$key], PAYGENT_LOG_PATH);
1098        }
1099    }
1100
1101    return $arrRes[0];
1102}
1103
1104/**
1105 * 関数名:sfUpdatePaygentOrder($objQuery, $arrRet, $arrConfig)
1106 * 処理内容:支払ステータス更新
1107 * 戻り値:取得結果
1108 */
1109function sfUpdatePaygentOrder($objQuery, $arrRet, $arrConfig) {
1110    /*
1111     * 12:支払期限切
1112     * 20:オーソリOK
1113     * 21:オーソリ完了
1114     * 32:オーソリ取消済
1115     * 33:オーソリ期限切
1116     * 40:消込済
1117     * 43:速報検知済
1118     * 60:売上取消済
1119     * 61:速報取消済
1120     * etc
1121     */
1122
1123    if($arrRet['trading_id'] != "") {
1124        // 入金済みに変更
1125        if ($arrRet['payment_status'] == '40' || $arrRet['payment_status'] == '43') {
1126            $arrVal['status'] = ORDER_PRE_END;
1127        // 入金待ちに変更
1128        } elseif ($arrRet['payment_status'] == '20' || $arrRet['payment_status'] == '21') {
1129            // 決済種別CDが携帯キャリアの場合だけ受注処理を上げる
1130            if ($arrRet['payment_type'] == PAYMENT_TYPE_CAREER) {
1131                $arrVal['status'] = ORDER_PAY_WAIT;
1132                sfCompleteOrder($arrRet);
1133            // 混合型選択時のみ
1134            } elseif ($arrConfig['settlement_division'] == SETTLEMENT_MIX) {
1135                $arrVal['status'] = ORDER_PAY_WAIT;
1136            }
1137        // キャンセルに変更
1138        } elseif ($arrRet['payment_status'] == '12' || $arrRet['payment_status'] == '32' || $arrRet['payment_status'] == '33' || $arrRet['payment_status'] == '60' ||  $arrRet['payment_status'] == '61') {
1139            $arrVal['status'] = ORDER_CANCEL;
1140        }
1141
1142        // 取得ステータスを記憶する。
1143        $arrVal['memo07'] = $arrRet['payment_status'];
1144        // 再度照会する場合に使用する。
1145        $arrVal['memo10'] = $arrRet['payment_notice_id'];
1146
1147        // 混合型かつ初回照会時, 銀行ネット決済時は,
1148        // payment_id を保持しないので, payment_id を空にして更新対象に含める
1149        if ($arrConfig['settlement_division'] == SETTLEMENT_MIX
1150            || $arrRet['payment_type'] == '05') {
1151            $resultMemo06 = $objQuery->getOne("SELECT memo06 FROM dtb_order WHERE order_id = ?" , array($arrRet['trading_id']));
1152            if (empty($resultMemo06)) {
1153                $arrVal['memo06'] = $arrRet['payment_id'];
1154                unset($arrRet['payment_id']);
1155            }
1156        }
1157
1158        // 決済IDが存在する場合は, 決済IDを WHERE に加える
1159        if ($arrRet['payment_id'] != '') {
1160            $objQuery->update("dtb_order", $arrVal, "order_id = ? AND memo06 = ?", array($arrRet['trading_id'], $arrRet['payment_id']));
1161        } else {
1162            $objQuery->update("dtb_order", $arrVal, "order_id = ?", array($arrRet['trading_id']));
1163        }
1164    }
1165}
1166
1167/**
1168 * 関数名:sfPaygentOrder($paygent_type)
1169 * 処理内容:受注連携
1170 * 戻り値:取得結果
1171 */
1172function sfPaygentOrder($paygent_type, $order_id) {
1173    global $arrDispKind;
1174
1175    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
1176    $objPaygent = new PaygentB2BModule();
1177    $objPaygent->init();
1178
1179    // 設定パラメータの取得
1180    $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_CODE);
1181
1182    $objQuery = new SC_Query();
1183
1184    // 処理分岐
1185    switch($paygent_type) {
1186    case 'auth_cancel':
1187        $kind = PAYGENT_AUTH_CANCEL;
1188        break;
1189    case 'card_commit':
1190        // 売上補正がされているか、また売上補正にエラーがないか確認
1191        $arrTelegram = sfCheckCardRevice($objQuery, $order_id);
1192        // エラーがない場合は電文送信IDを送る
1193        if (strlen($arrTelegram['error']) == 0) {
1194            $kind = $arrTelegram[0];
1195        // 電文通信IDが得られなかった場合はエラーなので、エラーを返す
1196        } else {
1197            $arrReturn['revice_price_error'] = $arrTelegram['error'];
1198        }
1199        break;
1200    case 'card_commit_cancel':
1201        $kind = PAYGENT_CARD_COMMIT_CANCEL;
1202        break;
1203    case 'career_commit':
1204        // 売上補正がされているか、また売上補正にエラーがないか確認
1205        $arrTelegram = sfCheckRevice($objQuery, $order_id);
1206        // エラーがない場合は電文送信IDを送る
1207        if (strlen($arrTelegram['error']) == 0) {
1208            $kind = $arrTelegram[0];
1209        // 電文通信IDが得られなかった場合はエラーなので、エラーを返す
1210        } else {
1211            $arrReturn['revice_price_error'] = $arrTelegram['error'];
1212        }
1213        break;
1214    case 'career_commit_cancel':
1215        $kind = PAYGENT_CAREER_COMMIT_CANCEL;
1216        break;
1217    }
1218
1219    if(count($arrReturn) === 0) {
1220        // 決済IDの取得
1221        $payment_id = $objQuery->get("dtb_order", "memo06", "order_id = ?", array($order_id));
1222        // 共通データの取得
1223        $arrSend = sfGetPaygentShare($kind, $order_id, $arrPaymentDB[0], $payment_id);
1224        // $arrSendに個別詳細情報を付け加える
1225        $arrSend = sfAddDetailToSend($arrSend, $arrTelegram, $kind);
1226
1227        // 電文の送付
1228        foreach($arrSend as $key => $val) {
1229            $objPaygent->reqPut($key, $val);
1230        }
1231        $objPaygent->post();
1232
1233        // レスポンスの取得
1234        while($objPaygent->hasResNext()) {
1235            # データが存在する限り、取得
1236            $arrRes[] = $objPaygent->resNext(); # 要求結果取得
1237        }
1238        $arrRes[0]['result'] = $objPaygent->getResultStatus(); # 処理結果 0=正常終了, 1=異常終了
1239
1240        foreach($arrRes[0] as $key => $val) {
1241            // Shift-JISで応答があるので、エンコードする。
1242            $arrRes[0][$key] = mb_convert_encoding($val, CHAR_CODE, "Shift-JIS");
1243            if ($arrRes[0]['result'] == 1) {
1244                GC_Utils::gfPrintLog($key."->".$arrRes[0][$key], PAYGENT_LOG_PATH);
1245            }
1246        }
1247
1248        // 正常終了
1249        if($arrRes[0]['result'] === '0') {
1250            $objQuery = new SC_Query();
1251            $arrVal['memo09'] = $kind;
1252            $arrVal['memo06'] = $arrRes[0]['payment_id'];
1253
1254            $objQuery->update("dtb_order", $arrVal, "order_id = ?", array($order_id));
1255            $arrReturn['return'] = true;
1256        } else {
1257            $arrReturn['return'] = false;
1258            $responseCode = $objPaygent->getResponseCode(); # 異常終了時、レスポンスコードが取得できる
1259            $responseDetail = $objPaygent->getResponseDetail(); # 異常終了時、レスポンス詳細が取得できる
1260            $responseDetail = mb_convert_encoding($responseDetail, CHAR_CODE, "Shift-JIS");
1261            if (preg_match('/^[P|E]/', $responseCode) <= 0) {
1262                $arrReturn['response'] = $responseDetail. "(". $responseCode. ")";
1263            } elseif (strlen($responseCode) > 0) {
1264                $arrReturn['response'] = "(". $responseCode. ")";
1265            } else {
1266                $arrReturn['response'] = "";
1267            }
1268        }
1269        $arrReturn['kind'] = $kind;
1270    }
1271    return $arrReturn;
1272}
1273
1274/**
1275 * 携帯キャリアの売上補正されているかどうか確認し、電文通信IDを返す
1276 * @param $objQuery
1277 * @param $order_id 受注ID
1278 * @return $arrId 電文通信ID(103の場合は補正金額も)、エラーならNULL
1279 */
1280function sfCheckRevice($objQuery, $order_id) {
1281    $col = "T1.payment_total AS latest_price,T2.payment_total AS standard_price, T1.memo08 AS status_id, T1.memo07 AS telegram_kind";
1282    $from = "dtb_order AS T1 left join dtb_order_temp AS T2 ON T1.order_temp_id = T2.order_temp_id";
1283    $where = "T1.order_id = ?";
1284    $arrRet = $objQuery->select($col, $from, $where, array($order_id));
1285    $latest_price = $arrRet[0]['latest_price'];
1286    $standard_price = $arrRet[0]['standard_price'];
1287    $status_id = $arrRet[0]['status_id'];
1288    $telegram_kind = $arrRet[0]['telegram_kind'];
1289
1290    // 金額が補正されているかのチェック
1291    if($latest_price != $standard_price) {
1292        // 元の金額より補正額が小さければ電文種別ID103を返す(ただし、softbankの場合は補正不可)
1293        if($latest_price < $standard_price && $status_id != '100_3') {
1294            $arrTelegram = array(PAYGENT_CAREER_COMMIT_REVICE, $latest_price);
1295            return $arrTelegram;
1296        // softbankは売上補正ができないのでエラーを返す
1297        }elseif($status_id == '100_3') {
1298            $arrTelegram['error'] = 'softbankは補正売上処理はできません。';
1299            return $arrTelegram;
1300        // 元の金額より補正額が高ければエラーを返す
1301        }
1302        else {
1303            $arrTelegram['error'] = '補正金額が元の金額より低くないと補正売上処理はできません。';
1304            return $arrTelegram;
1305        }
1306    }else {
1307        // 補正金額が変更されていない、かつ消込完了になっている場合はエラーを返す
1308        if($telegram_kind == '44') {
1309            $arrTelegram['error'] = '売上処理はできません。補正売上処理のみ可能です。';
1310            return $arrTelegram;
1311        }
1312    }
1313    // 補正されていない場合、または補正後の金額が同じ場合は、電文種別ID100を返す
1314    $arrTelegram = array(PAYGENT_CAREER_COMMIT);
1315    return $arrTelegram;
1316}
1317
1318/**
1319 * カード決済の売上補正されているかどうか確認し、電文通信IDを返す
1320 * @param $objQuery
1321 * @param $order_id 受注ID
1322 * @return $arrId 電文通信ID(029の場合は補正金額も)、エラーならNULL
1323 */
1324function sfCheckCardRevice($objQuery, $order_id) {
1325    $col = "T1.payment_total AS latest_price,T2.payment_total AS standard_price, T1.memo08 AS status_id, T1.memo07 AS telegram_kind";
1326    $from = "dtb_order AS T1 left join dtb_order_temp AS T2 ON T1.order_temp_id = T2.order_temp_id";
1327    $where = "T1.order_id = ?";
1328    $arrRet = $objQuery->select($col, $from, $where, array($order_id));
1329    $latest_price = $arrRet[0]['latest_price'];
1330    $standard_price = $arrRet[0]['standard_price'];
1331    $status_id = $arrRet[0]['status_id'];
1332    $telegram_kind = $arrRet[0]['telegram_kind'];
1333
1334    // 金額が補正されていれば電文通信IDと補正金額を返す
1335    if($latest_price != $standard_price) {
1336
1337        // 3Dセキュア使用時はエラー
1338        if ($status_id == '024') {
1339            $arrTelegram['error'] = '3Dセキュア使用時は補正売上処理はできません。';
1340            return $arrTelegram;
1341        }
1342
1343        $arrTelegram = array(PAYGENT_CARD_COMMIT_REVICE, $latest_price);
1344        return $arrTelegram;
1345    }else {
1346        // 補正金額が変更されていない、かつ消込完了になっている場合はエラーを返す
1347        if($telegram_kind == '40') {
1348            $arrTelegram['error'] = '売上処理はできません。補正売上処理のみ可能です。';
1349            return $arrTelegram;
1350        }
1351    }
1352    // 補正されていない場合、または補正後の金額が同じ場合は、電文種別ID022を返す
1353    $arrTelegram = array(PAYGENT_CARD_COMMIT);
1354    return $arrTelegram;
1355}
1356
1357
1358/**
1359 * キャリア決済の受注情報を上げる
1360 */
1361function sfCompleteOrder($arrRet) {
1362    // 受注一時情報の取得
1363    $objQuery = new SC_Query;
1364    $table = "dtb_order_temp";
1365    $where = "memo01 = ? AND memo06 = ? AND order_id = ?";
1366    $arrOrderTemp = $objQuery->select("*", $table, $where, array(MDL_PAYGENT_CODE, $arrRet['payment_id'], $arrRet['trading_id']));
1367    $uniqid = $arrOrderTemp[0]['order_temp_id'];
1368
1369    // 受注一時情報が無ければエラーログ
1370    if(count($arrOrderTemp) <= 0) {
1371        GC_Utils::gfPrintLog("order_id=" . $arrRet['trading_id'] . "", PAYGENT_LOG_PATH);
1372        return;
1373    }
1374
1375    /*
1376     * 既に受注済みかチェック
1377     * オーソリOK(20), オーソリ完了(21)など, 連続してステータスを受信することがあるため
1378     */
1379    $arrOrder = $objQuery->select("*", "dtb_order", "memo01 = ? AND order_id = ?", array(MDL_PAYGENT_CODE, $arrRet['trading_id']));
1380
1381    // 既に受注済みの場合は終了
1382    if (!empty($arrOrder)) {
1383        GC_Utils::gfPrintLog("Order Exists by order_id=" . $arrRet['trading_id'] . "", PAYGENT_LOG_PATH);
1384        return;
1385    }
1386
1387
1388    if($arrOrderTemp[0]['del_flg'] == "0") {
1389        // セッションを復元
1390        SC_Utils_Ex::sfDomainSessionStart();
1391        $_SESSION = unserialize($arrOrderTemp[0]['session']);
1392
1393        // 受注処理
1394        require_once(CLASS_EX_PATH . "page_extends/shopping/LC_Page_Shopping_Complete_Ex.php");
1395        $completeShopping = new LC_Page_Shopping_Complete_Ex();
1396        $objView = new SC_SiteView();
1397        $objSiteInfo = $objView->objSiteInfo;
1398        $completeShopping->arrInfo = $objSiteInfo->data;
1399        $completeShopping->objCampaignSess = new SC_CampaignSession();
1400        $completeShopping->objCartSess = new SC_CartSession();
1401        $completeShopping->objSiteSess = new SC_SiteSession();
1402        $completeShopping->objCustomer = new SC_Customer();
1403        $objQuery->begin();
1404        $order_id = $completeShopping->lfDoComplete($objQuery, $uniqid);
1405        $objQuery->commit();
1406
1407        // セッションに保管されている情報を更新
1408        $completeShopping->objCustomer->updateSession();
1409
1410        // 完了メール送信
1411        if($order_id != "") {
1412            $mailHelper = new SC_Helper_Mail_Ex();
1413            $mobileHelper = new SC_Helper_Mobile_Ex();
1414            if ($mobileHelper->gfIsMobileMailAddress($arrOrderTemp[0]['order_email']) === true) {
1415                // 携帯
1416                $mailHelper->sfSendOrderMail($order_id, '2');
1417            }else {
1418                // PC
1419                $mailHelper->sfSendOrderMail($order_id, '1');
1420            }
1421        }
1422    }
1423}
1424
1425/**
1426 * 関数名:sfPaygentTest
1427 * 処理内容:接続テスト
1428 * 戻り値:取得結果
1429 */
1430function sfPaygentTest($arrParam) {
1431    $objQuery = new SC_Query();
1432
1433    // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化
1434    $objPaygent = new PaygentB2BModule();
1435    $objPaygent->init();
1436
1437    // 共通データの取得
1438    $arrSend = sfGetPaygentShare(PAYGENT_REF, '0', $arrParam);
1439
1440    // 電文の送付
1441    foreach($arrSend as $key => $val) {
1442        $objPaygent->reqPut($key, $val);
1443    }
1444    $objPaygent->post();
1445
1446    // 処理結果取得(共通)
1447    $resultStatus = $objPaygent->getResultStatus(); # 処理結果 0=正常終了, 1=異常終了
1448
1449    if($resultStatus === "0") {
1450        return true;
1451    } else {
1452        return false;
1453    }
1454}
1455
1456/**
1457 * 関数名:sfPaygentOrderPage($objPage)
1458 * 処理内容:表示用パラーメータを追加する。
1459 * 戻り値:取得結果
1460 */
1461function sfPaygentOrderPage() {
1462    global $arrDispKind;
1463    return $arrDispKind;
1464}
1465?>