ORDER_NEW, // クレジットは新規受付 PAYGENT_ATM => ORDER_PAY_WAIT, // ATM決済は入金待ち PAYGENT_CONVENI => ORDER_PAY_WAIT, // コンビニは入金待ち PAYGENT_BANK => ORDER_NEW, // 銀行は新規受付 ); define ("CHARGE_MAX", 500000); define ("SEVEN_CHARGE_MAX", 300000); // 電文バージョン define ("TELEGRAM_VERSION", '1.0'); //コンビニの種類 $arrConvenience = array( '00C016' => 'セイコーマート', '00C002' => 'ローソン', '00C004' => 'ミニストップ', '00C005' => 'ファミリーマート', '00C006' => 'サンクス', '00C007' => 'サークルK', '00C014' => 'デイリーヤマザキ', '00C001' => 'セブンイレブン' ); // ネットバンクの種類 $arrNetBank = array( 'D005' => 'e-payment', 'D008' => 'ネット振込EDI', 'D009' => 'One\'s ダイレクト', 'D033' => 'ジャパンネット銀行', 'D036' => 'イーバンク' ); // クレジット分割回数 $arrPaymentClass = array( '10' => '一括払い', '61-2' => '分割2回払い', '61-3' => '分割3回払い', '61-6' => '分割6回払い', '61-10' => '分割10回払い', '61-15' => '分割15回払い', '61-20' => '分割20回払い', '80' => 'リボ払い' ); /************************************************************************************************************** * 関数名 :sfGetPaygentShare * 処理内容 :ペイジェント情報送信の共通処理 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfGetPaygentShare($telegram_kind, $order_id, $arrParam) { /** 共通電文 **/ // マーチャントID $arrSend['merchant_id'] = $arrParam['merchant_id']; // 接続ID $arrSend['connect_id'] = $arrParam['connect_id']; // 接続パスワード $arrSend['connect_password'] = $arrParam['connect_password']; // 電文種別ID $arrSend['telegram_kind'] = $telegram_kind; // 電文バージョン $arrSend['telegram_version'] = TELEGRAM_VERSION; // マーチャント取引ID $arrSend['trading_id'] = $order_id; return $arrSend; } /************************************************************************************************************** * 関数名 :sfSendPaygentCredit * 処理内容 :クレジット情報の送信 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfSendPaygentCredit($arrData, $arrInput, $uniqid) { // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化 $p = new PaygentB2BModule(); $p->init(); // クレジット用パラメータの取得 $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_ID, "AND memo03 = 1"); $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']); // 共通データの取得 $arrSend = sfGetPaygentShare(PAYGENT_CREDIT, $arrData['order_id'], $arrPaymentDB[0]); /** 個別電文 **/ // 決済金額 $arrSend['payment_amount'] = $arrData['payment_total']; // カード番号 $arrSend['card_number'] = $arrInput['card_no01'].$arrInput['card_no02'].$arrInput['card_no03'].$arrInput['card_no04']; // カード有効期限(MMYY) $arrSend['card_valid_term'] = $arrInput['card_month'].$arrInput['card_year']; // 支払い区分、分割回数の取得 list($payment_class, $split_count) = split("-", $arrInput['payment_class']); // 支払い区分 /* * 10:1回 * 23:ボーナス1回 * 61:分割 * 80:リボルビング */ $arrSend['payment_class'] = $payment_class; // 分割回数 $arrSend['split_count'] = $split_count; // 3Dセキュア扶養区分 $arrSend['3dsecure_ryaku'] = '1'; // 電文の送付 foreach($arrSend as $key => $val) { $p->reqPut($key, $val); } // 電文の送信 $p->post(); // 応答を処理 $arrRet = sfPaygentResponse(PAYGENT_CREDIT, $p, $uniqid); return $arrRet; } /************************************************************************************************************** * 関数名 :sfSendPaygentConveni * 処理内容 :コンビニ情報の送信 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfSendPaygentConveni($arrData, $arrInput, $uniqid) { // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化 $p = new PaygentB2BModule(); $p->init(); // コンビニ用パラメータの取得 $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_ID, "AND memo03 = 2"); $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']); // 共通データの取得 $arrSend = sfGetPaygentShare(PAYGENT_CONVENI, $arrData['order_id'], $arrPaymentDB[0]); /** 個別電文 **/ // 決済金額 $arrSend['payment_amount'] = $arrData['payment_total']; // 利用者姓 $arrSend['customer_family_name'] = $arrInput['customer_family_name']; // 利用者名 $arrSend['customer_name'] = $arrInput['customer_name']; // 利用者姓半角カナ $arrSend['customer_family_name_kana'] = mb_convert_kana($arrInput['customer_family_name_kana'],'k'); // 利用者名半角カナ $arrSend['customer_name_kana'] = mb_convert_kana($arrInput['customer_name_kana'],'k'); // 利用者電話番号 $arrSend['customer_tel'] = $arrInput['customer_tel']; // 支払期限日 $arrSend['payment_limit_date'] = $arrOtherParam['payment_limit_date']; // コンビニ企業コード $arrSend['cvs_company_id'] = $arrInput['cvs_company_id']; // 支払種別 $arrSend['sales_type'] = '1'; // 電文の送付 foreach($arrSend as $key => $val) { // Shift-JISにエンコードする必要あり $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE); $p->reqPut($key, $enc_val); } // 電文の送信 $p->post(); // 応答を処理 $arrRet = sfPaygentResponse(PAYGENT_CONVENI, $p, $uniqid); return $arrRet; } /************************************************************************************************************** * 関数名 :sfSendPaygentATM * 処理内容 :ATM決済情報の送信 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfSendPaygentATM($arrData, $arrInput, $uniqid) { // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化 $p = new PaygentB2BModule(); $p->init(); // ATM決済用パラメータの取得 $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_ID, "AND memo03 = 3"); $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']); // 共通データの取得 $arrSend = sfGetPaygentShare(PAYGENT_ATM, $arrData['order_id'], $arrPaymentDB[0]); /** 個別電文 **/ // 決済金額 $arrSend['payment_amount'] = $arrData['payment_total']; // 利用者姓 $arrSend['customer_family_name'] = $arrInput['customer_family_name']; // 利用者名 $arrSend['customer_name'] = $arrInput['customer_name']; // 利用者姓半角カナ $arrSend['customer_family_name_kana'] = mb_convert_kana($arrInput['customer_family_name_kana'],'k'); // 利用者名半角カナ $arrSend['customer_name_kana'] = mb_convert_kana($arrInput['customer_name_kana'],'k'); // 決済内容 $arrSend['payment_detail'] = $arrOtherParam['payment_detail']; // 決済内容半角カナ $arrSend['payment_detail_kana'] = mb_convert_kana($arrOtherParam['payment_detail'],'k'); // 支払期限日 $arrSend['payment_limit_date'] = $arrOtherParam['payment_limit_date']; // 電文の送付 foreach($arrSend as $key => $val) { // Shift-JISにエンコードする必要あり $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE); $p->reqPut($key, $enc_val); } // 電文の送信 $p->post(); // 応答を処理 $arrRet = sfPaygentResponse(PAYGENT_ATM, $p, $uniqid); return $arrRet; } /************************************************************************************************************** * 関数名 :sfSendPaygentBANK * 処理内容 :銀行NET決済情報の送信 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfSendPaygentBANK($arrData, $arrInput, $uniqid) { // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化 $p = new PaygentB2BModule(); $p->init(); // 銀行NET用パラメータの取得 $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_ID, "AND memo03 = 4"); $arrOtherParam = unserialize($arrPaymentDB[0]['other_param']); // 共通データの取得 $arrSend = sfGetPaygentShare(PAYGENT_BANK, $arrData['order_id'], $arrPaymentDB[0]); /** 個別電文 **/ //$arrSend['bank_code'] = $arrInput['bank_code']; // 決済金額 $arrSend['amount'] = $arrData['payment_total']; // 請求内容カナ $arrSend['claim_kana'] = $arrOtherParam['claim_kana']; // 請求内容漢字 $arrSend['claim_kanji'] = $arrOtherParam['claim_kanji']; // 利用者姓 $arrSend['customer_family_name'] = $arrInput['customer_family_name']; // 利用者名 $arrSend['customer_name'] = $arrInput['customer_name']; // 利用者姓半角カナ $arrSend['customer_family_name_kana'] = mb_convert_kana($arrInput['customer_family_name_kana'],'k'); // 利用者名半角カナ $arrSend['customer_name_kana'] = mb_convert_kana($arrInput['customer_name_kana'],'k'); // PC-Mobile区分 /* * 0:PC * 1:docomo * 2:au * 3:softbank */ $arrSend['pc_mobile_type'] = '0'; // 店舗名 $arrSend['merchant_name'] = $arrOtherParam['claim_kanji']; // 完了後の戻りURL $arrSend['return_url'] = SSL_URL . "shopping/load_payment_module.php"; // 戻りボタンURL $arrSend['stop_return_url'] = SSL_URL . "shopping/load_payment_module.php"; // コピーライト $arrSend['copy_right'] = $arrOtherParam['copy_right']; // 自由メモ欄 $arrSend['free_memo'] = $arrOtherParam['free_memo']; // 支払期間(0DDhhmm) $arrSend['asp_payment_term'] = sprintf("0%02d0000", $arrOtherParam['asp_payment_term']); // 電文の送付 foreach($arrSend as $key => $val) { // Shift-JISにエンコードする必要あり $enc_val = mb_convert_encoding($val, "Shift-JIS", CHAR_CODE); $p->reqPut($key, $enc_val); } // 電文の送信 $p->post(); // 応答を処理 $arrRet = sfPaygentResponse(PAYGENT_BANK, $p, $uniqid); return $arrRet; } /************************************************************************************************************** * 関数名 :sfPaygentResponse * 処理内容 :応答を処理する * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfPaygentResponse($telegram_kind, $objPaygent, $uniqid) { global $arrConvenience; global $arrInitStatus; // 処理結果取得(共通) $resultStatus = $objPaygent->getResultStatus(); # 処理結果 0=正常終了, 1=異常終了 $responseCode = $objPaygent->getResponseCode(); # 異常終了時、レスポンスコードが取得できる $responseDetail = $objPaygent->getResponseDetail(); # 異常終了時、レスポンス詳細が取得できる // Shift-JISで応答があるので、エンコードする。 $responseDetail = mb_convert_encoding($responseDetail, CHAR_CODE, "Shift-JIS"); // レスポンスの取得 while($objPaygent->hasResNext()) { # データが存在する限り、取得 $arrRes[] = $objPaygent->resNext(); # 要求結果取得 } // 決済毎に異なる処理 switch($telegram_kind) { // クレジット決済の場合 case PAYGENT_CREDIT: // 初期ステータスを設定する。 $arrVal["status"] = $arrInitStatus[PAYGENT_CREDIT]; // 空の配列を格納しておく $arrVal["memo02"] = serialize(array()); break; // コンビニ決済の場合 case PAYGENT_CONVENI: // タイトルを設定する $arrMemo['title'] = sfSetConvMSG("コンビニお支払情報", true); //払込票URL(PC) if($arrRes[0]['receipt_print_url'] != "") { $arrMemo['receipt_print_url'] = sfSetConvMSG("払込票URL", $arrRes[0]['receipt_print_url']); } //払込票番号 $arrMemo['receipt_number'] = sfSetConvMSG("払込票番号", $arrRes[0]['receipt_number']); $arrCVS = split("-", $arrRes[0]['usable_cvs_company_id']); foreach($arrCVS as $val) { if($cvsLine != "") { $cvsLine.= ",".$arrConvenience[$val]; } else { $cvsLine = $arrConvenience[$val]; } } //対象コンビニ $arrMemo['usable_cvs_company_id'] = sfSetConvMSG("お支払可能なコンビニ", $cvsLine); // 支払期日 $arrMemo['payment_limit_date'] = sfSetConvMSG("お支払期日", date("Y年m月d日", strtotime($arrRes[0]['payment_limit_date']))); // 受注テーブルに保存 $arrVal["memo02"] = serialize($arrMemo); // 初期ステータスを設定する。 $arrVal["status"] = $arrInitStatus[PAYGENT_CONVENI]; break; // ATM決済の場合 case PAYGENT_ATM: // タイトルを設定する $arrMemo['title'] = sfSetConvMSG("ATMお支払情報", true); $arrMemo['pay_center_number'] = sfSetConvMSG("収納機関番号", $arrRes[0]['pay_center_number']); $arrMemo['customer_number'] = sfSetConvMSG("お客様番号", $arrRes[0]['customer_number']); $arrMemo['conf_number'] = sfSetConvMSG("確認番号", $arrRes[0]['pay_center_number']); // 支払期日 $arrMemo['payment_limit_date'] = sfSetConvMSG("お支払期日", date("Y年m月d日", strtotime($arrRes[0]['payment_limit_date']))); // 受注テーブルに保存 $arrVal["memo02"] = serialize($arrMemo); // 初期ステータスを設定する。 $arrVal["status"] = $arrInitStatus[PAYGENT_ATM]; break; // 銀行ネットの場合 case PAYGENT_BANK: // 初期ステータスを設定する。 $arrVal["status"] = $arrInitStatus[PAYGENT_BANK]; // 空の配列を格納しておく $arrVal["memo02"] = serialize(array()); break; default: break; } // 受注テーブルに記録する $arrVal["memo01"] = MDL_PAYGENT_ID; // 処理結果 // memo02は、支払情報を格納する。 $arrVal["memo03"] = $resultStatus; // 処理結果 $arrVal["memo04"] = $responseCode; // レスポンスコード $arrVal["memo05"] = $responseDetail; // エラーメッセージ $arrVal["memo06"] = $arrRes[0]['payment_id']; // 承認番号 // 受注一時テーブルに更新 sfRegistTempOrder($uniqid, $arrVal); // 承認番号とメッセージを返す return $arrRes[0]; } /************************************************************************************************************** * 関数名 :sfSetConvMSG * 処理内容 :コンビニ情報表示用 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfSetConvMSG($name, $value){ return array("name" => $name, "value" => $value); } /************************************************************************************************************** * 関数名 :sfPaygentDisp * 処理内容 :共通の表示処理 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfPaygentDisp($objPage, $payment_id) { $objQuery = new SC_Query(); // 支払い方法の説明画像を取得する。 $arrRet = $objQuery->select("payment_method, payment_image", "dtb_payment", "payment_id = ?", array($payment_id)); $objPage->tpl_payment_method = $arrRet[0]['payment_method']; $objPage->tpl_payment_image = $arrRet[0]['payment_image']; return $objPage; } /************************************************************************************************************** * 関数名 :sfGetPaymentDB * 処理内容 :必要なデータを取得する。 * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfGetPaymentDB($module_id, $where = "", $arrWhereVal = array()){ $objQuery = new SC_Query(); $arrVal = array($module_id); $arrVal = array_merge($arrVal, $arrWhereVal); $arrRet = array(); $sql = "SELECT module_id, memo01 as merchant_id, memo02 as connect_id, memo03 as payment, memo04 as connect_password, memo05 as other_param FROM dtb_payment WHERE module_id = ? " . $where; $arrRet = $objQuery->getall($sql, $arrVal); return $arrRet; } /************************************************************************************************************** * 関数名 :sfPaygentBatch * 処理内容 :入金ステータス確認バッチ * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfPaygentBatch() { $objQuery = new SC_Query(); // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化 $objPaygent = new PaygentB2BModule(); $objPaygent->init(); // 設定パラメータの取得 $arrPaymentDB = sfGetPaymentDB(MDL_PAYGENT_ID); $where = "memo01 = ? AND status = ?"; $arrOrder = $objQuery->select("order_id", "dtb_order", $where, array(MDL_PAYGENT_ID, ORDER_PAY_WAIT)); // 共通データの取得 $arrSend = sfGetPaygentShare(PAYGENT_REF, 0, $arrPaymentDB[0]); for($i = 0; $i < count($arrOrder); $i++) { $arrRet = sfUpdatePaymentStatus($objPaygent, $arrOrder[$i]['order_id'], $arrSend); } return $arrRet; } /************************************************************************************************************** * 関数名 :sfPaygentTest * 処理内容 :接続テスト * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfPaygentTest($arrParam) { $objQuery = new SC_Query(); // 接続モジュールのインスタンス取得 (コンストラクタ)と初期化 $objPaygent = new PaygentB2BModule(); $objPaygent->init(); // 共通データの取得 $arrSend = sfGetPaygentShare(PAYGENT_REF, '0', $arrParam); // 電文の送付 foreach($arrSend as $key => $val) { $objPaygent->reqPut($key, $val); } // 電文の送信 $objPaygent->post(); // 処理結果取得(共通) $resultStatus = $objPaygent->getResultStatus(); # 処理結果 0=正常終了, 1=異常終了 if($resultStatus == 0) { return true; } else { return false; } } /************************************************************************************************************** * 関数名 :sfCheckPaymentStatus * 処理内容 :入金ステータス確認バッチ * 引数1 : * 引数2 : * 引数3 : * 戻り値 :取得結果 **************************************************************************************************************/ function sfUpdatePaymentStatus($objPaygent, $order_id, $arrSend) { $objQuery = new SC_Query(); // マーチャント取引IDの入れ替え $arrSend['trading_id'] = $order_id; // 電文の送付 foreach($arrSend as $key => $val) { $objPaygent->reqPut($key, $val); } // 電文の送信 $objPaygent->post(); // レスポンスの取得 while($objPaygent->hasResNext()) { # データが存在する限り、取得 $arrRes[] = $objPaygent->resNext(); # 要求結果取得 } foreach($arrRes[0] as $key => $val) { // Shift-JISで応答があるので、エンコードする。 $arrRes[0][$key] = mb_convert_encoding($val, CHAR_CODE, "Shift-JIS"); } // 支払ステータスの更新 /* * 10:申込済 * 12:支払期限切れ * 15:申込中断 * 40:消込済 * 43:速報検知済 * 61:速報取消済 * etc */ if($arrRes[0][payment_status] == '40') { $arrVal['status'] = ORDER_PRE_END; } $arrVal['memo07'] = $arrRes[0][payment_status]; $objQuery->update("dtb_order", $arrVal, "order_id = ?", array($order_id)); return $arrRes[0]; } ?>