Files
firstgarden-web-gnu/shop/toss/toss.inc.php
2025-09-16 16:34:15 +09:00

373 lines
12 KiB
PHP

<?php
class TossPayments {
// 클라이언트, 시크릿 키, 상점아이디
public string $clientKey;
public string $secretKey;
public string $mId;
public string $headerSecretKey = "";
public string $paymentUrl = "https://api.tosspayments.com/v1/payments/orders/{orderId}";
public string $acceptUrl = "https://api.tosspayments.com/v1/payments/confirm";
public string $cancelUrl = "https://api.tosspayments.com/v1/payments/{paymentKey}/cancel";
public string $cashReceiptsUrl = "https://api.tosspayments.com/v1/cash-receipts";
// 결제데이터
public array $headers = array();
public array $paymentData = array();
public array $cancelData = array();
public array $cashReceiptsData = array();
public array $responseData = array();
public array $bankCode = array(
// 은행
'02' => '한국산업은행',
'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;
}
}