From 46ea2d03b5a86a032b6627e78e39f92a1da0b1b6 Mon Sep 17 00:00:00 2001 From: chym1217 Date: Tue, 16 Sep 2025 16:34:15 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=ED=86=A0=EC=8A=A4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EB=A8=BC=EC=B8=A0=20v2=20=EA=B2=B0=EC=A0=9C=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adm/css/admin.css | 3 +- adm/shop_admin/admin.shop.lib.php | 4 + adm/shop_admin/configform.php | 40 ++- adm/shop_admin/configformupdate.php | 6 +- adm/shop_admin/orderform.php | 10 +- adm/shop_admin/orderformcartupdate.php | 4 + adm/shop_admin/personalpayform.php | 2 + install/gnuboard5.sql | 2 + mobile/shop/orderform.sub.php | 63 +++- mobile/shop/orderformupdate.php | 28 ++ mobile/shop/orderinquiryview.php | 6 + mobile/shop/personalpayform.sub.php | 57 +++- mobile/shop/personalpayformupdate.php | 40 ++- mobile/shop/personalpayresult.php | 6 + mobile/shop/settle_toss.inc.php | 15 + mobile/shop/toss/_common.php | 6 + mobile/shop/toss/orderform.1.php | 33 ++ mobile/shop/toss/orderform.2.php | 37 +++ mobile/shop/toss/orderform.3.php | 3 + mobile/shop/toss/returnurl.php | 77 +++++ mobile/shop/toss/toss_approval.php | 192 +++++++++++ shop/orderform.sub.php | 93 +++++- shop/orderformupdate.php | 31 ++ shop/orderinquirycancel.php | 4 + shop/orderinquiryview.php | 6 + shop/personalpayform.sub.php | 87 ++++- shop/personalpayformupdate.php | 50 ++- shop/personalpayresult.php | 6 + shop/settle_toss.inc.php | 11 + shop/settle_toss_common.php | 422 +++++++++++++++++++++++++ shop/toss/_common.php | 2 + shop/toss/orderform.1.php | 111 +++++++ shop/toss/orderform.2.php | 31 ++ shop/toss/orderform.3.php | 16 + shop/toss/orderform.4.php | 3 + shop/toss/orderpartcancel.inc.php | 61 ++++ shop/toss/returnurl.php | 67 ++++ shop/toss/taxsave_form.php | 197 ++++++++++++ shop/toss/taxsave_result.php | 192 +++++++++++ shop/toss/toss.inc.php | 373 ++++++++++++++++++++++ shop/toss/toss_approval.php | 79 +++++ shop/toss/toss_cancel.php | 38 +++ shop/toss/toss_result.php | 108 +++++++ theme/basic/shop/orderinquiryview.php | 12 +- 44 files changed, 2614 insertions(+), 20 deletions(-) create mode 100644 mobile/shop/settle_toss.inc.php create mode 100644 mobile/shop/toss/_common.php create mode 100644 mobile/shop/toss/orderform.1.php create mode 100644 mobile/shop/toss/orderform.2.php create mode 100644 mobile/shop/toss/orderform.3.php create mode 100644 mobile/shop/toss/returnurl.php create mode 100644 mobile/shop/toss/toss_approval.php create mode 100644 shop/settle_toss.inc.php create mode 100644 shop/settle_toss_common.php create mode 100644 shop/toss/_common.php create mode 100644 shop/toss/orderform.1.php create mode 100644 shop/toss/orderform.2.php create mode 100644 shop/toss/orderform.3.php create mode 100644 shop/toss/orderform.4.php create mode 100644 shop/toss/orderpartcancel.inc.php create mode 100644 shop/toss/returnurl.php create mode 100644 shop/toss/taxsave_form.php create mode 100644 shop/toss/taxsave_result.php create mode 100644 shop/toss/toss.inc.php create mode 100644 shop/toss/toss_approval.php create mode 100644 shop/toss/toss_cancel.php create mode 100644 shop/toss/toss_result.php diff --git a/adm/css/admin.css b/adm/css/admin.css index 20802f756..6df934090 100644 --- a/adm/css/admin.css +++ b/adm/css/admin.css @@ -743,7 +743,7 @@ a.nicepay_btn{display:inline-block;margin:5px 0 0;padding:5px 10px;background:#0 ul.de_pg_tab{margin:0;padding:0;zoom:1} ul.de_pg_tab:after{display:block;visibility:hidden;clear:both;content:"";} -ul.de_pg_tab li{position:relative;display:inline-block;float:left;text-align:center;margin:0;padding:0;width:120px} +ul.de_pg_tab li{position:relative;display:inline-block;float:left;text-align:center;margin:0;padding:0;width:140px} ul.de_pg_tab li a{margin:0 2px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:2.5;background-color:#f7f7f7;color:#74777b;font-weight:bold;font-size:1.2em;text-decoration:none} ul.de_pg_tab li a:hover{text-decoration:none} ul.de_pg_tab li.tab-current a{background:#2CC185;color:#fff} @@ -751,6 +751,7 @@ ul.de_pg_tab li.tab-current a{background:#2CC185;color:#fff} .pg_info_fld{position:relative} .kcp_info_fld th{background-color:#F6FCFF} .lg_info_fld th{background-color:#FFF4FA} +.lg_info_fld_v2 th{background-color:#ffe8f5} .inicis_info_fld th{background-color:#F6F1FF} .kakao_info_fld th{background-color:#FFFCED} .naver_info_fld th{background-color:#F3FFF3} diff --git a/adm/shop_admin/admin.shop.lib.php b/adm/shop_admin/admin.shop.lib.php index a6310b125..737d0d95c 100644 --- a/adm/shop_admin/admin.shop.lib.php +++ b/adm/shop_admin/admin.shop.lib.php @@ -170,6 +170,10 @@ function is_cancel_shop_pg_order($od){ $is_od_pg_cancel = true; } + if($od['od_pg'] === 'toss' && in_array($od['od_settle_case'], array('계좌이체', '휴대폰'))) { + $is_od_pg_cancel = true; + } + return $is_od_pg_cancel; } diff --git a/adm/shop_admin/configform.php b/adm/shop_admin/configform.php index 041a53d36..788f7288e 100644 --- a/adm/shop_admin/configform.php +++ b/adm/shop_admin/configform.php @@ -215,6 +215,14 @@ if (! isset($default['de_nicepay_mid'])) { sql_query($sql, false); } +// 토스페이먼츠 버전 2 client, secret key 추가 +if( ! isset($config['cf_toss_client_key']) ){ + $sql = "ALTER TABLE `{$g5['config_table']}` + ADD COLUMN `cf_toss_client_key` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_lg_mert_key`, + ADD COLUMN `cf_toss_secret_key` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_toss_client_key`; "; + sql_query($sql, false); +} + if( function_exists('pg_setting_check') ){ pg_setting_check(true); } @@ -636,17 +644,23 @@ if(!$default['de_kakaopay_cancelpwd']){ /settle_kcp_common.php - KG이니시스 가상계좌 입금통보 URL + KG이니시스 가상계좌
입금통보 URL KG이니시스 관리자 > 거래내역 > 가상계좌 > 입금통보방식선택 > URL 수신 설정에 넣으셔야 상점에 자동으로 입금 통보됩니다."); ?> /settle_inicis_common.php - NICEPAY 가상계좌 입금통보 URL + NICEPAY 가상계좌
입금통보 URL NICEPAY 관리자 > 가맹점관리자페이지 설정 (메인화면 → 가맹점정보 클릭)에 넣으셔야 상점에 자동으로 입금 통보됩니다."); ?> /settle_nicepay_common.php + + 토스페이먼츠v2 가상계좌
입금통보 URL + + 토스페이먼츠 상점관리자 > 개발자센터 > 웹훅 > 웹훅 등록하기에 URL에 넣으시고, 구독할 이벤트를 [DEPOSIT_CALLBACK]을 선택하셔야 상점에 자동으로 입금 통보됩니다."); ?> + /settle_toss_common.php + @@ -687,6 +701,7 @@ if(!$default['de_kakaopay_cancelpwd']){ + @@ -776,6 +791,7 @@ if(!$default['de_kakaopay_cancelpwd']){ @@ -839,6 +855,20 @@ if(!$default['de_kakaopay_cancelpwd']){ + + + + 개발자센터 -> API키 -> 클라이언트 키에서 확인하실 수 있습니다. 예) live_ck_tosspayment\n실결제용 [라이브] 키와 테스트용 [테스트] 키는 서로 다르므로, 테스트로 결제시에는 [테스트] 키로 변경하여 사용해주시기 바랍니다. 예) 테스트 키: test_ck_tosspayment"); ?> + + + + + + + 개발자센터 -> API키 -> 시크릿 키에서 확인하실 수 있습니다. 예) live_sk_tosspayment\n실결제용 [라이브] 키와 테스트용 [테스트] 키는 서로 다르므로, 테스트로 결제시에는 [테스트] 키로 변경하여 사용해주시기 바랍니다. 예) 테스트 키: test_sk_tosspayment"); ?> + + +
@@ -1070,6 +1100,9 @@ if(!$default['de_kakaopay_cancelpwd']){ 실결제 관리자 테스트 관리자 +
+ 상점 관리자 +
상점 관리자
@@ -1095,6 +1128,9 @@ if(!$default['de_kakaopay_cancelpwd']){ + diff --git a/adm/shop_admin/configformupdate.php b/adm/shop_admin/configformupdate.php index edbe82937..adfb06ea8 100644 --- a/adm/shop_admin/configformupdate.php +++ b/adm/shop_admin/configformupdate.php @@ -159,6 +159,8 @@ $check_sanitize_keys = array( 'de_kcp_site_key', //NHN KCP SITE KEY 'cf_lg_mid', //LG유플러스 상점아이디 'cf_lg_mert_key', //LG유플러스 MERT KEY +'cf_toss_client_key', //토스페이먼츠 MERT KEY +'cf_toss_secret_key', //토스페이먼츠 MERT KEY 'de_inicis_mid', //KG이니시스 상점아이디 'de_inicis_iniapi_key', //KG이니시스 INIAPI KEY 'de_inicis_iniapi_iv', //KG이니시스 INIAPI IV @@ -465,7 +467,9 @@ $sql = " update {$g5['config_table']} cf_icode_server_port = '{$_POST['cf_icode_server_port']}', cf_icode_token_key = '{$cf_icode_token_key}', cf_lg_mid = '{$cf_lg_mid}', - cf_lg_mert_key = '{$cf_lg_mert_key}' "; + cf_lg_mert_key = '{$cf_lg_mert_key}', + cf_toss_client_key = '{$cf_toss_client_key}', + cf_toss_secret_key = '{$cf_toss_secret_key}' "; sql_query($sql); run_event('shop_admin_configformupdate'); diff --git a/adm/shop_admin/orderform.php b/adm/shop_admin/orderform.php index baffdc4de..02e231006 100644 --- a/adm/shop_admin/orderform.php +++ b/adm/shop_admin/orderform.php @@ -283,7 +283,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js

주문, 입금, 준비, 배송, 완료는 장바구니와 주문서 상태를 모두 변경하지만, 취소, 반품, 품절은 장바구니의 상태만 변경하며, 주문서 상태는 변경하지 않습니다.

개별적인(이곳에서의) 상태 변경은 모든 작업을 수동으로 처리합니다. 예를 들어 주문에서 입금으로 상태 변경시 입금액(결제금액)을 포함한 모든 정보는 수동 입력으로 처리하셔야 합니다.

- +

* 알림톡 프리셋: [준비, 완료, 취소, 반품, 품절]자동으로 발송되며, [입금완료, 배송]결제상세정보에서 수동으로 발송하셔야 합니다.

@@ -533,6 +533,10 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js $pg_url = 'https://npg.nicepay.co.kr/'; $pg_test = 'NICEPAY'; break; + case 'toss': + $pg_url = 'https://app.tosspayments.com'; + $pg_test = '토스페이먼츠 '; + break; default: $pg_url = 'http://admin8.kcp.co.kr'; $pg_test = 'KCP'; @@ -634,6 +638,8 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js break; } $cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$od['od_id'].'\',\''.$od['od_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');'; + } else if($od['od_pg'] == 'toss') { + $cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$od['od_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'inicis') { $cash = unserialize($od['od_cash_info']); $cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');'; @@ -844,7 +850,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js diff --git a/adm/shop_admin/orderformcartupdate.php b/adm/shop_admin/orderformcartupdate.php index 84bcb5681..055213e45 100644 --- a/adm/shop_admin/orderformcartupdate.php +++ b/adm/shop_admin/orderformcartupdate.php @@ -224,6 +224,10 @@ if (in_array($_POST['ct_status'], $status_cancel)) { $pg_res_msg = $xpay->Response_Msg(); } break; + case 'toss': + $cancel_msg = '쇼핑몰 운영자 승인 취소'; + include_once(G5_SHOP_PATH.'/toss/toss_cancel.php'); + break; case 'inicis': include_once(G5_SHOP_PATH.'/settle_inicis.inc.php'); $cancel_msg = '쇼핑몰 운영자 승인 취소'; diff --git a/adm/shop_admin/personalpayform.php b/adm/shop_admin/personalpayform.php index 6c0005511..d67df8d51 100644 --- a/adm/shop_admin/personalpayform.php +++ b/adm/shop_admin/personalpayform.php @@ -210,6 +210,8 @@ if(!sql_query(" select pp_cash from {$g5['g5_shop_personalpay_table']} limit 1 " break; } $cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$pp['pp_id'].'\',\''.$pp['pp_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');'; + } else if($pp['pp_pg'] == 'toss') { + $cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$pp['pp_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'inicis') { $cash = unserialize($pp['pp_cash_info']); $cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');'; diff --git a/install/gnuboard5.sql b/install/gnuboard5.sql index 8c2fdb570..5b11e86ff 100644 --- a/install/gnuboard5.sql +++ b/install/gnuboard5.sql @@ -300,6 +300,8 @@ CREATE TABLE IF NOT EXISTS `g5_config` ( `cf_cert_kcp_enckey` varchar(100) NOT NULL DEFAULT '', `cf_lg_mid` varchar(100) NOT NULL DEFAULT '', `cf_lg_mert_key` varchar(100) NOT NULL DEFAULT '', + `cf_toss_client_key` varchar(100) NOT NULL DEFAULT '', + `cf_toss_secret_key` varchar(100) NOT NULL DEFAULT '', `cf_cert_limit` int(11) NOT NULL DEFAULT '0', `cf_cert_req` tinyint(4) NOT NULL DEFAULT '0', `cf_sms_use` varchar(255) NOT NULL DEFAULT '', diff --git a/mobile/shop/orderform.sub.php b/mobile/shop/orderform.sub.php index d4befcae4..e6f9008b9 100644 --- a/mobile/shop/orderform.sub.php +++ b/mobile/shop/orderform.sub.php @@ -62,6 +62,9 @@ ob_start(); $comm_free_mny = 0; // 면세금액 $tot_tax_mny = 0; + // 토스페이먼츠 escrowProducts 배열 생성 + $escrow_products = array(); + for ($i=0; $row=sql_fetch_array($result); $i++) { // 합계금액 계산 @@ -114,6 +117,15 @@ ob_start(); $point = $sum['point']; $sell_price = $sum['price']; + + // 토스페이먼츠 escrowProducts 배열에 상품 정보 추가 + $escrow_products[] = array( + 'id' => $row['ct_id'], + 'name' => $row['it_name'], + 'code' => $row['it_id'], + 'unitPrice' => (int) $row['ct_price'], + 'quantity' => (int) $row['ct_qty'] + ); $cp_button = ''; // 쿠폰 @@ -577,7 +589,7 @@ if($is_kakaopay_use) { // 계좌이체 사용 if ($default['de_iche_use']) { $multi_settle++; - echo '
  • '.PHP_EOL; + echo '
  • '.PHP_EOL; $checked = ''; } @@ -1412,6 +1424,55 @@ function pay_approval() f.LGD_TAXFREEAMOUNT.value = pf.comm_free_mny.value; + + var pay_method = ""; + switch(settle_method) { + case "계좌이체": + pay_method = "TRANSFER"; + break; + case "가상계좌": + pay_method = "VIRTUAL_ACCOUNT"; + break; + case "휴대폰": + pay_method = "MOBILE_PHONE"; + break; + case "신용카드": + pay_method = "CARD"; + break; + case "간편결제": + pay_method = "CARD"; + break; + } + f.method.value = pay_method; + f.orderId.value = ''; + f.orderName.value = ''; + + f.customerName.value = pf.od_name.value; + f.customerEmail.value = pf.od_email.value; + f.customerMobilePhone.value = pf.od_hp.value.replace(/[^0-9]/g, ''); + if (f.customerMobilePhone.value == '') { + f.customerMobilePhone.value = pf.od_tel.value.replace(/[^0-9]/g, ''); + } + + f.cardUseCardPoint.value = false; + f.cardUseAppCardOnly.value = false; + + + f.cardUseEscrow.value = 'true'; + f.escrowProducts.value = JSON.stringify(); + + + if(settle_method == "간편결제") { + f.cardflowMode.value = 'DIRECT'; + } + + f.amountCurrency.value = 'KRW'; + f.amountValue.value = f.good_mny.value; + + f.taxFreeAmount.value = pf.comm_free_mny.value; + + f.windowTarget.value = 'self'; + var paymethod = ""; var width = 330; diff --git a/mobile/shop/orderformupdate.php b/mobile/shop/orderformupdate.php index 8a75af656..e80d2bb98 100644 --- a/mobile/shop/orderformupdate.php +++ b/mobile/shop/orderformupdate.php @@ -8,6 +8,7 @@ $post_enc_data = isset($_POST['enc_data']) ? $_POST['enc_data'] : ''; $post_enc_info = isset($_POST['enc_info']) ? $_POST['enc_info'] : ''; $post_tran_cd = isset($_POST['tran_cd']) ? $_POST['tran_cd'] : ''; $post_lgd_paykey = isset($_POST['LGD_PAYKEY']) ? $_POST['LGD_PAYKEY'] : ''; +$paymentKey = isset($_POST['paymentKey']) ? $_POST['paymentKey'] : ''; //삼성페이 또는 lpay 또는 이니시스 카카오페이 요청으로 왔다면 현재 삼성페이 또는 lpay 또는 이니시스 카카오페이는 이니시스 밖에 없으므로 $default['de_pg_service'] 값을 이니시스로 변경한다. if( is_inicis_order_pay($od_settle_case) && !empty($_POST['P_HASH']) ){ @@ -42,6 +43,9 @@ if($od_settle_case != '무통장' && $od_settle_case != 'KAKAOPAY') { if($default['de_pg_service'] == 'lg' && ! $post_lgd_paykey) alert('결제등록 요청 후 주문해 주십시오.', $page_return_url); + if($default['de_pg_service'] == 'toss' && ! $paymentKey) + alert('결제등록 요청 후 주문해 주십시오.', $page_return_url); + if($default['de_pg_service'] == 'inicis' && ! $post_p_hash) alert('결제등록 요청 후 주문해 주십시오.', $page_return_url); } @@ -358,6 +362,9 @@ else if ($od_settle_case == "계좌이체") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -387,6 +394,9 @@ else if ($od_settle_case == "가상계좌") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -416,6 +426,9 @@ else if ($od_settle_case == "휴대폰") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -443,6 +456,9 @@ else if ($od_settle_case == "신용카드") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -472,6 +488,9 @@ else if ($od_settle_case == "간편결제") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -543,6 +562,9 @@ if($tno) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; @@ -699,6 +721,9 @@ if(! $result || ! (isset($exists_order['od_id']) && $od_id && $exists_order['od_ case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; @@ -761,6 +786,9 @@ if(!$result) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; diff --git a/mobile/shop/orderinquiryview.php b/mobile/shop/orderinquiryview.php index c3f328c1a..185ad2534 100644 --- a/mobile/shop/orderinquiryview.php +++ b/mobile/shop/orderinquiryview.php @@ -338,6 +338,8 @@ if($od['od_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $hp_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($od['od_pg'] == 'toss') { + $hp_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/phone?transactionId='.$od['od_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'inicis') { $hp_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'nicepay') { @@ -359,6 +361,8 @@ if($od['od_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $card_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($od['od_pg'] == 'toss') { + $card_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/redirection?transactionId='.$od['od_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'nicepay') { $card_receipt_script = 'window.open(\'https://npg.nicepay.co.kr/issue/IssueLoader.do?type=0&TID='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'inicis') { @@ -432,6 +436,8 @@ if($od['od_pg'] == 'lg') { break; } $cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$od['od_id'].'\',\''.$od['od_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');'; + } else if($od['od_pg'] == 'toss') { + $cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$od['od_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'inicis') { $cash = unserialize($od['od_cash_info']); $cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');'; diff --git a/mobile/shop/personalpayform.sub.php b/mobile/shop/personalpayform.sub.php index 3034a7b00..43b54aef6 100644 --- a/mobile/shop/personalpayform.sub.php +++ b/mobile/shop/personalpayform.sub.php @@ -53,8 +53,18 @@ $tablet_size = "1.0"; // 화면 사이즈 조정 - 기기화면에 맞게 수정 $checked = ''; $escrow_title = ""; + $escrow_products = array(); // 토스페이먼츠 escrowProducts 배열 생성 if ($default['de_escrow_use']) { $escrow_title = "에스크로 "; + + // 토스페이먼츠 escrowProducts 배열에 상품 정보 추가 + $escrow_products[] = array( + 'id' => $pp['pp_id'], + 'name' => $pp['pp_name'].'님 개인결제', + 'code' => $pp['pp_id'], + 'unitPrice' => (int) $pp['pp_price'], + 'quantity' => (int) 1 + ); } if ($default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use']) { @@ -73,7 +83,7 @@ $tablet_size = "1.0"; // 화면 사이즈 조정 - 기기화면에 맞게 수정 // 계좌이체 사용 if ($default['de_iche_use']) { $multi_settle++; - echo '
  • '.PHP_EOL; + echo '
  • '.PHP_EOL; $checked = ''; } @@ -174,6 +184,51 @@ function pay_approval() f.LGD_TAXFREEAMOUNT.value = pf.comm_free_mny.value; + + var pay_method = ""; + switch(settle_method) { + case "계좌이체": + pay_method = "TRANSFER"; + break; + case "가상계좌": + pay_method = "VIRTUAL_ACCOUNT"; + break; + case "휴대폰": + pay_method = "MOBILE_PHONE"; + break; + case "신용카드": + pay_method = "CARD"; + break; + case "간편결제": + pay_method = "CARD"; + break; + } + f.method.value = pay_method; + f.orderId.value = ''; + f.orderName.value = ''; + + f.customerName.value = pf.pp_name.value; + f.customerEmail.value = pf.pp_email.value; + f.customerMobilePhone.value = pf.pp_hp.value.replace(/[^0-9]/g, ''); + + f.cardUseCardPoint.value = false; + f.cardUseAppCardOnly.value = false; + + + f.cardUseEscrow.value = 'true'; + f.escrowProducts.value = JSON.stringify(); + + + if(settle_method == "간편결제") { + f.cardflowMode.value = 'DIRECT'; + } + + f.amountCurrency.value = 'KRW'; + f.amountValue.value = f.good_mny.value; + + f.taxFreeAmount.value = pf.comm_free_mny.value; + + f.windowTarget.value = 'self'; var paymethod = ""; var width = 330; diff --git a/mobile/shop/personalpayformupdate.php b/mobile/shop/personalpayformupdate.php index aa3acace8..c0da09f7b 100644 --- a/mobile/shop/personalpayformupdate.php +++ b/mobile/shop/personalpayformupdate.php @@ -9,6 +9,7 @@ $post_enc_info = isset($_POST['enc_info']) ? $_POST['enc_info'] : ''; $post_enc_data = isset($_POST['enc_data']) ? $_POST['enc_data'] : ''; $post_lgd_paykey = isset($_POST['LGD_PAYKEY']) ? $_POST['LGD_PAYKEY'] : ''; +$paymentKey = isset($_POST['paymentKey']) ? $_POST['paymentKey'] : ''; $post_p_hash = isset($_POST['P_HASH']) ? $_POST['P_HASH'] : ''; @@ -22,6 +23,9 @@ if($default['de_pg_service'] == 'kcp' && ($post_tran_cd === '' || $post_enc_info if($default['de_pg_service'] == 'lg' && ! $post_lgd_paykey) alert('결제등록 요청 후 주문해 주십시오.', $page_return_url); +if($default['de_pg_service'] == 'toss' && ! $paymentKey) + alert('결제등록 요청 후 주문해 주십시오.', $page_return_url); + if($default['de_pg_service'] == 'inicis' && ! $post_p_hash) alert('결제등록 요청 후 주문해 주십시오.', $page_return_url); @@ -32,6 +36,13 @@ $pp = sql_fetch($sql); if(! (isset($pp['pp_id']) && $pp['pp_id'])) alert('개인결제 정보가 존재하지 않습니다.', G5_SHOP_URL.'/personalpay.php'); +// PG사의 가상계좌 또는 계좌이체의 자동 현금영수증 초기배열값 +$pg_receipt_infos = array( + 'od_cash' => 0, + 'od_cash_no' => '', + 'od_cash_info' => '', +); + $hash_data = md5($pp_id.$good_mny.$pp['pp_time']); if($pp['pp_tno']){ @@ -54,6 +65,9 @@ if ($pp_settle_case == "계좌이체") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -79,6 +93,9 @@ else if ($pp_settle_case == "가상계좌") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -105,6 +122,9 @@ else if ($pp_settle_case == "휴대폰") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -128,6 +148,9 @@ else if ($pp_settle_case == "신용카드") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_MSHOP_PATH.'/inicis/pay_result.php'; break; @@ -159,6 +182,9 @@ if((int)$pp['pp_price'] !== (int)$pg_price) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; @@ -186,7 +212,10 @@ $sql = " update {$g5['g5_shop_personalpay_table']} pp_bank_account = '$pp_bank_account', pp_deposit_name = '$pp_deposit_name', pp_receipt_time = '$pp_receipt_time', - pp_receipt_ip = '{$_SERVER['REMOTE_ADDR']}' + pp_receipt_ip = '{$_SERVER['REMOTE_ADDR']}', + pp_cash = '{$pg_receipt_infos['od_cash']}', + pp_cash_no = '{$pg_receipt_infos['od_cash_no']}', + pp_cash_info = '{$pg_receipt_infos['od_cash_info']}' where pp_id = '{$pp['pp_id']}' "; $result = sql_query($sql, false); @@ -197,6 +226,9 @@ if(!$result) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; @@ -224,6 +256,9 @@ if($pp_receipt_price > 0 && $pp['pp_id'] && $pp['od_id']) { od_settle_case = '$pp_settle_case', od_deposit_name = '$pp_deposit_name', od_bank_account = '$pp_bank_account', + od_cash = '{$pg_receipt_infos['od_cash']}', + od_cash_no = '{$pg_receipt_infos['od_cash_no']}', + od_cash_info = '{$pg_receipt_infos['od_cash_info']}', od_shop_memo = concat(od_shop_memo, \"\\n개인결제 ".$pp['pp_id']." 로 결제완료 - ".$pp_receipt_time."\") where od_id = '{$pp['od_id']}' "; $result = sql_query($sql, false); @@ -235,6 +270,9 @@ if($pp_receipt_price > 0 && $pp['pp_id'] && $pp['od_id']) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; diff --git a/mobile/shop/personalpayresult.php b/mobile/shop/personalpayresult.php index 4e15dab76..856abf3bc 100644 --- a/mobile/shop/personalpayresult.php +++ b/mobile/shop/personalpayresult.php @@ -145,6 +145,8 @@ if($pp['pp_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $hp_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($pp['pp_pg'] == 'toss') { + $hp_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/phone?transactionId='.$pp['pp_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'inicis') { $hp_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$pp['pp_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'nicepay') { @@ -166,6 +168,8 @@ if($pp['pp_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $card_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($pp['pp_pg'] == 'toss') { + $card_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/redirection?transactionId='.$pp['pp_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'nicepay') { $card_receipt_script = 'window.open(\'https://npg.nicepay.co.kr/issue/IssueLoader.do?type=0&TID='.$pp['pp_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'inicis') { @@ -221,6 +225,8 @@ if($pp['pp_pg'] == 'lg') { break; } $cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$pp['pp_id'].'\',\''.$pp['pp_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');'; + } else if($pp['pp_pg'] == 'toss') { + $cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$pp['pp_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'inicis') { $cash = unserialize($pp['pp_cash_info']); $cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');'; diff --git a/mobile/shop/settle_toss.inc.php b/mobile/shop/settle_toss.inc.php new file mode 100644 index 000000000..59e47a8e0 --- /dev/null +++ b/mobile/shop/settle_toss.inc.php @@ -0,0 +1,15 @@ +setPaymentHeader(); +?> \ No newline at end of file diff --git a/mobile/shop/toss/_common.php b/mobile/shop/toss/_common.php new file mode 100644 index 000000000..7c37c6ca3 --- /dev/null +++ b/mobile/shop/toss/_common.php @@ -0,0 +1,6 @@ +쇼핑몰 설치 후 이용해 주십시오.

    '); +define('_SHOP_', true); \ No newline at end of file diff --git a/mobile/shop/toss/orderform.1.php b/mobile/shop/toss/orderform.1.php new file mode 100644 index 000000000..d3b6e9017 --- /dev/null +++ b/mobile/shop/toss/orderform.1.php @@ -0,0 +1,33 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/mobile/shop/toss/orderform.2.php b/mobile/shop/toss/orderform.2.php new file mode 100644 index 000000000..6587ed56b --- /dev/null +++ b/mobile/shop/toss/orderform.2.php @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + 취소 +
    diff --git a/mobile/shop/toss/orderform.3.php b/mobile/shop/toss/orderform.3.php new file mode 100644 index 000000000..0f09cf7f0 --- /dev/null +++ b/mobile/shop/toss/orderform.3.php @@ -0,0 +1,3 @@ + diff --git a/mobile/shop/toss/returnurl.php b/mobile/shop/toss/returnurl.php new file mode 100644 index 000000000..e62a5cf78 --- /dev/null +++ b/mobile/shop/toss/returnurl.php @@ -0,0 +1,77 @@ + + +'.PHP_EOL; + +echo make_order_field($data, $exclude); + +echo ''.PHP_EOL; +?> + +
    +
    + + 주문완료 중입니다. 잠시만 기다려 주십시오. +
    +
    + + + + + +
    + $value) { + if (isset($_REQUEST[$key]) && $_REQUEST[$key]) { + $value = $_REQUEST[$key]; + } + if (is_array($value)) { + $value = implode(',', $value); + } + if ($key === 'escrowProducts') { + $value = str_replace("\\", "", $value); + echo ''.PHP_EOL; + } else { + echo ''.PHP_EOL; + } +} +?> +
    + + + + + + $row['ct_id'], + 'name' => $row['it_name'], + 'code' => $row['it_id'], + 'unitPrice' => (int) $row['ct_price'], + 'quantity' => (int) $row['ct_qty'] + ); + // 쿠폰 $cp_button = ''; if($is_member) { @@ -596,7 +608,8 @@ if($is_kakaopay_use) { // 계좌이체 사용 if ($default['de_iche_use']) { $multi_settle++; - echo ' '.PHP_EOL; + // 토스페이먼츠 v2 - 퀵계좌이체 명칭 사용 + echo ' '.PHP_EOL; $checked = ''; } @@ -1541,6 +1554,28 @@ function forderform_check(f) f.LGD_CUSTOM_FIRSTPAY.value = "무통장"; break; } + + switch(settle_method) + { + case "계좌이체": + f.method.value = "TRANSFER"; + break; + case "가상계좌": + f.method.value = "VIRTUAL_ACCOUNT"; + break; + case "휴대폰": + f.method.value = "MOBILE_PHONE"; + break; + case "신용카드": + f.method.value = "CARD"; + break; + case "간편결제": + f.method.value = "CARD"; + break; + default: + f.method.value = "무통장"; + break; + } switch(settle_method) { @@ -1676,6 +1711,62 @@ function forderform_check(f) f.submit(); } + + + f.orderId.value = ''; + f.orderName.value = ''; + + f.customerName.value = f.od_name.value; + f.customerEmail.value = f.od_email.value; + f.customerMobilePhone.value = f.od_hp.value.replace(/[^0-9]/g, ''); + if (f.customerMobilePhone.value == '') { + f.customerMobilePhone.value = f.od_tel.value.replace(/[^0-9]/g, ''); + } + + f.cardUseCardPoint.value = false; + f.cardUseAppCardOnly.value = false; + + + f.cardUseEscrow.value = 'true'; + f.escrowProducts.value = JSON.stringify(); + + + if(settle_method == "간편결제") { + f.cardflowMode.value = 'DIRECT'; + } + + f.amountCurrency.value = 'KRW'; + f.amountValue.value = f.good_mny.value; + + f.taxFreeAmount.value = f.comm_free_mny.value; + + f.windowTarget.value = 'iframe'; + + if(f.method.value != "무통장") { + // 주문정보 임시저장 + var order_data = $(f).serialize(); + var save_result = ""; + $.ajax({ + type: "POST", + data: order_data, + url: g5_url+"/shop/ajax.orderdatasave.php", + cache: false, + async: false, + success: function(data) { + save_result = data; + } + }); + + if(save_result) { + alert(save_result); + return false; + } + + launchCrossPlatform(f); + } else { + f.submit(); + } + f.price.value = f.good_mny.value; diff --git a/shop/orderformupdate.php b/shop/orderformupdate.php index 4e84ba4a8..cac0daf16 100644 --- a/shop/orderformupdate.php +++ b/shop/orderformupdate.php @@ -20,6 +20,12 @@ if(($od_settle_case != '무통장' && $od_settle_case != 'KAKAOPAY') && $default alert('결제등록 요청 후 주문해 주십시오.'); } +// 토스 v2 대응 +if(($od_settle_case != '무통장' && $od_settle_case != 'KAKAOPAY') && $default['de_pg_service'] == 'toss' && !$_POST['paymentKey']){ + if(function_exists('add_order_post_log')) add_order_post_log('결제등록 요청 후 주문해 주십시오.'); + alert('결제등록 요청 후 주문해 주십시오.'); +} + // 장바구니가 비어있는가? if (get_session("ss_direct")) $tmp_cart_id = get_session('ss_cart_direct'); @@ -337,6 +343,9 @@ else if ($od_settle_case == "계좌이체") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -367,6 +376,10 @@ else if ($od_settle_case == "가상계좌") include G5_SHOP_PATH.'/lg/xpay_result.php'; $od_receipt_time = '0000-00-00 00:00:00'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + $od_receipt_time = '0000-00-00 00:00:00'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; $od_app_no = $app_no; @@ -395,6 +408,9 @@ else if ($od_settle_case == "휴대폰") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -422,6 +438,9 @@ else if ($od_settle_case == "신용카드") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -451,6 +470,9 @@ else if ($od_settle_case == "간편결제" || (($od_settle_case == "lpay" || $od case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -510,6 +532,9 @@ if($tno) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; @@ -653,6 +678,9 @@ if(! $result || ! (isset($exists_order['od_id']) && $od_id && $exists_order['od_ case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; @@ -712,6 +740,9 @@ if(!$result) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; diff --git a/shop/orderinquirycancel.php b/shop/orderinquirycancel.php index dda82c10b..cf562b900 100644 --- a/shop/orderinquirycancel.php +++ b/shop/orderinquirycancel.php @@ -65,6 +65,10 @@ if($od['od_tno']) { alert($msg); } break; + case 'toss': + $cancel_msg = '주문자 본인 취소-'.$cancel_memo; + include_once(G5_SHOP_PATH.'/toss/toss_cancel.php'); + break; case 'inicis': include_once(G5_SHOP_PATH.'/settle_inicis.inc.php'); $cancel_msg = '주문자 본인 취소-'.$cancel_memo; diff --git a/shop/orderinquiryview.php b/shop/orderinquiryview.php index 297c5208d..bba85f21f 100644 --- a/shop/orderinquiryview.php +++ b/shop/orderinquiryview.php @@ -334,6 +334,8 @@ if($od['od_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $hp_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($od['od_pg'] == 'toss') { + $hp_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/phone?transactionId='.$od['od_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'inicis') { $hp_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'nicepay') { @@ -355,6 +357,8 @@ if($od['od_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $card_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($od['od_pg'] == 'toss') { + $card_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/redirection?transactionId='.$od['od_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'inicis') { $card_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'nicepay') { @@ -429,6 +433,8 @@ if($od['od_pg'] == 'lg') { break; } $cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$od['od_id'].'\',\''.$od['od_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');'; + } else if($od['od_pg'] == 'toss') { + $cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$od['od_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'inicis') { $cash = unserialize($od['od_cash_info']); $cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');'; diff --git a/shop/personalpayform.sub.php b/shop/personalpayform.sub.php index a80153d8d..4d37d8387 100644 --- a/shop/personalpayform.sub.php +++ b/shop/personalpayform.sub.php @@ -62,8 +62,18 @@ require_once(G5_SHOP_PATH.'/'.$default['de_pg_service'].'/orderform.1.php'); $checked = ''; $escrow_title = ""; + $escrow_products = array(); // 토스페이먼츠 escrowProducts 배열 생성 if ($default['de_escrow_use']) { $escrow_title = "에스크로
    "; + + // 토스페이먼츠 escrowProducts 배열에 상품 정보 추가 + $escrow_products[] = array( + 'id' => $pp['pp_id'], + 'name' => $pp['pp_name'].'님 개인결제', + 'code' => $pp['pp_id'], + 'unitPrice' => (int) $pp['pp_price'], + 'quantity' => (int) 1 + ); } if ($default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use']) { @@ -89,7 +99,7 @@ require_once(G5_SHOP_PATH.'/'.$default['de_pg_service'].'/orderform.1.php'); // 계좌이체 사용 if ($default['de_iche_use']) { $multi_settle++; - echo ' '.PHP_EOL; + echo ' '.PHP_EOL; $checked = ''; } ?> @@ -233,6 +243,28 @@ function forderform_check(f) f.LGD_CUSTOM_FIRSTPAY.value = "무통장"; break; } + + switch(settle_method) + { + case "계좌이체": + f.method.value = "TRANSFER"; + break; + case "가상계좌": + f.method.value = "VIRTUAL_ACCOUNT"; + break; + case "휴대폰": + f.method.value = "MOBILE_PHONE"; + break; + case "신용카드": + f.method.value = "CARD"; + break; + case "간편결제": + f.method.value = "CARD"; + break; + default: + f.method.value = "무통장"; + break; + } switch(settle_method) { @@ -310,6 +342,59 @@ function forderform_check(f) f.submit(); } + + + f.orderId.value = ''; + f.orderName.value = ''; + + f.customerName.value = f.pp_name.value; + f.customerEmail.value = f.pp_email.value; + f.customerMobilePhone.value = f.pp_hp.value.replace(/[^0-9]/g, ''); + + f.cardUseCardPoint.value = false; + f.cardUseAppCardOnly.value = false; + + + f.cardUseEscrow.value = 'true'; + f.escrowProducts.value = JSON.stringify(); + + + if(settle_method == "간편결제") { + f.cardflowMode.value = 'DIRECT'; + } + + f.amountCurrency.value = 'KRW'; + f.amountValue.value = f.good_mny.value; + + f.taxFreeAmount.value = f.comm_free_mny.value; + + f.windowTarget.value = 'iframe'; + + if(f.method.value != "무통장") { + // 주문정보 임시저장 + var order_data = $(f).serialize(); + var save_result = ""; + $.ajax({ + type: "POST", + data: order_data, + url: g5_url+"/shop/ajax.orderdatasave.php", + cache: false, + async: false, + success: function(data) { + save_result = data; + } + }); + + if(save_result) { + alert(save_result); + return false; + } + + launchCrossPlatform(f); + } else { + f.submit(); + } + f.price.value = f.good_mny.value; f.buyername.value = f.pp_name.value; diff --git a/shop/personalpayformupdate.php b/shop/personalpayformupdate.php index 6a25e8af6..2e09e09d5 100644 --- a/shop/personalpayformupdate.php +++ b/shop/personalpayformupdate.php @@ -2,28 +2,42 @@ include_once('./_common.php'); include_once(G5_LIB_PATH.'/mailer.lib.php'); +$page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.get_session('ss_personalpay_id'); + $pp_id = $_POST['pp_id'] = isset($_POST['pp_id']) ? preg_replace('/[^0-9]/', '', $_POST['pp_id']) : 0; $good_mny = $_POST['good_mny'] = isset($_POST['good_mny']) ? preg_replace('/[^0-9]/', '', $_POST['good_mny']) : 0; $post_lgd_paykey = isset($_POST['LGD_PAYKEY']) ? $_POST['LGD_PAYKEY'] : ''; +$paymentKey = isset($_POST['paymentKey']) ? $_POST['paymentKey'] : ''; $pp_deposit_name = ''; if($default['de_pg_service'] == 'lg' && ! $post_lgd_paykey) - alert('결제등록 요청 후 결제해 주십시오.'); + alert('결제등록 요청 후 결제해 주십시오.', $page_return_url); + +if($default['de_pg_service'] == 'toss' && ! $paymentKey) + alert('결제등록 요청 후 주문해 주십시오.', $page_return_url); + +set_session('ss_order_id', $pp_id); // 개인결제 정보 $pp_check = false; $sql = " select * from {$g5['g5_shop_personalpay_table']} where pp_id = '{$pp_id}' and pp_use = '1' "; $pp = sql_fetch($sql); if(! (isset($pp['pp_id']) && $pp['pp_id'])) - alert('개인결제 정보가 존재하지 않습니다.'); + alert('개인결제 정보가 존재하지 않습니다.', $page_return_url); if($pp['pp_tno']) - alert('이미 결제하신 개인결제 내역입니다.'); + alert('이미 결제하신 개인결제 내역입니다.', $page_return_url); $hash_data = md5($pp_id.$good_mny.$pp['pp_time']); if($pp_id != get_session('ss_personalpay_id') || $hash_data != get_session('ss_personalpay_hash')) die('개인결제 정보가 올바르지 않습니다.'); +// PG사의 가상계좌 또는 계좌이체의 자동 현금영수증 초기배열값 +$pg_receipt_infos = array( + 'od_cash' => 0, + 'od_cash_no' => '', + 'od_cash_info' => '', +); if ($pp_settle_case == "계좌이체") { @@ -31,6 +45,9 @@ if ($pp_settle_case == "계좌이체") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -56,6 +73,9 @@ else if ($pp_settle_case == "가상계좌") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -81,6 +101,9 @@ else if ($pp_settle_case == "휴대폰") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -104,6 +127,9 @@ else if ($pp_settle_case == "신용카드") case 'lg': include G5_SHOP_PATH.'/lg/xpay_result.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_result.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inistdpay_result.php'; break; @@ -134,6 +160,9 @@ if((int)$pp['pp_price'] !== (int)$pg_price) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; break; @@ -164,7 +193,10 @@ $sql = " update {$g5['g5_shop_personalpay_table']} pp_bank_account = '$pp_bank_account', pp_deposit_name = '$pp_deposit_name', pp_receipt_time = '$pp_receipt_time', - pp_receipt_ip = '{$_SERVER['REMOTE_ADDR']}' + pp_receipt_ip = '{$_SERVER['REMOTE_ADDR']}', + pp_cash = '{$pg_receipt_infos['od_cash']}', + pp_cash_no = '{$pg_receipt_infos['od_cash_no']}', + pp_cash_info = '{$pg_receipt_infos['od_cash_info']}' where pp_id = '{$pp['pp_id']}' "; $result = sql_query($sql, false); @@ -202,6 +234,9 @@ if($pp_receipt_price > 0 && $pp['pp_id'] && $pp['od_id']) { od_settle_case = '$pp_settle_case', od_deposit_name = '$pp_deposit_name', od_bank_account = '$pp_bank_account', + od_cash = '{$pg_receipt_infos['od_cash']}', + od_cash_no = '{$pg_receipt_infos['od_cash_no']}', + od_cash_info = '{$pg_receipt_infos['od_cash_info']}', od_shop_memo = concat(od_shop_memo, \"\\n개인결제 ".$pp['pp_id']." 로 결제완료 - ".$pp_receipt_time."\") where od_id = '{$pp['od_id']}' "; $result = sql_query($sql, false); @@ -213,9 +248,12 @@ if($pp_receipt_price > 0 && $pp['pp_id'] && $pp['od_id']) { case 'lg': include G5_SHOP_PATH.'/lg/xpay_cancel.php'; break; + case 'toss': + include G5_SHOP_PATH.'/toss/toss_cancel.php'; + break; case 'inicis': - include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; - break; + include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; + break; default: include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php'; break; diff --git a/shop/personalpayresult.php b/shop/personalpayresult.php index 9113bd97d..150eb4eae 100644 --- a/shop/personalpayresult.php +++ b/shop/personalpayresult.php @@ -149,6 +149,8 @@ if($pp['pp_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $hp_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($pp['pp_pg'] == 'toss') { + $hp_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/phone?transactionId='.$pp['pp_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'inicis') { $hp_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$pp['pp_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'nicepay') { @@ -170,6 +172,8 @@ if($pp['pp_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $card_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; + } else if($pp['pp_pg'] == 'toss') { + $card_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/redirection?transactionId='.$pp['pp_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'inicis') { $card_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$pp['pp_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'nicepay') { @@ -225,6 +229,8 @@ if($pp['pp_pg'] == 'lg') { break; } $cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$pp['pp_id'].'\',\''.$pp['pp_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');'; + } else if($pp['pp_pg'] == 'toss') { + $cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$pp['pp_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');'; } else if($pp['pp_pg'] == 'inicis') { $cash = unserialize($pp['pp_cash_info']); $cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');'; diff --git a/shop/settle_toss.inc.php b/shop/settle_toss.inc.php new file mode 100644 index 000000000..205853004 --- /dev/null +++ b/shop/settle_toss.inc.php @@ -0,0 +1,11 @@ +setPaymentHeader(); \ No newline at end of file diff --git a/shop/settle_toss_common.php b/shop/settle_toss_common.php new file mode 100644 index 000000000..07684cbfe --- /dev/null +++ b/shop/settle_toss_common.php @@ -0,0 +1,422 @@ +setPaymentHeader(); + +$orderResult = $toss->getPaymentByOrderId($TOSS_ORDERID); +$order_info = $toss->responseData; + +if (!$orderResult || $order_info['secret'] !== $TOSS_SECRET) { + $error_msg = isset($order_info['message']) ? $order_info['message'] : '주문 정보 조회 실패'; + $error_code = isset($order_info['code']) ? $order_info['code'] : 'UNKNOWN_ERROR'; + write_toss_log("주문 정보 조회 실패 - {$error_code} : {$error_msg}", $TOSS_ORDERID, $TOSS_STATUS); + http_response_code(400); + exit; +} + +// 결제 정보 +$paymentKey = isset($order_info["paymentKey"]) ? clean_xss_tags($order_info["paymentKey"]) : ''; // 결제 키 +$customerName = isset($order_info["virtualAccount"]["customerName"]) ? clean_xss_tags($order_info["virtualAccount"]["customerName"]) : ''; // 주문자명 (가상계좌 발급 시 고객명) +$depositorName = isset($order_info["virtualAccount"]["depositorName"]) ? clean_xss_tags($order_info["virtualAccount"]["depositorName"]) : ''; // 입금자명 (실제 입금자 입력 이름) +$totalAmount = isset($order_info["totalAmount"]) ? clean_xss_tags($order_info["totalAmount"]) : ''; // 입금 금액 (결제 총액) +$bankCode = isset($order_info["virtualAccount"]["bankCode"]) ? clean_xss_tags($order_info["virtualAccount"]["bankCode"]) : ''; // 은행코드 (가상계좌 발급 은행, 예: 11 → 농협) +$accountNumber = isset($order_info["virtualAccount"]["accountNumber"]) ? clean_xss_tags($order_info["virtualAccount"]["accountNumber"]) : ''; // 가상계좌 입금계좌번호 +$approvedAt = isset($order_info['approvedAt']) ? clean_xss_tags($order_info['approvedAt']) : ''; //입금일시 +$dueDate = isset($order_info["virtualAccount"]['dueDate']) ? clean_xss_tags($order_info['virtualAccount']['dueDate']) : ''; // 만료일시 +$receipt_time = $approvedAt ? (strtotime($approvedAt) !== false ? date("Y-m-d H:i:s", strtotime($approvedAt)) : '') : ''; +$due_time = $dueDate ? (strtotime($dueDate) !== false ? date("Y-m-d H:i:s", strtotime($dueDate)) : '') : ''; + +// 가상계좌 채번시 현금영수증 자동발급신청이 되었을 경우 전달되며 +// RcptTID에 값이 있는 경우만 발급처리 됨 +$RcptTID = isset($order_info['cashReceipt']['receiptKey']) ? clean_xss_tags($order_info['cashReceipt']['receiptKey']) : ''; // 현금영수증 거래번호 +$RcptAuthCode = isset($order_info['cashReceipt']['issueNumber']) ? clean_xss_tags($order_info['cashReceipt']['issueNumber']) : ''; // 현금영수증 승인번호 +// 현금영수증 구분(0:미발행, 1:소득공제용, 2:지출증빙용) +$RcptType = isset($order_info['cashReceipt']['type']) ? clean_xss_tags($order_info['cashReceipt']['type'] === '소득공제' ? '1' : ($order_info['cashReceipt']['type'] === '지출증빙' ? '2' : '0')) : '0'; +$RcptReceiptUrl = isset($order_info['cashReceipt']['receiptUrl']) ? clean_xss_tags($order_info['cashReceipt']['receiptUrl']) : ''; // 현금영수증 URL + +$result = false; + +/** + * 입금 완료 처리 + */ +if($TOSS_STATUS == "DONE"){ + + // 입금결과 처리 + $sql = " select pp_id, od_id from {$g5['g5_shop_personalpay_table']} where pp_id = '{$TOSS_ORDERID}' and pp_tno = '{$paymentKey}'"; + $row = sql_fetch($sql); + + if($row['pp_id']) { + // 개인결제 UPDATE + $add_update_sql = ''; + + // 현금영수증 발급시 1 또는 2 이면 + if ($RcptType) { + $add_update_sql = " + , pp_cash = '1', + pp_cash_no = '".$RcptAuthCode."', + pp_cash_info = '".serialize(array('TID'=>$RcptTID, 'ApplNum'=>$RcptAuthCode, 'AuthDate'=>$approvedAt, 'receiptUrl'=>$RcptReceiptUrl))."' + "; + } + + $sql = " update {$g5['g5_shop_personalpay_table']} + set pp_receipt_price = '$totalAmount', + pp_receipt_time = '$receipt_time', + pp_deposit_name = '$depositorName' + $add_update_sql + where pp_id = '$TOSS_ORDERID'"; + $result = sql_query($sql, false); + + if($row['od_id']) { + // 주문서 UPDATE + $sql = " update {$g5['g5_shop_order_table']} + set od_receipt_price = od_receipt_price + '$totalAmount', + od_receipt_time = '$receipt_time', + od_deposit_name = '$depositorName', + od_shop_memo = concat(od_shop_memo, \"\\n개인결제 ".$row['pp_id']." 로 결제완료 - ".$receipt_time."\") + where od_id = '{$row['od_id']}' "; + $result = sql_query($sql, FALSE); + } + } else { + // 주문내역에 secret 검증 추가 + $sql = " select od_id from {$g5['g5_shop_order_table']} where od_id = '$TOSS_ORDERID' and od_tno = '$paymentKey'"; + $row = sql_fetch($sql); + if(!$row['od_id']) { + write_toss_log("주문내역 조회 실패", $TOSS_ORDERID, $TOSS_STATUS); + http_response_code(400); + exit; + } + + // 주문서 UPDATE + $sql = " update {$g5['g5_shop_order_table']} + set od_receipt_price = '$totalAmount', + od_receipt_time = '$receipt_time', + od_deposit_name = '$depositorName' + where od_id = '$TOSS_ORDERID' + and od_tno = '$paymentKey'"; + $result = sql_query($sql, FALSE); + } + + if($result) { + if (isset($row['od_id']) && $row['od_id']) + $od_id = $row['od_id']; + else + $od_id = $TOSS_ORDERID; + + // 주문정보 체크 + $sql = " select count(od_id) as cnt + from {$g5['g5_shop_order_table']} + where od_id = '$od_id' + and od_status = '주문' "; + $row = sql_fetch($sql); + + if($row['cnt'] == 1) { + // 미수금 정보 업데이트 + $info = get_order_info($od_id); + + $add_update_sql = ''; + + // 현금영수증 발급시 1 또는 2 이면 + if ($RcptType) { + $add_update_sql = " + , od_cash = '1', + od_cash_no = '".$RcptAuthCode."', + od_cash_info = '".serialize(array('TID'=>$RcptTID, 'ApplNum'=>$RcptAuthCode, 'AuthDate'=>$approvedAt, 'receiptUrl'=>$RcptReceiptUrl))."' + "; + } + + $sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}' $add_update_sql "; + if($info['od_misu'] == 0) + $sql .= " , od_status = '입금' "; + $sql .= " where od_id = '$od_id' "; + sql_query($sql, FALSE); + + // 장바구니 상태변경 + if($info['od_misu'] == 0) { + $sql = " update {$g5['g5_shop_cart_table']} + set ct_status = '입금' + where od_id = '$od_id' "; + sql_query($sql, FALSE); + } + } + } +} + +/** + * 입금 오류 처리 (입금 오류로 인해 WAITING_FOR_DEPOSIT으로 되돌아온 경우) + */ +elseif($TOSS_STATUS == "WAITING_FOR_DEPOSIT") +{ + // 개인결제 정보 조회 + $sql = " select pp_id, od_id, pp_name, pp_hp, pp_tel from {$g5['g5_shop_personalpay_table']} where pp_id = '{$TOSS_ORDERID}' and pp_tno = '{$paymentKey}'"; + $row = sql_fetch($sql); + + if($row['pp_id']) { + // 개인결제 정보 롤백 + $sql = " update {$g5['g5_shop_personalpay_table']} + set pp_receipt_price = 0, + pp_receipt_time = '', + pp_cash = 0, + pp_cash_no = '', + pp_cash_info = '' + where pp_id = '{$TOSS_ORDERID}' and pp_tno = '{$paymentKey}'"; + $result = sql_query($sql, FALSE); + + if($row['od_id']) { + // 주문서에서 개인결제 금액 차감 + $sql = " update {$g5['g5_shop_order_table']} + set od_receipt_price = od_receipt_price - '$totalAmount', + od_shop_memo = concat(od_shop_memo, \"\\n개인결제 ".$row['pp_id']." 가상계좌 입금 오류로 취소 - ".date('Y-m-d H:i:s')."\") + where od_id = '{$row['od_id']}' "; + $result = sql_query($sql, FALSE); + } + } else { + // 일반 주문 롤백 전에 데이터 존재 확인 + $sql = " select od_id, od_name, od_hp, od_tel from {$g5['g5_shop_order_table']} where od_id = '{$TOSS_ORDERID}' and od_tno = '{$paymentKey}'"; + $row = sql_fetch($sql); + if(empty($row['od_id'])) { + write_toss_log("주문 데이터가 존재하지 않음", $TOSS_ORDERID, $TOSS_STATUS); + http_response_code(400); + exit; + } + + // 일반 주문 입금완료 - 주문 상태 롤백 (입금 → 주문) + $sql = " update {$g5['g5_shop_order_table']} + set od_status = '주문', + od_receipt_price = 0, + od_receipt_time = '', + od_shop_memo = concat(od_shop_memo, \"\\n가상계좌 입금 오류로 취소 - ".date('Y-m-d H:i:s')."\"), + od_cash = 0, + od_cash_no = '', + od_cash_info = '' + where od_id = '{$TOSS_ORDERID}' and od_tno = '{$paymentKey}' "; + $result = sql_query($sql, FALSE); + } + + // 공통 처리: 미수금 정보 재계산 및 상태 롤백 + if($result) { + if (isset($row['od_id']) && $row['od_id']) + $od_id = $row['od_id']; + else + $od_id = $TOSS_ORDERID; + + // 미수금 정보 재계산 + $info = get_order_info($od_id); + + if($info) { + $sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}', + od_status = '주문', + od_cash = 0, + od_cash_no = '', + od_cash_info = '' + where od_id = '{$od_id}' "; + sql_query($sql, FALSE); + + // 장바구니 상태 롤백 (입금 → 주문) + $sql = " update {$g5['g5_shop_cart_table']} + set ct_status = '주문' + where od_id = '{$od_id}' "; + sql_query($sql, FALSE); + } + + // SMS 발송 - 재입금 안내 + $sms_message = ''; + + // 개인결제인지 일반주문인지 확인하여 연락처 조회 + if($row['pp_id']) { + // 개인결제인 경우 + $customer_name = $row['pp_name']; + $customer_phone = $row['pp_hp'] ? $row['pp_hp'] : ($row['pp_tel'] ? $row['pp_tel'] : ''); + $title = "개인결제번호 {$TOSS_ORDERID}"; + } else { + // 일반주문인 경우 + $customer_name = $row['od_name']; + $customer_phone = $row['od_hp'] ? $row['od_hp'] : ($row['od_tel'] ? $row['od_tel'] : ''); + $title = "주문번호 {$od_id}"; + } + + if($customer_phone) { + $sms_message = "{$customer_name}님, {$title} 가상계좌 입금이 완료되지 않았습니다. 재입금 또는 관리자 문의 바랍니다.\n"; + $sms_message .= $default['de_admin_company_name']; + } + + // 전화번호가 있고 SMS 발송 설정이 활성화된 경우에만 발송 + if($customer_phone && $sms_message && $config['cf_icode_id'] && $config['cf_icode_pw']) { + // SMS 발송 + $sms_messages = array(); + $receive_number = preg_replace("/[^0-9]/", "", $customer_phone); // 수신자번호 + $send_number = preg_replace("/[^0-9]/", "", $default['de_admin_company_tel']); // 발신자번호 + $sms_messages[] = array('recv' => $receive_number, 'send' => $send_number, 'cont' => $sms_message); + + // SMS 발송 처리 + if($config['cf_sms_type'] == 'LMS') { + include_once(G5_LIB_PATH.'/icode.lms.lib.php'); + + $port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']); + + if($port_setting !== false) { + $SMS = new LMS; + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + for($s=0; $sAdd($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + $SMS->Send(); + $SMS->Init(); + } + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + + for($s=0; $sAdd($recv_number, $send_number, $config['cf_icode_id'], $sms_content, ""); + } + + $SMS->Send(); + $SMS->Init(); + } + + // SMS 발송 로그 기록 + write_toss_log("가상계좌 재입금 안내 SMS 발송 완료", $TOSS_ORDERID, "SMS_SENT"); + } + } +} + +/** + * 입금 전 취소 처리 + */ +elseif($TOSS_STATUS == "CANCELED") +{ + $sql = " update {$g5['g5_shop_order_table']} + set od_shop_memo = concat(od_shop_memo, \"\\n가상계좌 입금 전 취소 - ".date('Y-m-d H:i:s')."\") + where od_id = '{$TOSS_ORDERID}' "; + $result = sql_query($sql, FALSE); +} + +//************************************************************************************ +// 위에서 상점 데이터베이스에 등록 성공유무에 따라서 성공시에는 성공응답인 `HTTP 200` 상태 코드를 리턴해야 합니다. +// (주의) 성공응답인 `HTTP 200` 상태 코드를 리턴하지 않으면 토스페이먼츠에서 7회까지 재전송에 실패하면 웹훅 상태가 실패로 변경됩니다. + +// 토스페이먼츠 로그 기록 (nicepay 형태) +if($payLog) { + $logfile = fopen($log_file, "a+"); + + // 은행명 조회 + $bankName = ''; + if($bankCode && isset($toss->bankCode[$bankCode])) { + $bankName = $toss->bankCode[$bankCode]; + } + + fwrite( $logfile,"************************************************\r\n"); + fwrite( $logfile,"GoodsName : 토스페이먼츠 가상계좌\r\n"); + fwrite( $logfile,"OrderId : ".$TOSS_ORDERID."\r\n"); + fwrite( $logfile,"Status : ".$TOSS_STATUS."\r\n"); + fwrite( $logfile,"ResultMsg : ".($result ? "SUCCESS" : "FAIL")."\r\n"); + fwrite( $logfile,"Amt : ".$totalAmount."\r\n"); + fwrite( $logfile,"name : ".$customerName."\r\n"); + fwrite( $logfile,"TID : ".$paymentKey."\r\n"); + fwrite( $logfile,"AuthDate : ".$approvedAt."\r\n"); + fwrite( $logfile,"VbankNum : ".$accountNumber."\r\n"); + fwrite( $logfile,"VbankCode : ".$bankCode."\r\n"); + fwrite( $logfile,"VbankName : ".$bankName."\r\n"); + fwrite( $logfile,"VbankInputName: ".$depositorName."\r\n"); + fwrite( $logfile,"RcptTID : ".$RcptTID."\r\n"); + fwrite( $logfile,"RcptAuthCode : ".$RcptAuthCode."\r\n"); + fwrite( $logfile,"RcptType : ".$RcptType."\r\n"); + fwrite( $logfile,"************************************************\r\n"); + + fclose( $logfile ); +} + +if ($result) +{ + http_response_code(200); // 절대로 지우지마세요 + echo "OK"; + exit; +} +else +{ + http_response_code(400); + echo "FAIL"; + exit; +} + +//************************************************************************************* \ No newline at end of file diff --git a/shop/toss/_common.php b/shop/toss/_common.php new file mode 100644 index 000000000..c7ed3c4ee --- /dev/null +++ b/shop/toss/_common.php @@ -0,0 +1,2 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/shop/toss/orderform.3.php b/shop/toss/orderform.3.php new file mode 100644 index 000000000..04b7d01e6 --- /dev/null +++ b/shop/toss/orderform.3.php @@ -0,0 +1,16 @@ + + + + + + diff --git a/shop/toss/orderform.4.php b/shop/toss/orderform.4.php new file mode 100644 index 000000000..4e5ea2114 --- /dev/null +++ b/shop/toss/orderform.4.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/shop/toss/orderpartcancel.inc.php b/shop/toss/orderpartcancel.inc.php new file mode 100644 index 000000000..59044418e --- /dev/null +++ b/shop/toss/orderpartcancel.inc.php @@ -0,0 +1,61 @@ +setPaymentHeader(); + +$od_id = isset($od['od_id']) ? $od['od_id'] : (isset($pp['pp_id']) ? $pp['pp_id'] : ''); + +if (!$toss->getPaymentByOrderId($od_id)) { + alert('결제정보를 가져올 수 없습니다.'); +} + +$toss->setCancelData(array( + 'paymentKey' => $toss->responseData['paymentKey'], + 'cancelReason' => $mod_memo, + 'cancelAmount' => (int)$tax_mny + (int)$free_mny, + 'taxFreeAmount' => (int)$free_mny, +)); +if (!$toss->cancelPayment()) { + $msg = '결제 부분취소 요청이 실패하였습니다.\\n\\n'; + if (isset($toss->responseData['message'])) { + $msg .= '사유 : ' . $toss->responseData['message'] . '\\n'; + } + if (isset($toss->responseData['code'])) { + $msg .= '코드 : ' . $toss->responseData['code']; + } + alert($msg); +} + +// 환불금액 기록 +$mod_mny = (int)$tax_mny + (int)$free_mny; +$sql = " update {$g5['g5_shop_order_table']} + set od_refund_price = od_refund_price + '$mod_mny', + od_shop_memo = concat(od_shop_memo, \"$mod_memo\") + where od_id = '{$od['od_id']}'"; +sql_query($sql); + +// 미수금 등의 정보 업데이트 +$info = get_order_info($od_id); + +$sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}', + od_tax_mny = '{$info['od_tax_mny']}', + od_vat_mny = '{$info['od_vat_mny']}', + od_free_mny = '{$info['od_free_mny']}' + where od_id = '$od_id' "; +sql_query($sql); \ No newline at end of file diff --git a/shop/toss/returnurl.php b/shop/toss/returnurl.php new file mode 100644 index 000000000..434cf9ad5 --- /dev/null +++ b/shop/toss/returnurl.php @@ -0,0 +1,67 @@ + + +'.PHP_EOL; + +echo make_order_field($data, $exclude); + +echo ''.PHP_EOL; +?> + + + + + + + +
    +

    + +
    +

    주문정보

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    주문 번호
    상품 정보
    주문자 이름
    주문자 E-Mail
    주문자 전화번호
    +
    +
    + +
    +

    현금영수증 발급 정보

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    원 거래 시각
    발행 용도 + + + + +
    + + + ("-" 생략) +
    거래금액 총합
    공급가액
    봉사료
    부가가치세
    +
    + +
    + + + + +
    + +
    +
    + +
    \ No newline at end of file diff --git a/shop/toss/taxsave_result.php b/shop/toss/taxsave_result.php new file mode 100644 index 000000000..188c0a283 --- /dev/null +++ b/shop/toss/taxsave_result.php @@ -0,0 +1,192 @@ +개인결제 내역이 존재하지 않습니다.

    '); + + $od_tno = $od['pp_tno']; + $goods_name = $od['pp_name'].'님 개인결제'; + $settle_case = $od['pp_settle_case']; + $order_price = $od['pp_receipt_price']; + $od_casseqno = $od['pp_casseqno']; + $od_name = $od['pp_name']; + $od_email = $od['pp_email']; + $od_tel = $od['pp_hp']; +} else { + $od = sql_fetch(" select * from {$g5['g5_shop_order_table']} where od_id = '$od_id' "); + if (!$od) + die('

    주문서가 존재하지 않습니다.

    '); + + $od_tno = $od['od_tno']; + $goods = get_goods($od['od_id']); + $goods_name = $goods['full_name']; + $settle_case = $od['od_settle_case']; + $order_price = $od['od_tax_mny'] + $od['od_vat_mny'] + $od['od_free_mny']; + $od_casseqno = $od['od_casseqno']; + $od_name = $od['od_name']; + $od_email = $od['od_email']; + $od_tel = $od['od_tel']; +} + +switch($settle_case) { + case '가상계좌': + case '계좌이체': + case '무통장': + // 토스페이먼츠는 결제수단 구분 없이 현금영수증 발급 가능 + break; + default: + die('

    현금영수증은 무통장, 가상계좌, 계좌이체에 한해 발급요청이 가능합니다.

    '); + break; +} + +// 토스페이먼츠 현금영수증 발급 요청 +$orderId = $od_id; +$amount = $order_price; +$type = ($_POST['tr_code'] == '0') ? '소득공제' : '지출증빙'; +$customerIdentityNumber = $_POST['id_info']; +$orderName = $od_name; +$customerEmail = $_POST['buyeremail'] ?: $od_email; +$customerMobilePhone = $_POST['buyertel'] ?: $od_tel; + +// 토스페이먼츠 현금영수증 발급 API 호출 +$toss->setCashReceiptsData([ + 'orderId' => $orderId, + 'amount' => $amount, + 'type' => $type, + 'customerIdentityNumber' => $customerIdentityNumber, + 'orderName' => $goods_name, +]); +$toss_result = $toss->issueCashReceipt(); + +/* + * 토스페이먼츠 현금영수증 발급 요청 결과처리 + */ +if ($toss_result && isset($toss->responseData['receiptKey'])) { + // 현금영수증 발급 성공 + $data = $toss->responseData; + $receiptKey = $data['receiptKey']; // 현금영수증 발급 키 + $cash_no = $data['issueNumber']; // 현금영수증 발급 번호 + $approvedAt = $data['requestedAt']; + + $cash = array(); + $cash['receiptKey'] = $receiptKey; + $cash['approvedAt'] = $approvedAt; + $cash['orderId'] = $data['orderId']; + $cash['amount'] = $data['amount']; + $cash['type'] = $data['type']; + $cash['receiptUrl'] = $data['receiptUrl']; + $cash_info = serialize($cash); + + if($tx == 'personalpay') { + $sql = " update {$g5['g5_shop_personalpay_table']} + set pp_cash = '1', + pp_cash_no = '$cash_no', + pp_cash_info = '$cash_info' + where pp_id = '$orderId' "; + } else { + $sql = " update {$g5['g5_shop_order_table']} + set od_cash = '1', + od_cash_no = '$cash_no', + od_cash_info = '$cash_info' + where od_id = '$orderId' "; + } + + $result = sql_query($sql, false); + + if(!$result) { // DB 정보갱신 실패시 취소 + $cancel_result = $toss->cancelCashReceipt($receiptKey, 'DB 업데이트 실패로 인한 취소'); + + if (!$cancel_result) { + $msg = '현금영수증 취소 요청처리가 정상적으로 완료되지 않았습니다.\\n'. $toss->responseData['message']; + alert_close($msg); + } + } + +} else { + // API 요청 실패 화면처리 + $msg = '현금영수증 발급 요청처리가 정상적으로 완료되지 않았습니다.\\n'. $toss->responseData['message']; + alert($msg); +} + +$g5['title'] = ''; +include_once(G5_PATH.'/head.sub.php'); +?> + + + + +
    +

    현금영수증 - 토스페이먼츠

    + +
    + + + + + + + responseData['receiptKey'])): ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    결과발급 완료
    현금영수증 발급번호responseData['issueNumber']; ?>
    주문번호responseData['orderId']; ?>
    발급 유형responseData['type']; ?>
    금액responseData['amount']); ?>원
    승인시간responseData['requestedAt'])); ?>
    현금영수증 확인 + +

    영수증 확인은 실 등록의 경우에만 가능합니다.

    +
    결과발급 실패
    오류 메시지
    +
    + +
    + + '한국산업은행', + '03' => 'IBK기업은행', + '06' => 'KB국민은행', + '07' => 'Sh수협은행', + '11' => 'NH농협은행', + '12' => '단위농협(지역농축협)', + '20' => '우리은행', + '23' => 'SC제일은행', + '27' => '씨티은행', + '31' => 'iM뱅크(대구)', + '32' => '부산은행', + '34' => '광주은행', + '35' => '제주은행', + '37' => '전북은행', + '39' => '경남은행', + '45' => '새마을금고', + '48' => '신협', + '50' => '저축은행중앙회', + '54' => '홍콩상하이은행', + '64' => '산림조합', + '71' => '우체국예금보험', + '81' => '하나은행', + '88' => '신한은행', + '89' => '케이뱅크', + '90' => '카카오뱅크', + '92' => '토스뱅크', + + // 증권 + 'S0' => '유안타증권', + 'S2' => '신한금융투자', + 'S3' => '삼성증권', + 'S4' => 'KB증권', + 'S5' => '미래에셋증권', + 'S6' => '한국투자증권', + 'S8' => '교보증권', + 'S9' => '아이엠증권', + 'SA' => '현대차증권', + 'SB' => '키움증권', + 'SD' => 'SK증권', + 'SE' => '대신증권', + 'SG' => '한화투자증권', + 'SH' => '하나금융투자', + 'SI' => 'DB금융투자', + 'SJ' => '유진투자증권', + 'SK' => '메리츠증권', + 'SM' => '부국증권', + 'SN' => '신영증권', + 'SO' => 'LIG투자증권', + 'SP' => 'KTB투자증권(다올투자증권)', + 'SQ' => '카카오페이증권', + 'SR' => '펀드온라인코리아(한국포스증권)', + 'ST' => '토스증권' + ); + + public array $cardCode = array( + '3K' => '기업 BC', + '46' => '광주은행', + '71' => '롯데카드', + '30' => '한국산업은행', + '31' => 'BC카드', + '51' => '삼성카드', + '38' => '새마을금고', + '41' => '신한카드', + '62' => '신협', + '36' => '씨티카드', + '33' => '우리BC카드(BC 매입)', + 'W1' => '우리카드(우리 매입)', + '37' => '우체국예금보험', + '39' => '저축은행중앙회', + '35' => '전북은행', + '42' => '제주은행', + '15' => '카카오뱅크', + '3A' => '케이뱅크', + '24' => '토스뱅크', + '21' => '하나카드', + '61' => '현대카드', + '11' => 'KB국민카드', + '91' => 'NH농협카드', + '34' => 'Sh수협은행', + 'PCP' => '페이코', + 'KBS' => 'KB증권' + ); + + // 간편결제 제공업체 코드 + public array $easyPayCode = array( + 'TOSSPAY' => '토스페이', + 'NAVERPAY' => '네이버페이', + 'SAMSUNGPAY' => '삼성페이', + 'APPLEPAY' => '애플페이', + 'LPAY' => '엘페이', + 'KAKAOPAY' => '카카오페이', + 'PINPAY' => '핀페이', + 'PAYCO' => '페이코', + 'SSG' => 'SSG페이' + ); + + public function __construct(string $clientKey, string $secretKey, string $mId) { + $this->clientKey = $clientKey; + $this->secretKey = $secretKey; + $this->mId = $mId; + } + + /** + * 헤더 시크릿 키 설정 + * @return void + */ + private function setHeaderSecretKey(): void + { + $this->headerSecretKey = base64_encode($this->secretKey . ':'); + } + + /** + * 헤더 설정 + * @return void + */ + public function setPaymentHeader(): void + { + $this->setHeaderSecretKey(); + + $this->headers = array( + 'Authorization: Basic ' . $this->headerSecretKey, + 'Content-Type' => 'Content-Type: application/json' + ); + } + + /** + * 결제 데이터 설정 + * + * @param array $request + * @return void + */ + public function setPaymentData(array $request): void + { + $this->paymentData = array( + 'amount' => $request['amount'], + 'orderId' => $request['orderId'], + 'paymentKey' => $request['paymentKey'], + ); + } + + /** + * 주문번호로 결제정보 조회 + * + * @param string $orderId + * @return bool + */ + public function getPaymentByOrderId(string $orderId): bool + { + if (empty($orderId)) { + return false; + } + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, str_replace('{orderId}', $orderId, $this->paymentUrl)); + curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); + curl_setopt($curl, CURLOPT_SSLVERSION, 6); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_TIMEOUT, 20); + + $response = curl_exec($curl); + + $return_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $this->responseData = json_decode($response, true); + + curl_close($curl); + + // 결제 실패 상황인 경우 + if ($return_status != 200) { + return false; + } + + return true; + } + + /** + * 결제 승인 + * + * @return bool + */ + public function approvePayment(): bool { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $this->acceptUrl); + curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->paymentData)); + curl_setopt($curl, CURLOPT_SSLVERSION, 6); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_TIMEOUT, 20); + + $response = curl_exec($curl); + + $return_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $this->responseData = json_decode($response, true); + + curl_close($curl); + + // 결제 실패 상황인 경우 + if ($return_status != 200 || ($this->responseData['status'] != 'DONE' && $this->responseData['status'] != 'WAITING_FOR_DEPOSIT')) { + return false; + } + + return true; + } + + /** + * 결제 취소 데이터 설정 + * + * @param array $request + * @return void + */ + public function setCancelData(array $request): void + { + $this->cancelData = array( + 'paymentKey' => $request['paymentKey'], + 'cancelReason' => $request['cancelReason'], + ); + + // 부분취소 금액이 있는 경우 + if (isset($request['cancelAmount']) && $request['cancelAmount'] > 0) { + $this->cancelData['cancelAmount'] = $request['cancelAmount']; + } + + // 면세금액이 있는 경우 + if (isset($request['taxFreeAmount']) && $request['taxFreeAmount'] > 0) { + $this->cancelData['taxFreeAmount'] = $request['taxFreeAmount']; + } + + // 환불 계좌정보가 있는 경우 (가상계좌) + if (isset($request['refundReceiveAccount']) && is_array($request['refundReceiveAccount'])) { + $this->cancelData['refundReceiveAccount'] = array( + 'bank' => $request['refundReceiveAccount']['bank'], + 'accountNumber' => $request['refundReceiveAccount']['accountNumber'], + 'holderName' => $request['refundReceiveAccount']['holderName'], + ); + } + } + + /** + * 결제 취소 + * + * @return bool + */ + public function cancelPayment(): bool + { + // 취소에 필요한 결제 키가 있는지 여부 + if (empty($this->cancelData['paymentKey'])) { + return false; + } + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, str_replace('{paymentKey}', $this->cancelData['paymentKey'], $this->cancelUrl)); + curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->cancelData)); + curl_setopt($curl, CURLOPT_SSLVERSION, 6); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_TIMEOUT, 20); + + $response = curl_exec($curl); + + $return_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $this->responseData = json_decode($response, true); + + curl_close($curl); + + // 결제 실패 상황인 경우 + if ($return_status != 200) { + return false; + } + + return true; + } + + /** + * 현금영수증 발급 데이터 설정 + */ + public function setCashReceiptsData(array $request): void + { + $this->cashReceiptsData = array( + 'amount' => $request['amount'], + 'orderId' => $request['orderId'], + 'type' => $request['type'], + 'customerIdentityNumber' => $request['customerIdentityNumber'], + 'orderName' => $request['orderName'], + ); + } + + /** + * 현금영수증 발급 + */ + public function issueCashReceipt(): bool + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $this->cashReceiptsUrl); + curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->cashReceiptsData)); + curl_setopt($curl, CURLOPT_SSLVERSION, 6); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_ENCODING, ""); + curl_setopt($curl, CURLOPT_MAXREDIRS, 10); + curl_setopt($curl, CURLOPT_TIMEOUT, 20); + curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); + + $response = curl_exec($curl); + + $return_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $this->responseData = json_decode($response, true); + + curl_close($curl); + + // 결제 실패 상황인 경우 + if ($return_status != 200) { + return false; + } + + return true; + } + + /** + * 현금영수증 발급 취소 + */ + public function cancelCashReceipt($receiptKey): bool + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $this->cashReceiptsUrl."/".$receiptKey."/cancel"); + curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); + curl_setopt($curl, CURLOPT_SSLVERSION, 6); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_ENCODING, ""); + curl_setopt($curl, CURLOPT_MAXREDIRS, 10); + curl_setopt($curl, CURLOPT_TIMEOUT, 20); + curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); + + $response = curl_exec($curl); + + $return_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $this->responseData = json_decode($response, true); + + curl_close($curl); + + // 결제 실패 상황인 경우 + if ($return_status != 200) { + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/shop/toss/toss_approval.php b/shop/toss/toss_approval.php new file mode 100644 index 000000000..c31311ae6 --- /dev/null +++ b/shop/toss/toss_approval.php @@ -0,0 +1,79 @@ +setPaymentData([ + 'orderId' => $orderId, + 'amount' => $amount, + 'paymentKey' => $paymentKey, +]); + +// 장바구니 ID 설정 (바로구매 여부 확인) +$ss_cart_id = get_session('ss_direct') ? get_session('ss_cart_direct') : get_session('ss_cart_id'); + +// 임시데이터에 결제 데이터 저장 +$addQuery = ""; +if (isset($orderId)) { + $addQuery .= " AND od_id = '$orderId'"; +} +if (isset($ss_cart_id)) { + $addQuery .= " AND cart_id = '$ss_cart_id'"; +} +if (isset($member['mb_id'])) { + $addQuery .= " AND mb_id = '{$member['mb_id']}'"; +} + +if (empty($orderId) && empty($ss_cart_id)) { + alert('주문정보가 올바르지 않습니다.'); + exit; +} + +// 기존 dt_data 가져오기 +$sql = " + SELECT * FROM {$g5['g5_shop_order_data_table']} + WHERE 1=1 + {$addQuery} + LIMIT 1 +"; +$res = sql_fetch($sql); +$dt_data = []; +if (isset($res['dt_data'])) { + $dt_data = unserialize(base64_decode($res['dt_data'])); +} + +// dt_data 에 결제 키 추가 +if (isset($paymentKey)) { + $dt_data['paymentKey'] = $paymentKey; + $dt_data_new = base64_encode(serialize($dt_data)); + + // 업데이트 + $sql = " + UPDATE {$g5['g5_shop_order_data_table']} SET + dt_data = '".$dt_data_new."' + WHERE od_id = '$orderId' + {$addQuery} + "; + sql_query($sql); +} + +if(isset($payReqMap['pp_id']) && $payReqMap['pp_id']) { + $page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.$payReqMap['pp_id']; +} else { + $page_return_url = G5_SHOP_URL.'/orderform.php'; + if ($_SESSION['ss_direct']) { + $page_return_url .= '?sw_direct=1'; + } +} +?> diff --git a/shop/toss/toss_cancel.php b/shop/toss/toss_cancel.php new file mode 100644 index 000000000..8738a0597 --- /dev/null +++ b/shop/toss/toss_cancel.php @@ -0,0 +1,38 @@ +setPaymentHeader(); + +$od_id = isset($od['od_id']) ? $od['od_id'] : (isset($pp['pp_id']) ? $pp['pp_id'] : ''); + +if (!$toss->getPaymentByOrderId($od_id)) { + alert('결제정보를 가져올 수 없습니다.'); +} + +$toss->setCancelData(array( + 'paymentKey' => $toss->responseData['paymentKey'], + 'cancelReason' => $cancel_msg, +)); +if (!$toss->cancelPayment()) { + $msg = '결제 취소에 실패하였습니다.\\n'; + if (isset($toss->responseData['message'])) { + $msg .= '사유 : ' . $toss->responseData['message'] . '\\n'; + } + if (isset($toss->responseData['code'])) { + $msg .= '코드 : ' . $toss->responseData['code']; + } + alert($msg); +} \ No newline at end of file diff --git a/shop/toss/toss_result.php b/shop/toss/toss_result.php new file mode 100644 index 000000000..6e86aa212 --- /dev/null +++ b/shop/toss/toss_result.php @@ -0,0 +1,108 @@ +setPaymentData([ + 'amount' => $amount, + 'orderId' => $orderId, + 'paymentKey' => $paymentKey +]); +$toss->setPaymentHeader(); + +// 결제승인 요청 +$result = $toss->approvePayment(); + +if ($result) { + // 결제승인 성공시 처리 + $status = isset($toss->responseData['status']) ? $toss->responseData['status'] : ''; + $method = isset($toss->responseData['method']) ? $toss->responseData['method'] : ''; + + // 가상계좌(VIRTUAL_ACCOUNT)만 입금대기(WAITING_FOR_DEPOSIT) 상태 값을 가질 수 있음 + if ($status === 'DONE' || ($status === 'WAITING_FOR_DEPOSIT' && $method === '가상계좌')) { + // 공통 DB처리 변수 설정 + $tno = isset($toss->responseData['paymentKey']) ? $toss->responseData['paymentKey'] : ''; + $amount = isset($toss->responseData['totalAmount']) ? $toss->responseData['totalAmount'] : 0; + $escw_yn = $toss->responseData['useEscrow'] === true ? 'Y' : 'N'; + $app_time = isset($toss->responseData['approvedAt']) ? date('Y-m-d H:i:s', strtotime($toss->responseData['approvedAt'])) : ''; + + // 결제수단별 데이터 처리 (카드, 가상계좌, 계좌이체, 휴대폰, 간편결제 순) + if ($method === '카드') { + // 카드 + $app_no = $od_app_no = isset($toss->responseData['card']['approveNo']) ? $toss->responseData['card']['approveNo'] : '00000000'; + $card_name = isset($toss->cardCode[$toss->responseData['card']['issuerCode']]) ? $toss->cardCode[$toss->responseData['card']['issuerCode']] : ''; + } else if ($method === '가상계좌') { + // 가상계좌 + $bank_name = $bankname = isset($toss->bankCode[$toss->responseData['virtualAccount']['bankCode']]) ? $toss->bankCode[$toss->responseData['virtualAccount']['bankCode']] : ''; + $depositor = isset($toss->responseData['virtualAccount']['customerName']) ? $toss->responseData['virtualAccount']['customerName'] : ''; + $account = isset($toss->responseData['virtualAccount']['accountNumber']) ? $toss->responseData['virtualAccount']['accountNumber'] : ''; + } else if ($method === '계좌이체') { + // 계좌이체 + $bank_name = isset($toss->bankCode[$toss->responseData['transfer']['bankCode']]) ? $toss->bankCode[$toss->responseData['transfer']['bankCode']] : ''; + + // 현금영수증 데이터 처리 + $cashReceiptType = isset($toss->responseData['cashReceipt']['type']) ? $toss->responseData['cashReceipt']['type'] : ''; + $RcptType = $cashReceiptType === '소득공제' ? '1' : ($cashReceiptType === '지출증빙' ? '2' : '0'); + $RcptTID = isset($toss->responseData['cashReceipt']['receiptKey']) ? $toss->responseData['cashReceipt']['receiptKey'] : ''; // 현금영수증 TID, 현금영수증 거래인 경우 리턴 + $RcptAuthCode = isset($toss->responseData['cashReceipt']['issueNumber']) ? $toss->responseData['cashReceipt']['issueNumber'] : ''; // 현금영수증 승인번호, 현금영수증 거래인 경우 리턴 + $RcptReceiptUrl = isset($toss->responseData['cashReceipt']['receiptUrl']) ? $toss->responseData['cashReceipt']['receiptUrl'] : ''; // 현금영수증 URL + + // 현금영수증 발급시 1 또는 2 이면 + if ($RcptType) { + $pg_receipt_infos['od_cash'] = 1; // 현금영수증 발급인것으로 처리 + $pg_receipt_infos['od_cash_no'] = $RcptAuthCode; // 현금영수증 승인번호 + $pg_receipt_infos['od_cash_info'] = serialize(array('TID'=>$RcptTID, 'ApplNum'=>$RcptAuthCode, 'receiptUrl'=>$RcptReceiptUrl)); + } + } else if ($method === '휴대폰') { + // 휴대폰 + $mobile_no = isset($toss->responseData['mobilePhone']['customerMobilePhone']) ? $toss->responseData['mobilePhone']['customerMobilePhone'] : ''; + } else if ($method === '간편결제') { + // 간편결제 + $provider = isset($toss->responseData['easyPay']['provider']) ? $toss->responseData['easyPay']['provider'] : ''; + $card_name = isset($toss->easyPayCode[$provider]) ? $toss->easyPayCode[$provider] : $provider; + } + } else { + + if(G5_IS_MOBILE) { + if(isset($_POST['pp_id']) && $_POST['pp_id']) { + $page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.get_session('ss_personalpay_id'); + } else { + $page_return_url = G5_SHOP_URL.'/orderform.php'; + if(get_session('ss_direct')) + $page_return_url .= '?sw_direct=1'; + } + + alert($toss->responseData['message'].' 코드 : '.$toss->responseData['code'], $page_return_url); + } else { + alert($toss->responseData['message'].' 코드 : '.$toss->responseData['code'], G5_SHOP_URL.'/orderform.php'); + } + } +} else { + alert($toss->responseData['message'].' 코드 : '.$toss->responseData['code'], G5_SHOP_URL); +} \ No newline at end of file diff --git a/theme/basic/shop/orderinquiryview.php b/theme/basic/shop/orderinquiryview.php index f248543c6..868f81771 100644 --- a/theme/basic/shop/orderinquiryview.php +++ b/theme/basic/shop/orderinquiryview.php @@ -461,7 +461,9 @@ if($od['od_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $hp_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; - } else if($od['od_pg'] == 'inicis') { + } else if($od['od_pg'] == 'toss') { + $hp_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/phone?transactionId='.$od['od_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; + } else if($od['od_pg'] == 'inicis') { $hp_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'nicepay') { $hp_receipt_script = 'window.open(\'https://npg.nicepay.co.kr/issue/IssueLoader.do?type=0&TID='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; @@ -482,7 +484,9 @@ if($od['od_pg'] == 'lg') { $LGD_HASHDATA = md5($LGD_MID.$LGD_TID.$LGD_MERTKEY); $card_receipt_script = 'showReceiptByTID(\''.$LGD_MID.'\', \''.$LGD_TID.'\', \''.$LGD_HASHDATA.'\');'; - } else if($od['od_pg'] == 'inicis') { + } else if($od['od_pg'] == 'toss') { + $card_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/redirection?transactionId='.$od['od_tno'].'&ref=PX\',\'receipt\',\'width=430,height=700\');'; + } else if($od['od_pg'] == 'inicis') { $card_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; } else if($od['od_pg'] == 'nicepay') { $card_receipt_script = 'window.open(\'https://npg.nicepay.co.kr/issue/IssueLoader.do?type=0&TID='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');'; @@ -555,7 +559,9 @@ if($od['od_pg'] == 'lg') { break; } $cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$od['od_id'].'\',\''.$od['od_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');'; - } else if($od['od_pg'] == 'inicis') { + } else if($od['od_pg'] == 'toss') { + $cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$od['od_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');'; + } else if($od['od_pg'] == 'inicis') { $cash = unserialize($od['od_cash_info']); $cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');'; } else if($od['od_pg'] == 'nicepay') { From f4718a71a297f1679eefb0d646ecea4e4eac22e0 Mon Sep 17 00:00:00 2001 From: chym1217 Date: Wed, 17 Sep 2025 10:44:40 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=86=A0=EC=8A=A4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EB=A8=BC=EC=B8=A0=20=EB=AA=85=EC=B9=AD=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EA=B2=B0?= =?UTF-8?q?=EC=A0=9C=20=EC=95=88=EB=82=B4=20=EC=B6=94=EA=B0=80=20-=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20:=20=ED=86=A0=EC=8A=A4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EB=A8=BC=EC=B8=A0=20->=20=ED=86=A0=EC=8A=A4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EB=A8=BC=EC=B8=A0(=EA=B5=AC=EB=B2=84=EC=A0=84)=20-=20=ED=86=A0?= =?UTF-8?q?=EC=8A=A4=ED=8E=98=EC=9D=B4=EB=A8=BC=EC=B8=A0=20V2=20->=20?= =?UTF-8?q?=ED=86=A0=EC=8A=A4=ED=8E=98=EC=9D=B4=EB=A8=BC=EC=B8=A0=20API=20?= =?UTF-8?q?-=20=EA=B8=B0=ED=83=80=20css=20=EB=B0=8F=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adm/css/admin.css | 4 ++-- adm/shop_admin/admin.shop.lib.php | 4 +++- adm/shop_admin/configform.php | 30 +++++++++++++++++------------- adm/shop_admin/orderform.php | 2 +- shop/settle_toss_common.php | 6 +++--- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/adm/css/admin.css b/adm/css/admin.css index 6df934090..470d65d76 100644 --- a/adm/css/admin.css +++ b/adm/css/admin.css @@ -743,8 +743,8 @@ a.nicepay_btn{display:inline-block;margin:5px 0 0;padding:5px 10px;background:#0 ul.de_pg_tab{margin:0;padding:0;zoom:1} ul.de_pg_tab:after{display:block;visibility:hidden;clear:both;content:"";} -ul.de_pg_tab li{position:relative;display:inline-block;float:left;text-align:center;margin:0;padding:0;width:140px} -ul.de_pg_tab li a{margin:0 2px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:2.5;background-color:#f7f7f7;color:#74777b;font-weight:bold;font-size:1.2em;text-decoration:none} +ul.de_pg_tab li{position:relative;display:inline-block;float:left;text-align:center;margin:0;padding:0;min-width:130px} +ul.de_pg_tab li a{margin:0 2px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:2.5;background-color:#f7f7f7;color:#74777b;font-weight:bold;font-size:1.2em;text-decoration:none; padding:0px 10px;} ul.de_pg_tab li a:hover{text-decoration:none} ul.de_pg_tab li.tab-current a{background:#2CC185;color:#fff} diff --git a/adm/shop_admin/admin.shop.lib.php b/adm/shop_admin/admin.shop.lib.php index 737d0d95c..d1aa92857 100644 --- a/adm/shop_admin/admin.shop.lib.php +++ b/adm/shop_admin/admin.shop.lib.php @@ -125,12 +125,15 @@ function pg_setting_check($is_print=false){ $msg = ''; $pg_msg = ''; + $pg_test_conf_link = G5_ADMIN_URL.'/shop_admin/configform.php#de_card_test1'; if( $default['de_card_test'] ){ if( $default['de_pg_service'] === 'kcp' && $default['de_kcp_mid'] && $default['de_kcp_site_key'] ){ $pg_msg = 'NHN KCP'; } else if ( $default['de_pg_service'] === 'lg' && $config['cf_lg_mid'] && $config['cf_lg_mert_key'] ){ $pg_msg = 'LG유플러스'; + } else if ( $default['de_pg_service'] === 'toss' && $config['cf_lg_mid'] && $config['cf_toss_client_key'] && $config['cf_toss_secret_key'] ){ + $msg .= '
    (주의!) 토스페이먼츠 결제의 결제 설정이 현재 테스트결제로 되어 있습니다.
    반드시 상점 API키[테스트]키로 설정한 후 테스트결제를 진행해야합니다.
    쇼핑몰 운영 시에는 실결제로 전환하여 [라이브]키로 설정해 주시기 바랍니다.
    아래 링크를 클릭하여 실결제로 설정하여 운영해 주세요.
    '.$pg_test_conf_link.'
    '; } else if ( $default['de_pg_service'] === 'inicis' && $default['de_inicis_mid'] && $default['de_inicis_sign_key'] ){ $pg_msg = 'KG이니시스'; } else if ( $default['de_pg_service'] === 'nicepay' && $default['de_nicepay_mid'] && $default['de_nicepay_key'] ){ @@ -147,7 +150,6 @@ function pg_setting_check($is_print=false){ } if( $pg_msg ){ - $pg_test_conf_link = G5_ADMIN_URL.'/shop_admin/configform.php#de_card_test1'; $msg .= '
    (주의!) '.$pg_msg.' 결제의 결제 설정이 현재 테스트결제 로 되어 있습니다.
    테스트결제시 실제 결제가 되지 않으므로, 쇼핑몰 운영중이면 반드시 실결제로 설정하여 운영하셔야 합니다.
    아래 링크를 클릭하여 실결제로 설정하여 운영해 주세요.
    '.$pg_test_conf_link.'
    '; } diff --git a/adm/shop_admin/configform.php b/adm/shop_admin/configform.php index 788f7288e..c6397039a 100644 --- a/adm/shop_admin/configform.php +++ b/adm/shop_admin/configform.php @@ -215,7 +215,7 @@ if (! isset($default['de_nicepay_mid'])) { sql_query($sql, false); } -// 토스페이먼츠 버전 2 client, secret key 추가 +// 토스페이먼츠 client, secret key 추가 if( ! isset($config['cf_toss_client_key']) ){ $sql = "ALTER TABLE `{$g5['config_table']}` ADD COLUMN `cf_toss_client_key` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_lg_mert_key`, @@ -656,9 +656,9 @@ if(!$default['de_kakaopay_cancelpwd']){ /settle_nicepay_common.php - 토스페이먼츠v2 가상계좌
    입금통보 URL + 토스페이먼츠 가상계좌
    입금통보 URL - 토스페이먼츠 상점관리자 > 개발자센터 > 웹훅 > 웹훅 등록하기에 URL에 넣으시고, 구독할 이벤트를 [DEPOSIT_CALLBACK]을 선택하셔야 상점에 자동으로 입금 통보됩니다."); ?> + 토스페이먼츠 상점관리자 > 개발자센터 > 웹훅 > 웹훅 등록하기에 URL에 넣으시고, 구독할 이벤트를 [DEPOSIT_CALLBACK]을 선택하셔야 상점에 자동으로 입금 통보됩니다."); ?> /settle_toss_common.php @@ -790,8 +790,8 @@ if(!$default['de_kakaopay_cancelpwd']){ @@ -849,23 +849,23 @@ if(!$default['de_kakaopay_cancelpwd']){ - + - 개발자센터 -> API키 -> 머트 키에서 확인하실 수 있습니다.\n예) 95160cce09854ef44d2edb2bfb05f9f3"); ?> + 개발자센터 -> API키 -> 머트 키에서 확인하실 수 있습니다.\n예) 95160cce09854ef44d2edb2bfb05f9f3"); ?> - - + + - 개발자센터 -> API키 -> 클라이언트 키에서 확인하실 수 있습니다. 예) live_ck_tosspayment\n실결제용 [라이브] 키와 테스트용 [테스트] 키는 서로 다르므로, 테스트로 결제시에는 [테스트] 키로 변경하여 사용해주시기 바랍니다. 예) 테스트 키: test_ck_tosspayment"); ?> + 개발자센터 -> API키 -> 클라이언트 키에서 확인하실 수 있습니다. 예) live_ck_tosspayment\n실결제용 [라이브] 키와 테스트용 [테스트] 키는 서로 다르므로, 테스트로 결제시에는 [테스트] 키로 변경하여 사용해주시기 바랍니다. 예) 테스트 키: test_ck_tosspayment"); ?> - + - 개발자센터 -> API키 -> 시크릿 키에서 확인하실 수 있습니다. 예) live_sk_tosspayment\n실결제용 [라이브] 키와 테스트용 [테스트] 키는 서로 다르므로, 테스트로 결제시에는 [테스트] 키로 변경하여 사용해주시기 바랍니다. 예) 테스트 키: test_sk_tosspayment"); ?> + 개발자센터 -> API키 -> 시크릿 키에서 확인하실 수 있습니다. 예) live_sk_tosspayment\n실결제용 [라이브] 키와 테스트용 [테스트] 키는 서로 다르므로, 테스트로 결제시에는 [테스트] 키로 변경하여 사용해주시기 바랍니다. 예) 테스트 키: test_sk_tosspayment"); ?> @@ -1805,7 +1805,11 @@ function fconfig_check(f) } } else if ( f.de_pg_service.value == "lg" ) { if( f.cf_lg_mid.value && f.cf_lg_mert_key.value && parseInt(f.de_card_test.value) > 0 ){ - pg_msg = "토스페이먼츠"; + pg_msg = "토스페이먼츠(구버전)"; + } + } else if ( f.de_pg_service.value == "toss" ) { + if( f.cf_lg_mid.value && f.cf_toss_client_key.value && f.cf_toss_secret_key.value && parseInt(f.de_card_test.value) > 0 ){ + msg += "(주의!) 토스페이먼츠 결제의 결제 설정이 현재 테스트결제로 되어 있습니다.\n상점 API키를 [테스트]키로 설정한 후 테스트결제를 진행해주세요.\n쇼핑몰 운영중이면 반드시 실결제 전환 및 [라이브]키로 설정하여 운영하셔야 합니다.\n실결제로 변경하려면 결제설정 탭 -> 결제 테스트에서 실결제를 선택해 주세요.\n정말로 테스트결제로 설정하시겠습니까?"; } } else if ( f.de_pg_service.value == "inicis" ) { if( f.de_inicis_mid.value && f.de_inicis_sign_key.value && parseInt(f.de_card_test.value) > 0 ){ diff --git a/adm/shop_admin/orderform.php b/adm/shop_admin/orderform.php index 02e231006..97cd04610 100644 --- a/adm/shop_admin/orderform.php +++ b/adm/shop_admin/orderform.php @@ -515,7 +515,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js switch($od['od_pg']) { case 'lg': $pg_url = 'https://app.tosspayments.com'; - $pg_test = '토스페이먼츠'; + $pg_test = '토스페이먼츠(구버전)'; if ($default['de_card_test']) { $pg_url = 'https://pgweb.tosspayments.com/tmert'; $pg_test .= ' 테스트 '; diff --git a/shop/settle_toss_common.php b/shop/settle_toss_common.php index 07684cbfe..2c7f48f71 100644 --- a/shop/settle_toss_common.php +++ b/shop/settle_toss_common.php @@ -13,7 +13,7 @@ $payLog = true; // 로그 사용 여부 $log_file = G5_DATA_PATH . '/log/tosspayment_result_log.txt'; /** - * 토스페이먼츠 로그 기록 함수 + * 로그 기록 함수 */ function write_toss_log($reason, $orderId = '', $status = '') { @@ -32,7 +32,7 @@ function write_toss_log($reason, $orderId = '', $status = '') } } -// 토스페이먼츠 입금통보 결과 데이터 읽기 +// 입금통보 결과 데이터 읽기 $raw = file_get_contents('php://input'); if ($raw == false) { write_toss_log("입력 데이터 읽기 실패"); @@ -375,7 +375,7 @@ elseif($TOSS_STATUS == "CANCELED") // 위에서 상점 데이터베이스에 등록 성공유무에 따라서 성공시에는 성공응답인 `HTTP 200` 상태 코드를 리턴해야 합니다. // (주의) 성공응답인 `HTTP 200` 상태 코드를 리턴하지 않으면 토스페이먼츠에서 7회까지 재전송에 실패하면 웹훅 상태가 실패로 변경됩니다. -// 토스페이먼츠 로그 기록 (nicepay 형태) +// 로그 기록 if($payLog) { $logfile = fopen($log_file, "a+");