정기결제
카드 정기결제 시작하기
카드 자동 결제는 Billing 정기결제로 카유생비(카드번호, 유효기간, 생년월일, 비밀번호)를 보내 빌링키를 취득 한 후, 원하는 결제시점에 API로 빌링키 + 결제금액을 보내 결제하는 방식입니다.
특성상 빌링키 발급받는 과정만 클라이언트 작업이 필요하며 , 해당 빌링키로 결제를 요청, 예약, 취소하는 작업은 서버사이드에서 이루어집니다.
빌링키란?
구독형 정기결제, 종량제 과금결제 등 원하는 시점에 재 결제를 진행할 수 있는 결제용 암호화 키 입니다. 가맹점이 고객의 카드정보를 소유할 수 없기 때문에 카드사로부터 해당 카드에 대응하는 빌링키 발급 받아 저장하고 원하는 시점에 해당 빌링키로 결제를 청구할 수 있습니다.
진행 순서
- 빌링키 발급 요청합니다.
- 비인증방식 - 개발사의 UI에서 지불수단을 입력받아 PG사에 전달 (클라이언트/서버사이드)
- 빌링키로 결제 요청하기
- 빌링키 조회하기
- API를 통한 빌링키의 정보를 확인 할 수 있습니다.
빌링키를 발급받는 것이 시작이며, 발급된 빌링키로 결제를 요청하거나, 예약하거나, 결제 반복을 구현할 수 있습니다.
빌링키 발급받기 - 비인증방식
기본도메인(요청도메인)
라이브 : https://www.cookiepayments.com [POST]
테스트 : https://sandbox.cookiepayments.com [POST]
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST]
TOKEN 요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
pay2_id |
30 |
cookiepayments에서 발급받은 ID |
필수 |
cookiepayments사에서 부여 |
pay2_key |
50 |
cookiepayments에서 발급받은 연동키 |
필수 |
cookiepayments사에서 부여 |
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
TOKEN 요청 응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RTN_CD |
4 |
결과 코드 |
필수(JSON) |
응답 코드 (성공시 "0000", 그외 에러) |
RTN_MSG |
100 |
결과 메시지 |
필수(JSON) |
응답 메시지 ("성공" 또는 오류 메세지) |
TOKEN |
200 |
인증 TOKEN |
필수(JSON) |
결제요청에 필요한 토큰 |
응답데이터 예
{
"RTN_CD": "0000",
"RTN_MSG": "성공",
"TOKEN": "암호화된코드"
}
빌링키 발행 URL
{요청도메인}/Subscribe/billkeygen [POST]
요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
ApiKey |
제한없음 |
쿠키페이 결제 연동 key |
필수(헤더) |
쿠키페이에서 발급받은 결제 연동 key |
TOKEN |
제한없음 |
인증 TOKEN |
필수(헤더) |
TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID |
20 |
쿠키페이 결제 연동 id |
필수 |
쿠키페이에서 발급받은 결제 연동 id |
ORDERNO |
50 |
주문번호 |
필수 |
각 주문마다 유니크해야 합니다 |
PRODUCTNAME |
40 |
상품명 |
필수 |
& 문자 포함시 오류 발생 |
PRODUCTCODE |
10 |
상품코드 |
필수 |
|
AMOUNT |
10 |
결제 금액 |
필수 |
숫자만 사용합니다, 100원이상일경우 첫결제가 진행됩니다. |
CARDNO |
16 |
카드번호 |
필수 |
숫자만입력 |
EXPIREDT |
4 |
카드유효기간 (YYMM) |
필수 |
유효기간 년월순 |
CARDPWD |
2 |
카드비밀번호 앞 2자리 |
필수 |
카드 비밀번호 앞 2자리 |
CARDAUTH |
6 |
카드소유자 생년월일(YYMMDD) |
필수 |
생년월일 YYMMDD 혹은 사업자번호 10자리 |
QUOTA |
2 |
할부개월 |
필수 |
일시불:00, 2개월:02, ... 12개월:12 (최대12개월) |
TAXFREECD |
1 |
과세여부 |
필수 |
과세:Y, 비과세:N |
BUYERNAME |
20 |
고객명 |
필수 |
결제자 이름 |
PRODUCTTYPE |
1 |
상품구분 |
필수 |
상품구분(1: 디지털, 2: 실물) |
BUYERID |
20 |
고객 ID |
선택 |
|
BUYERADDRESS |
100 |
고객 주소 |
선택 |
|
BUYERPHONE |
20 |
고객 휴대폰번호 |
선택 |
|
BUYEREMAIL |
50 |
고객 e-mail |
선택 |
|
USEHANACARD |
1 |
하나카드로 빌링키 발행시 필요 |
선택 |
키움페이 가맹점 중 하나카드로 빌링키 발행 'Y' * 2024년10월15일 이후 가입 가맹점은 해당사항 없음 |
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 정기결제 API */
curl -H "Content-Type: application/json" \
-H "ApiKey: COOKIEPAY에서 발급받은 연동키" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-d '{
"API_ID": "COOKIEPAY에서 발급받은 가맹점연동 ID",
"ORDERNO": "주문번호",
"PRODUCTNAME": "상품명",
"PRODUCTCODE": "상품코드",
"AMOUNT": "결제금액",
"CARDNO": "카드번호",
"EXPIREDT": "카드유효기간 (YYMM)",
"CARDPWD": "카드비밀번호 앞 2자리",
"CARDAUTH": "카드소유자 생년월일(YYMMDD)",
"QUOTA":"할부개월",
"BUYERNAME": "고객명",
"BUYERID": "고객 ID",
"BUYERPHONE":"고객 휴대폰번호",
"BUYEREMAIL":"고객 E-MAIL",
"PRODUCTTYPE":"2",
}' \
-X POST "{요청도메인}/Subscribe/billkeygen"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
/* 여기 까지 */
if($RES_STR['RTN_CD'] == '0000'){
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
array_push($headers, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
$cookiepayments_url = "{요청도메인}/Subscribe/billkeygen";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'ORDERNO' => '주문번호',
'PRODUCTNAME' => '상품명',
'PRODUCTCODE' => '상품코드',
'AMOUNT' => '결제금액',
'CARDNO' => '카드번호',
'EXPIREDT' => '카드유효기간 (YYMM)',
'CARDPWD' => '카드비밀번호 앞 2자리',
'CARDAUTH' => '카드소유자 생년월일(YYMMDD)',
'QUOTA' => '할부개월',
'BUYERNAME' => '고객명',
'BUYERID' => '고객 ID',
'BUYERPHONE' => '고객 휴대폰번호',
'BUYEREMAIL' => '고객 E-MAIL',
'PRODUCTTYPE' => '2',
);
$cookiepayments_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepayments_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepayments_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA |
|
암호호된 리턴값 |
선택 |
암호회된 리턴값 (성공시 존재) |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"ENC_DATA": "uCAMEsaW+tdhYKcIvzbezan137Igm4u0dEMawS93EhwaaoLE+lAgiMH07ysmVI/q3Ky7X1LOIZ3WuSsGgGkyvQ=="
}
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
복호화 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
복호화 응답 메시지 ("성공" 또는 오류 메세지) |
decryptData |
|
복호화된 데이터 |
필수(JSON) |
|
BILLKEY |
20 |
빌링키 |
필수(JSON) |
정기결제에 사용될 빌링키 |
GENDATE |
50 |
빌링키 생성일자 |
필수(JSON) |
빌링키 생성일자 |
ORDERNO |
50 |
주문번호 |
필수(JSON) |
결제한 주문번호 |
AMOUNT |
10 |
결제 된 금액 |
필수(JSON) |
결제요청시 결제된 금액 |
TID |
50 |
PG 거래 고유번호 |
필수(JSON) |
PG사 결제 거래고유번호 (전표출력 및 결제취소에 사용됩니다) |
ACCEPTDATE |
20 |
승인일시 |
필수(JSON) |
PG사 결제 승인일시 |
ACCEPTNO |
10 |
승인번호 |
필수(JSON) |
PG사 결제 승인번호 |
BUYERNAME |
20 |
고객명 |
필수(JSON) |
|
BUYERID |
20 |
고객 ID |
필수(JSON) |
|
BUYERADDRESS |
100 |
고객 주소 |
필수(JSON) |
|
BUYERPHONE |
20 |
고객 휴대폰번호 |
필수(JSON) |
|
BUYEREMAIL |
50 |
고객 e-mail |
선택(JSON) |
|
CARDCODE |
4 |
카드사코드 |
(JSON) |
PG사가 제공해주는 카드사 코드 (AMOUNT가 '0'일때만 값이 존재) |
복호화 응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"decryptData": {
"BILLKEY": "발급된BILLKEY",
"GENDATE": "20220920135340",
"ORDERNO": "TEST-ORDER-220920-094625",
"AMOUNT": "0",
"TID": "",
"ACCEPTDATE": "",
"ACCEPTNO": "",
"BUYERNAME": "홍길동",
"BUYERID": "BUYERID",
"BUYERADDRESS": "BUYERADDRESS",
"BUYERPHONE": "010-1234-5678",
"BUYEREMAIL": "ufound@gmail.com"
"CARDCODE": "CCLG"
}
}
빌링키 조회하기
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST]
2-2 빌링키 조회 URL
{요청도메인}/Subscribe/billingkeylookup [POST]
요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
ApiKey |
제한없음 |
쿠키페이 결제 연동 key |
필수(헤더) |
쿠키페이에서 발급받은 결제 연동 key |
TOKEN |
제한없음 |
인증 TOKEN |
필수(헤더) |
TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID |
20 |
쿠키페이 결제 연동 id |
필수 |
쿠키페이에서 발급받은 결제 연동 id |
BILLKEY |
20 |
빌링키 |
필수 |
빌링키 발급받기에서 받은 BILLKEY |
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 정기결제 API */
curl -H "Content-Type: application/json" \
-H "ApiKey: COOKIEPAY에서 발급받은 연동키" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-d '{
"API_ID": "COOKIEPAY에서 발급받은 가맹점연동 ID",
"BILLKEY": "빌링키",
}' \
-X POST "{요청도메인}/Subscribe/billingkeylookup"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
/* 여기 까지 */
if($RES_STR['RTN_CD'] == '0000'){
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
array_push($headers, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
$cookiepayments_url = "{요청도메인}/Subscribe/billingkeylookup";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'BILLKEY'=> '빌링키',
);
$cookiepayments_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepayments_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepayments_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA |
|
암호호된 리턴값 |
선택 |
암호회된 리턴값 (성공시 존재) |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"ENC_DATA": "uCAMEsaW+tdhYKcIvzbezan137Igm4u0dEMawS93EhwaaoLE+lAgiMH07ysmVI/q3Ky7X1LOIZ3WuSsGgGkyvQ=="
}
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
decryptData |
|
복호화된 데이터 |
필수(JSON) |
|
BILLKEY |
20 |
빌링키 |
필수(JSON) |
정기결제에 사용될 빌링키 |
GENDATE |
14 |
빌링키 생성일자 |
필수(JSON) |
빌링키 생성일자 |
ORDERNO |
50 |
주문번호 |
필수(JSON) |
빌링키 발급시 결제한 주문번호 |
PRODUCTNAME |
40 |
상품이름 |
필수(JSON) |
빌링키 발급시 등록한 상품명 |
PRODUCTCODE |
10 |
상품코드 |
필수(JSON) |
빌링키 발급시 등록한 상품코드 |
AMOUNT |
10 |
결제 된 금액 |
필수(JSON) |
빌링키 발급시 요청한 결제 금액 |
TAXFREECD |
1 |
과세여부 |
필수(JSON) |
빌링키 발급시 등록한 과세여부 (과세:Y, 비과세:N) |
QUOTA |
2 |
할부개월 |
필수(JSON) |
빌링키 발급시 등록한 할부개월 (기본:00) |
BUYERNAME |
20 |
고객명 |
필수(JSON) |
빌링키 발급시 등록한 고객명 |
BUYERID |
20 |
고객 ID |
필수(JSON) |
빌링키 발급시 등록한 고객 ID |
BUYERADDRESS |
100 |
고객 주소 |
필수(JSON) |
빌링키 발급시 등록한 고객 주소 |
BUYERPHONE |
20 |
고객 휴대폰번호 |
필수(JSON) |
빌링키 발급시 등록한 고객 휴대폰번호 |
BUYEREMAIL |
50 |
고객 e-mail |
선택(JSON) |
빌링키 발급시 등록한 고객 e-mail |
CARDCODE |
4 |
카드사코드 |
(JSON) |
PG사가 제공해주는 카드사 코드 (AMOUNT가 '0'인상태로 빌링키 발급시 값이 존재) |
KEY_STATUS |
4 |
상태 |
필수(JSON) |
사용가능, 사용불가 |
복호화 응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"decryptData": {
"BILLKEY": "조회요청한BILLKEY",
"GENDATE": "20220920135619",
"ORDERNO": "TEST-ORDER-220920-094625",
"PRODUCTNAME": "테스트상품100",
"PRODUCTCODE": "TP-100",
"AMOUNT": "0",
"TAXFREECD": "Y",
"QUOTA": "00",
"BUYERNAME": "홍길동",
"BUYERID": "BUYERID",
"BUYERADDRESS": "BUYERADDRESS",
"BUYERPHONE": "010-1234-5678",
"BUYEREMAIL": "ufound@gmail.com",
"CARDCODE": "",
"KEY_STATUS": "사용가능"
}
}
빌링키 발급 취소하기
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST]
3-2 빌링키 취소 URL
{요청도메인}/Subscribe/billingkeycancel [POST]
요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
ApiKey |
제한없음 |
쿠키페이 결제 연동 key |
필수(헤더) |
쿠키페이에서 발급받은 결제 연동 key |
TOKEN |
제한없음 |
인증 TOKEN |
필수(헤더) |
TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID |
20 |
쿠키페이 결제 연동 id |
필수 |
쿠키페이에서 발급받은 결제 연동 id |
BILLKEY |
20 |
취소할 빌링키 |
필수 |
빌링키 발급받기에서 받은 BILLKEY |
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 정기결제 API */
curl -H "Content-Type: application/json" \
-H "ApiKey: COOKIEPAY에서 발급받은 연동키" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-d '{
"API_ID": "COOKIEPAY에서 발급받은 가맹점연동 ID",
"BILLKEY": "빌링키",
}' \
-X POST "{요청도메인}/Subscribe/billingkeycancel"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
/* 여기 까지 */
if($RES_STR['RTN_CD'] == '0000'){
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
array_push($headers, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
$cookiepayments_url = "{요청도메인}/Subscribe/billingkeycancel";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'BILLKEY'=> '빌링키',
);
$cookiepayments_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepayments_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepayments_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA |
|
암호호된 리턴값 |
선택 |
암호회된 리턴값 (성공시 존재) |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"ENC_DATA": "uCAMEsaW+tdhYKcIvzbezan137Igm4u0dEMawS93EhwaaoLE+lAgiMH07ysmVI/q3Ky7X1LOIZ3WuSsGgGkyvQ=="
}
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
decryptData |
|
복호화된 데이터 |
필수(JSON) |
|
BILLKEY |
20 |
취소된 BILLKEY |
필수(JSON) |
취소된 BILLKEY, 성공시 사용 못함. |
복호화 응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"decryptData": {
"BILLKEY": "취소된 BILLKEY",
}
}
빌링키로 결제 요청하기
기본도메인(요청도메인)
라이브 : https://www.cookiepayments.com [POST]
테스트 : https://sandbox.cookiepayments.com [POST]
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST]
빌링키로 결제 요청 URL
{요청도메인}/Subscribe/payments [POST]
요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
ApiKey |
제한없음 |
쿠키페이 결제 연동 key |
필수(헤더) |
쿠키페이에서 발급받은 결제 연동 key |
TOKEN |
제한없음 |
인증 TOKEN |
필수(헤더) |
TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID |
20 |
쿠키페이 결제 연동 id |
필수 |
쿠키페이에서 발급받은 결제 연동 id |
BILLKEY |
20 |
빌링키 |
필수(JSON) |
발급받은 빌링키 |
ORDERNO |
50 |
주문번호 |
필수 |
각 주문마다 유니크해야 합니다 |
PRODUCTNAME |
40 |
상품명 |
필수 |
& 문자 포함시 오류 발생 |
PRODUCTCODE |
10 |
상품코드 |
필수 |
|
AMOUNT |
10 |
결제 금액 |
필수 |
숫자만 사용합니다, 100원이상일경우 첫결제가 진행됩니다. |
TAXFREECD |
1 |
과세여부 |
필수 |
과세:Y, 비과세:N |
QUOTA |
2 |
할부개월 |
필수 |
일시불:00, 2개월:02, ... 12개월:12 (최대12개월) |
BUYERNAME |
20 |
고객명 |
필수 |
결제자 이름 |
PRODUCTTYPE |
1 |
상품구분 |
필수 |
상품구분(1: 디지털, 2: 실물) |
BUYERID |
20 |
고객 ID |
선택 |
|
BUYERPHONE |
20 |
고객 휴대폰번호 |
선택 |
|
BUYEREMAIL |
50 |
고객 e-mail |
선택 |
|
BUYERADDRESS |
100 |
고객 주소 |
선택 |
|
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 정기결제 API */
curl -H "Content-Type: application/json" \
-H "ApiKey: COOKIEPAY에서 발급받은 연동키" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-d '{
"API_ID": "COOKIEPAY에서 발급받은 가맹점연동 ID",
"BILLKEY": "빌링키",
"ORDERNO": "주문번호",
"PRODUCTNAME": "상품명",
"PRODUCTCODE": "상품코드",
"AMOUNT": "결제금액",
"TAXFREECD":"과세여부",
"QUOTA":"할부개월",
"BUYERID": "고객 ID",
"BUYERNAME": "고객명",
"BUYERPHONE":"고객 휴대폰번호",
"BUYEREMAIL":"고객 E-MAIL",
"BUYERADDRESS":"고객 주소",
"PRODUCTTYPE":"2"
}' \
-X POST "{요청도메인}/Subscribe/payments"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
/* 여기 까지 */
if($RES_STR['RTN_CD'] == '0000'){
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
array_push($headers, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
$cookiepayments_url = "{요청도메인}/Subscribe/payments";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'BILLKEY' => '빌링키',
'ORDERNO' => '주문번호',
'PRODUCTNAME' => '상품명',
'PRODUCTCODE' => '상품코드',
'AMOUNT' => '결제금액',
'TAXFREECD' => '과세여부',
'QUOTA' => '할부개월',
'BUYERID' => '고객 ID',
'BUYERNAME' => '고객명',
'BUYERPHONE' => '고객 휴대폰번호',
'BUYEREMAIL' => '고객 E-MAIL',
'BUYERADDRESS'=>'고객 주소',
'PRODUCTTYPE'=>'2'
);
$cookiepayments_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepayments_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepayments_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA |
|
암호호된 리턴값 |
선택 |
암호회된 리턴값 (성공시 존재) |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"ENC_DATA": "uCAMEsaW+tdhYKcIvzbezan137Igm4u0dEMawS93EhwaaoLE+lAgiMH07ysmVI/q3Ky7X1LOIZ3WuSsGgGkyvQ=="
}
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
복호화 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
복호화 응답 메시지 ("성공" 또는 오류 메세지) |
decryptData |
|
복호화 데이터 |
필수(JSON) |
|
BILLKEY |
20 |
빌링키 |
필수(JSON) |
정기결제에 사용될 빌링키 |
ORDERNO |
50 |
주문번호 |
필수(JSON) |
결제한 주문번호 |
AMOUNT |
10 |
결제 된 금액 |
필수(JSON) |
결제요청시 결제된 금액 |
TID |
50 |
PG 거래 고유번호 |
필수(JSON) |
PG사 결제 거래고유번호 (전표출력 및 결제취소에 사용됩니다) |
ACCEPTDATE |
20 |
승인일시 |
필수(JSON) |
PG사 결제 승인일시 |
ACCEPTNO |
10 |
승인번호 |
필수(JSON) |
PG사 결제 승인번호 |
BUYERNAME |
20 |
고객명 |
필수(JSON) |
|
BUYERID |
20 |
고객 ID |
필수(JSON) |
|
BUYERADDRESS |
100 |
고객 주소 |
필수(JSON) |
|
BUYERPHONE |
20 |
고객 휴대폰번호 |
필수(JSON) |
|
BUYEREMAIL |
50 |
고객 e-mail |
선택(JSON) |
|
복호화 응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"decryptData": {
"BILLKEY": "결제요청한BILLKEY",
"ORDERNO": "TEST-ORDER-220920-094625",
"AMOUNT": "100",
"TID": "cEH000000000000000",
"ACCEPTDATE": "20220528133047",
"ACCEPTNO": "00000000",
"BUYERNAME": "홍길동",
"BUYERID": "guest",
"BUYERADDRESS": "",
"BUYERPHONE": "",
"BUYEREMAIL": ""
}
}
결제정보 검증
결제정보 검증
최종 결제 요청이 브라우저에서 이루어지는 경우 결제 금액을 위변조하여 결제요청을 할 수 있습니다.
이 경우 결제 완료 후 처음 요청했던 금액과 실제로 결제된 금액이 일치하는지 확인하는 과정이 필요합니다.
기본도메인(요청도메인)
라이브 : https://www.cookiepayments.com [POST]
테스트 : https://sandbox.cookiepayments.com [POST]
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST]
TOKEN 요청 전문 파라미터
항목명 |
길이 |
내용 |
구문 |
비고 |
pay2_id |
30 |
cookiepayments에서 발급받은 ID |
필수 |
cookiepayments사에서 부여 |
pay2_key |
50 |
cookiepayments에서 발급받은 연동키 |
필수 |
cookiepayments사에서 부여 |
결제 검증 URL
{요청도메인}/api/paycert [POST]
결제검증 요청 전문 파라미터
항목명 |
길이 |
내용 |
구문 |
비고 |
tid |
50 |
PG사 거래 고유번호 |
필수 |
PG사에서 부여 |
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "{쿠키페이 결제 연동 id}",
"pay2_key": "{쿠키페이 결제 연동 key}"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 발급 받은 TOKEN으로 결제 취소 API 통신 */
curl -H "Content-Type: application/json" \
-H "TOKEN: {TOKEN API통해 발행된 TOKEN 값}" \
-d '{"tid": "{결제 후 응답받은 PG 거래 고유번호}"}' \
-X POST "{요청도메인}/api/paycert"
PHP
/* 토큰 발행 API */
$headers = array(
'Content-Type: application/json; charset=utf-8',
);
$token_url = "{요청도메인}/payAuth/token";
$request_data = array(
'pay2_id' => '{쿠키페이 결제 연동 id}',
'pay2_key'=> '{쿠키페이 결제 연동 key}',
);
$request_data = json_encode($request_data, JSON_UNESCAPED_UNICODE);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $token_url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
curl_close($ch);
$result = json_decode($result, true);
if($result['RTN_CD'] == '0000') {
$paycert_url = "{요청도메인}/api/paycert";
$headers = array(
'content-type: application/json; charset=utf-8',
'TOKEN: ' . $result['TOKEN'],
);
$request_data = array(
'tid' => '{결제 후 응답받은 PG사 거래 고유번호}',
);
$request_data = json_encode($request_data, JSON_UNESCAPED_UNICODE);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $paycert_url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
// 결과 처리
var_dump($response);
}
결제검증 응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
PG 사 응답코드 |
필수(json) |
응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
PG 사 응답메시지 |
필수(json) |
응답 메시지 ("성공" 또는 오류 메세지) |
ORDERNO |
50 |
주문번호 |
필수(json) |
결제한 주문번호 |
AMOUNT |
10 |
결제 된 금액 |
필수(json) |
문자 및 특수문자 허용 불가 |
BUYERNAME |
20 |
고객명 |
필수(json) |
|
BUYEREMAIL |
50 |
고객 e-mail |
선택(json) |
|
PRODUCTNAME |
40 |
상품명 |
필수(json) |
'&' 문자 포함시 오류 발생 |
PRODUCTCODE |
10 |
상품코드 |
필수(json) |
|
PAYMETHOD |
20 |
결제수단 |
필수(json) |
CARD(카드), KAKAOPAY(카카오페이), BANK(계좌이체) VACCT(가상계좌), MOBILE(휴대폰) |
BUYERID |
20 |
고객 ID |
필수(json) |
|
TID |
50 |
PG 거래 고유번호 |
필수(json) |
PG사 결제 거래고유번호 (전표출력 및 결제취소에 사용됩니다) |
ACCEPTNO |
10 |
승인번호 |
필수(json) |
PG사 결제 승인번호 |
ACCEPTDATE |
20 |
승인일시 |
필수(json) |
PG사 결제 승인일시 |
CANCELDATE |
20 |
취소날짜 |
필수(json) |
결제 취소한 경우 취소일시 |
CANCELMSG |
50 |
취소메시지 |
필수(json) |
결제 취소한 경우 취소메세지 |
ACCOUNTNO |
50 |
가상계좌번호 |
(json) |
가상계좌 이용 시 리턴 값 |
RECEIVERNAME |
50 |
예금주성명 |
(json) |
가상계좌 이용 시 리턴 값 |
DEPOSITENDDATE |
50 |
계좌사용만료일 |
(json) |
가상계좌 이용 시 리턴 값 |
CARDNAME |
50 |
은행명 |
(json) |
가상계좌 이용 시 리턴 값 |
CARDCODE |
4 |
카드사코드 |
(json) |
PG사가 제공해주는 카드사 코드 |
결제 예약 시작하기
결제 요청하기는해당 시점(유저 액션 또는 개발사에서 구현한 스케쥴러)에 결제를 요청하는 것이라면,
이와 다르게 미리 결제를 예약하는 방법을 소개하고자 합니다.
결제 예약은 주로 반복결제(subscription)를 구현하고자 하는 개발사에서 많이 이용합니다.
쿠키페이 정책상주기적인 반복결제(periodic)기능은 제공하지 않고 있습니다.
개발사에서 반복결제를 쉽게 구현하는 방법으로는 결제 예약 이후 해당 건 결제 결과 서버 통지시 개발사가 다음 결제를 연계하여 예약건다면, 반복결제가 쉽게 구현 가능합니다.
반복결제를 위한 예약 절차
1) 결제정보 및 예약 실행시간을 포함해 결제 예약 API로 요청합니다.
- 예약이 실패한 경우 오류처리를 진행합니다. 예약이 실패할 수 있는 경우는 다음과 같습니다.
① 잘못된 빌링키를 보냈거나 다른 프로젝트의 빌링키로 요청한 경우
② 결제 최소금액을 잘못 기입한 경우
③ 결제 예약시간이 과거의 시간인 경우
④ 빌링키가 만료된 경우 ( 사용 불가 상태인 경우 )
2) 예약이 성공적으로 되었다면, RESERVE_ID
를 저장합니다. 예약 취소시 반드시 필요한 값 입니다.
3) 쿠키페이 서버에서 예약된 시간(매시 0분, 20분, 40분)에 결제를 실행합니다.
- 결제가 실패한 경우 오류 내용은 서버로 통지됩니다.
4) 쿠키페이 서버에서 결제 성공결과를 서버로 통지합니다.
5) 예약결제 완료 이후 다음 예약결제를 진행하려면 다시 1)번 자동결제 예약 API를 진행합니다.
결제예약 요청하기
기본도메인(요청도메인)
라이브 : https://www.cookiepayments.com [POST]
테스트 : https://sandbox.cookiepayments.com [POST]
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST]
5-1-2 결제예약 요청 URL
{요청도메인}/Subscribe/schedule_reserve [POST]
요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
ApiKey |
제한없음 |
쿠키페이 결제 연동 key |
필수(헤더) |
쿠키페이에서 발급받은 결제 연동 key |
TOKEN |
제한없음 |
인증 TOKEN |
필수(헤더) |
TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID |
20 |
쿠키페이 결제 연동 id |
필수 |
쿠키페이에서 발급받은 결제 연동 id |
BILLKEY |
20 |
빌링키 |
필수(JSON) |
발급받은 빌링키 |
ORDERNO |
50 |
주문번호 |
필수 |
각 주문마다 유니크해야 합니다 |
PRODUCTNAME |
40 |
상품명 |
필수 |
& 문자 포함시 오류 발생 |
PRODUCTCODE |
10 |
상품코드 |
필수 |
|
AMOUNT |
10 |
결제 금액 |
필수 |
숫자만 사용합니다, 100원이상일경우 첫결제가 진행됩니다. |
TAXFREECD |
1 |
과세여부 |
필수 |
과세:Y, 비과세:N |
QUOTA |
2 |
할부개월 |
필수 |
일시불:00, 2개월:02, ... 12개월:12 (최대12개월) |
SCHEDULE_AT |
12 |
결제요청시간 |
필수 |
YYYYMMDDHHIISS (예:202209310612) |
BUYERNAME |
20 |
고객명 |
필수 |
결제자 이름 |
PRODUCTTYPE |
1 |
상품구분 |
필수 |
상품구분(1: 디지털, 2: 실물) |
BUYERID |
20 |
고객 ID |
선택 |
|
BUYERPHONE |
20 |
고객 휴대폰번호 |
선택 |
|
BUYEREMAIL |
50 |
고객 e-mail |
선택 |
|
BUYERADDRESS |
100 |
고객 주소 |
선택 |
|
NOTICE_URL |
200 |
진행결과 수신할 통보 URL |
선택 |
https://도메인/... |
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 정기결제 API */
curl -H "Content-Type: application/json" \
-H "ApiKey: COOKIEPAY에서 발급받은 연동키" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-d '{
"API_ID": "COOKIEPAY에서 발급받은 가맹점연동 ID",
"BILLKEY": "빌링키",
"ORDERNO": "주문번호",
"PRODUCTNAME": "상품명",
"PRODUCTCODE": "상품코드",
"AMOUNT": "결제금액",
"TAXFREECD":"과세여부",
"QUOTA":"할부개월",
"SCHEDULE_AT":"결제시간(202201010101)",
"BUYERNAME": "고객명",
"PRODUCTTYPE": "2",
"BUYERID": "고객 ID",
"BUYERPHONE":"고객 휴대폰번호",
"BUYEREMAIL":"고객 E-MAIL",
"BUYERADDRESS":"고객 주소",
"NOTICE_URL":"진행결과 수신할 통보 URL"
}' \
-X POST "{요청도메인}/Subscribe/schedule_reserve"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
/* 여기 까지 */
if($RES_STR['RTN_CD'] == '0000'){
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
array_push($headers, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
$cookiepayments_url = "{요청도메인}/Subscribe/schedule_reserve";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'BILLKEY' => '빌링키',
'ORDERNO' => '주문번호',
'PRODUCTNAME' => '상품명',
'PRODUCTCODE' => '상품코드',
'AMOUNT' => '결제금액',
'TAXFREECD' => '과세여부',
'QUOTA' => '할부개월',
'SCHEDULE_AT' => '202212310101',
'BUYERNAME' => '고객명',
'PRODUCTTYPE' => '2',
'BUYERID' => '고객 ID',
'BUYERPHONE' => '고객 휴대폰번호',
'BUYEREMAIL' => '고객 E-MAIL',
'BUYERADDRESS'=>'고객 주소',
'NOTICE_URL'=>'진행결과 수신할 통보 URL'
);
$cookiepayments_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepayments_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepayments_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA |
|
암호호된 리턴값 |
선택 |
암호회된 리턴값 (성공시 존재) |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"ENC_DATA": "uCAMEsaW+tdhYKcIvzbezan137Igm4u0dEMawS93EhwaaoLE+lAgiMH07ysmVI/q3Ky7X1LOIZ3WuSsGgGkyvQ=="
}
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
복호화 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
복호화 응답 메시지 ("성공" 또는 오류 메세지) |
decryptData |
|
복호화 데이터 |
필수(JSON) |
|
RESERVE_ID |
28 |
예약ID |
필수(JSON) |
정기결제 예약ID |
RESERVE_EXECUTE_AT |
12 |
결제요청 시간 |
필수(JSON) |
|
NOTICE_URL |
200 |
진행결과 통보 URL |
필수(JSON) |
http, https |
복호화 응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"decryptData": {
"RESERVE_ID": "9jm1kkbzqjwog8kzg40o1zewv6q1",
"RESERVE_EXECUTE_AT": "202405060709",
"NOTICE_URL": "https://www.domain.com/noti_result"
}
}
통보URL 응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
RESERVE_ID |
28 |
예약ID |
필수(JSON) |
정기결제 예약ID |
BILLKEY |
20 |
빌링키 |
필수(JSON) |
예약시 입력한 빌링키 |
ORDERNO |
50 |
주문번호 |
필수(JSON) |
예약시 입력한 주문번호 |
AMOUNT |
10 |
결제 된 금액 |
필수(JSON) |
결제요청시 결제된 금액 |
TID |
50 |
PG 거래 고유번호 |
필수(JSON) |
PG사 결제 거래고유번호 (전표출력 및 결제취소에 사용됩니다) |
ACCEPTDATE |
20 |
승인일시 |
필수(JSON) |
PG사 결제 승인일시 |
ACCEPTNO |
10 |
승인번호 |
필수(JSON) |
PG사 결제 승인번호 |
BUYERNAME |
20 |
고객명 |
필수(JSON) |
예약시 입력한 고객명 |
BUYERID |
20 |
고객 ID |
필수(JSON) |
예약시 입력한 고객ID |
BUYERADDRESS |
100 |
고객 주소 |
필수(JSON) |
예약시 입력한 고객 주소 |
BUYERPHONE |
20 |
고객 휴대폰번호 |
필수(JSON) |
예약시 입력한 고객 휴대폰번호 |
BUYEREMAIL |
50 |
고객 e-mail |
선택(JSON) |
예약시 입력한 고객 e-mail |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"RESERVE_ID": "9jm1ksbzqjwog8kzg40o1xewv6q1",
"BILLKEY": "celgydqdplt4skc8e9ie",
"ORDERNO": "TEST-ORDER-220921-1112071",
"AMOUNT": "100",
"TID": "cTS22092112400490628",
"ACCEPTDATE": "20220921124003",
"ACCEPTNO": "01002110",
"BUYERNAME": "홍길동",
"BUYERID": "user_id",
"BUYERADDRESS": "",
"BUYERPHONE": "010-1234-5678",
"BUYEREMAIL": "ufound@gmail.com"
}
결제예약 취소하기
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST]
결제예약 취소 요청 URL
{요청도메인}/Subscribe/schedule_cancel [POST]
요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
ApiKey |
제한없음 |
쿠키페이 결제 연동 key |
필수(헤더) |
쿠키페이에서 발급받은 결제 연동 key |
TOKEN |
제한없음 |
인증 TOKEN |
필수(헤더) |
TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID |
20 |
쿠키페이 결제 연동 id |
필수 |
쿠키페이에서 발급받은 결제 연동 id |
RESERVE_ID |
28 |
예약ID |
필수(JSON) |
예약하기에서 받은 예약ID |
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 정기결제 API */
curl -H "Content-Type: application/json" \
-H "ApiKey: COOKIEPAY에서 발급받은 연동키" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-d '{
"API_ID": "COOKIEPAY에서 발급받은 가맹점연동 ID",
"RESERVE_ID": "예약ID",
}' \
-X POST "{요청도메인}/Subscribe/schedule_cancel"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
/* 여기 까지 */
if($RES_STR['RTN_CD'] == '0000'){
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
array_push($headers, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
$cookiepayments_url = "{요청도메인}/Subscribe/schedule_cancel";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'RESERVE_ID' => '예약ID',
);
$cookiepayments_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepayments_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepayments_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA |
|
암호호된 리턴값 |
선택 |
암호회된 리턴값 (성공시 존재) |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"ENC_DATA": "uCAMEsaW+tdhYKcIvzbezan137Igm4u0dEMawS93EhwaaoLE+lAgiMH07ysmVI/q3Ky7X1LOIZ3WuSsGgGkyvQ=="
}
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
decryptData |
|
복호화된 데이터 |
필수(JSON) |
|
RESERVE_ID |
28 |
예약ID |
필수(JSON) |
정기결제 예약ID |
복호화 응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "성공",
"decryptData": {
"RESERVE_ID": "9jm1ksbcqjxog8kzg4o01xewv5q1"
}
}
결제예약 목록요청
TOKEN 발행
{요청도메인}/payAuth/token [POST]
결제예약 목록요청 URL
{요청도메인}/Subscribe/schedule_list [POST]
요청 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
ApiKey |
제한없음 |
쿠키페이 결제 연동 key |
필수(헤더) |
쿠키페이에서 발급받은 결제 연동 key |
TOKEN |
제한없음 |
인증 TOKEN |
필수(헤더) |
TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID |
20 |
쿠키페이 결제 연동 id |
필수 |
쿠키페이에서 발급받은 결제 연동 id |
REQUEST_DATE |
8 |
조회를 원하는 등록일 |
필수 |
YYYYMMDD (예: 20220901 ) |
RESERVE_ID |
28 |
예약ID |
선택 |
RESERVE_ID 만으로 검색 (REQUEST_DATE 무시) |
샘플예제
CURL
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 정기결제 API */
curl -H "Content-Type: application/json" \
-H "ApiKey: COOKIEPAY에서 발급받은 연동키" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-d '{
"API_ID": "COOKIEPAY에서 발급받은 가맹점연동 ID",
"RESERVE_ID": "예약ID",
}' \
-X POST "{요청도메인}/Subscribe/schedule_list"
PHP
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{요청도메인}/payAuth/token";
$token_request_data = array(
'pay2_id' => 'cookiepayments에서 발급받은 ID',
'pay2_key'=> 'cookiepayments에서 발급받은 연동키',
);
$req_json = json_encode($token_request_data, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $token_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $req_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $tokenheaders);
$RES_STR = curl_exec($ch);
curl_close($ch);
$RES_STR = json_decode($RES_STR,TRUE);
/* 여기 까지 */
if($RES_STR['RTN_CD'] == '0000'){
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
array_push($headers, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
$cookiepayments_url = "{요청도메인}/Subscribe/schedule_list";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'STD_DT' => '시작일',
'END_DT' => '마감일',
'RESERVE_ID' => '예약ID',
);
$cookiepayments_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepayments_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepayments_json);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
응답 전문 파라미터
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA |
|
암호호된 리턴값 |
선택 |
암호회된 리턴값 (성공시 존재) |
응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "정상",
"ENC_DATA": "uCAMEsaW+tdhYKcIvzbezan137Igm4u0dEMawS93EhwaaoLE+lAgiMH07ysmVI/q3Ky7X1LOIZ3WuSsGgGkyvQ=="
}
항목명 |
길이 |
내용 |
구분 |
비고 |
RESULTCODE |
4 |
결과 코드 |
필수(JSON) |
복호화 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG |
100 |
결과 메시지 |
필수(JSON) |
복호화 응답 메시지 ("성공" 또는 오류 메세지) |
decryptData |
|
복호화된 데이터 |
필수(JSON) |
|
decryptData[n]['RESERVE_ID'] |
|
예약ID |
필수(JSON) |
|
decryptData[n]['BILLKEY'] |
|
빌링키 |
필수(JSON) |
|
decryptData[n]['ORDERNO'] |
|
주문번호 |
필수(JSON) |
|
decryptData[n]['AMOUNT'] |
|
결제금액 |
필수(JSON) |
|
decryptData[n]['BUYERNAME'] |
|
구매자이름 |
필수(JSON) |
|
decryptData[n]['PRODUCTNAME'] |
|
상품명 |
필수(JSON) |
|
decryptData[n]['PRODUCTCODE'] |
|
상품코드 |
필수(JSON) |
|
decryptData[n]['TAXFREECD'] |
|
과세여부 |
필수(JSON) |
Y: 과세, N: 비과세 |
decryptData[n]['QUOTA'] |
|
할부개월수 |
필수(JSON) |
00 |
decryptData[n]['NOTICE_URL'] |
|
진행결과 통보 URL |
필수(JSON) |
|
decryptData[n]['SCHEDULE_AT'] |
|
예약 결제시간 |
필수(JSON) |
|
decryptData[n]['REGDATE'] |
|
등록일 |
필수(JSON) |
|
decryptData[n]['STATUSDATE'] |
|
상태변경일 |
필수(JSON) |
STATUS 상태 변경일 (예: STATUS=9 면 예약취소일이됨) |
decryptData[n]['STATUS'] |
|
상태 |
필수(JSON) |
1:예약등록, 2:결제 진행, 3:결제실패, 4:결제성공, 9:예약취소 |
복호화 응답데이터 예
{
"RESULTCODE": "0000",
"RESULTMSG": "정상",
"decryptData": [
{
"RESERVE_ID": "9jn1ksbcqjwog8kgg4001xxwv5q1",
"BILLKEY": "jnjben1txbwo0oko28j1",
"ORDERNO": "TEST-ORDER-220920-094625",
"AMOUNT": "100",
"BUYERNAME": "홍길동",
"PRODUCTNAME": "테스트상품100",
"PRODUCTCODE": "TP-100",
"TAXFREECD": "Y",
"QUOTA": "00",
"NOTICE_URL": "https://domain.com/noti",
"SCHEDULE_AT": "2022-09-21 09:10:00",
"REGDATE": "2022-09-20 10:59:18",
"STATUSDATE": "2022-09-20 11:17:53",
"STATUS": "9"
},
{
"RESERVE_ID": "9jn1ksbcqjwog8kgg4001xxwv5q2",
"BILLKEY": "sidisf1txbwo0okososlsl",
"ORDERNO": "TEST-ORDER-220920-094626",
"AMOUNT": "100",
"BUYERNAME": "홍길동",
"PRODUCTNAME": "테스트상품100",
"PRODUCTCODE": "TP-100",
"TAXFREECD": "Y",
"QUOTA": "00",
"NOTICE_URL": "https://domain.com/noti",
"SCHEDULE_AT": "2022-09-21 09:10:00",
"REGDATE": "2022-09-20 10:59:28",
"STATUSDATE": "2022-09-20 11:17:58",
"STATUS": "9"
},
......
]
}
자동결제 반복하기
쿠피페이에서는cron과 같이 주기적인(periodic) 결제 방식은 지원하고 있지 않습니다. 그래서 자동결제 예약 반복을 하기 위해서는 2가지 방식으로 진행해야합니다.
방법1. 가맹점 서버에서 cron과 같은 주기적인 실행 프로그램으로 반복하기
가맹점 서버 내에서 cron과 같이 주기적인 스케쥴러 프로그램을 통해 결제를 진행해야합니다. 발급받은 빌링키를 데이터베이스에 저장한 후에 스케쥴러에서 빌링키로 결제하기를 통해서 주기적으로 결제할 수 있도록 구현합니다.
방법2. 자동결제 예약 실행 이후 리턴되는 통지URL 처리에서 다음 자동결제 예약을 수행하기
① 결제 이후 통지가 오면 결제완료/결제실패를 분리하여 처리를 진행합니다.
② 결제가 완료가 되었다면, 다음 결제 일자를 정해서 결제 예약 API를 통해 예약을 추가로 진행하면 반복적인 결제를 구현할 수 있습니다.