결제취소는 신용카드 결제, 계좌이체에 한해서만 취소 가능합니다.
가상계좌(토스제외), 휴대폰결제는 해당 API를 이용하실 수 없습니다.
결제 취소 요청은 먼저 TOKEN 발행 API를 통해 TOKEN을 발급 받은 후 발행된 TOKEN을 가지고 결제취소 API와 통신하게 되어 있습니다.
라이브 : https://www.cookiepayments.com [POST]
테스트 : https://sandbox.cookiepayments.com [POST]
{요청도메인}/payAuth/token [POST]
항목명 | 길이 | 내용 | 구분 | 비고 |
---|---|---|---|---|
pay2_id | 30 | cookiepayments에서 발급받은 ID | 필수 | cookiepayments사에서 부여 |
pay2_key | 50 | cookiepayments에서 발급받은 연동키 | 필수 | cookiepayments사에서 부여 |
{요청도메인}/api/cancel [POST]
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{요청도메인}/payAuth/token"
/* 발급 받은 TOKEN으로 결제 취소 API 통신 */
curl -H "Content-Type: application/json" \
-H "TOKEN: TOKEN API통해 발행된 TOKEN 값" \
-H "ApiKey: cookiepayments에서 발급받은 연동키" \
-d '{
"tid": "결제 후 응답받은 PG사 거래 고유번호",
"reason": "취소사유"
}' \
-X POST "{요청도메인}/api/cancel"
/* 토큰 발행 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, "TOKEN: TOKEN API통해 발행된 TOKEN 값");
array_push($headers, "ApiKey: cookiepayments에서 발급받은 연동키");
$cookiepayments_url = "{요청도메인}/api/cancel";
$request_data_array = array(
'tid' => '결제 후 응답받은 PG사 거래 고유번호',
'reason'=> '취소사유',
);
$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);
$result_array = json_decode($response,TRUE);
print_r($result_array);
}
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.IO;
using System.Text.Json;
using Newtonsoft.Json.Linq;
using System.Web.Mvc;
using MySql.Data.MySqlClient;
using System.Data.SqlClient;
namespace pay.Controllers
{
public class HomeController : Controller
{
string API_ID = "쿠키페이 결제 연동 key";
string API_KEY = "쿠키페이 결제 연동 key";
//결제 취소 요청 전문
public ActionResult Cancel()
{
//토큰 발행 요청
string TOKEN_URL = "{요청도메인}/payAuth/token";
//전송 데이터 JSON 형식 만들기
var token_json = new JObject();
token_json.Add("pay2_id", API_ID); //쿠키페이 결제 연동 ID
token_json.Add("pay2_key", API_KEY); //쿠키페이 연동 키
//요청 HEADER 세팅
HttpWebRequest token_request = (HttpWebRequest)WebRequest.Create(TOKEN_URL);
token_request.Method = "POST";
token_request.ContentType = "application/json";
//데이터 전송
byte[] token_bytes = Encoding.UTF8.GetBytes(token_json.ToString());
token_request.ContentLength = token_bytes.Length;
Stream token_reqStream = token_request.GetRequestStream();
token_reqStream.Write(token_bytes, 0, token_bytes.Length);
token_reqStream.Flush();
token_reqStream.Close();
//응답
HttpWebResponse token_response = (HttpWebResponse)token_request.GetResponse();
HttpStatusCode status = token_response.StatusCode;
Stream token_res_stream = token_response.GetResponseStream();
StreamReader token_read_stream = new StreamReader(token_res_stream);
string token_resp_data = token_read_stream.ReadToEnd();
//응답 토근 정보
var token_result = JObject.Parse(token_resp_data);
token_read_stream.Close();
token_res_stream.Close();
token_response.Close();
//0000: 성공
string rtn_cd = Convert.ToString(token_result["RTN_CD"]);
if (rtn_cd == "0000")
{
//결제 취소 요청
string CANCEL_URL = "{요청도메인}/api/cancel"; //요청 URL
string TOKEN = Convert.ToString(token_result["TOKEN"]); //응답 받은 토큰 값
//요청 HEADER 세팅
HttpWebRequest cancel_request = (HttpWebRequest)WebRequest.Create(CANCEL_URL);
cancel_request.Method = "POST";
cancel_request.ContentType = "application/json";
cancel_request.Headers.Add("ApiKey", API_KEY);
cancel_request.Headers.Add("TOKEN", TOKEN);
//전송 데이터 JSON 형식 만들기
var cancel_json = new JObject();
cancel_json.Add("tid", "");
cancel_json.Add("reason", "고객변심");
//데이터 전송
byte[] cancel_bytes = Encoding.UTF8.GetBytes(cancel_json.ToString());
cancel_request.ContentLength = cancel_bytes.Length;
Stream cancel_reqStream = cancel_request.GetRequestStream();
cancel_reqStream.Write(cancel_bytes, 0, cancel_bytes.Length);
cancel_reqStream.Flush();
cancel_reqStream.Close();
//응답
HttpWebResponse cancel_response = (HttpWebResponse)cancel_request.GetResponse();
HttpStatusCode cancel_status = cancel_response.StatusCode;
Stream cancel_res_stream = cancel_response.GetResponseStream();
StreamReader cancel_read_stream = new StreamReader(cancel_res_stream);
string cancel_resp_data = cancel_read_stream.ReadToEnd();
//응답 정보
var cancel_result = JObject.Parse(cancel_resp_data);
System.Diagnostics.Trace.WriteLine(cancel_result);
cancel_read_stream.Close();
cancel_res_stream.Close();
cancel_response.Close();
}
return View();
}
}
}
항목명 | 길이 | 내용 | 구분 | 비고 |
---|---|---|---|---|
TOKEN | 제한없음 | TOKEN API통해 발행된 TOKEN 값 | 필수(헤더) | cookiepayments사에서 부여 |
ApiKey | 제한없음 | cookiepayments에서 발급받은 연동키 | 필수(헤더) | cookiepayments사에서 부여 |
tid | 50 | PG사 거래 고유번호 | 필수 | PG사에서 부여 |
amount | 10 | 취소금액 | 전체 취소 : 선택 부분 취소 : 필수 |
부분 취소 시 전체 금액 보다 작은 값 입력 ※ 부분 취소는 신용카드 : 인증/수기(키인) 결제 수단만 가능합니다. |
taxfree_amt | 10 | 비과세 취소금액 | 선택 | 비과세 취소금액 └ 요청 시 비과세 취소금액은 취소금액보다 큰 값을 입력할 수 없습니다. └ Ex) 결제금액 1천원(과세 500원, 비과세 500원)인 경우 (총)취소금액 400원, 비과세 200원을 전송하면 (amount 400, taxfree_amt 200) [과세 200원, 비과세 200원이 취소 됩니다.] (총)취소금액 100원, 비과세 200원을 전송하면 (amount 100, taxfree_amt 200을 전송하면) [취소되지 않습니다.] ※ 키움페이 > 복합과세 가맹점만 사용가능합니다. |
reason | 50 | 취소사유 | 필수 | |
bank | 30 | 환불계좌 은행코드 (토스) | 선택 | 가상계좌시 필수 |
account_no | 30 | 환불계좌 계좌번호 | 선택 | 가상계좌시 필수 |
account_name | 30 | 환불계좌 예금주이름 | 선택 | 가상계좌시 필수 |
항목명 | 길이 | 내용 | 구분 | 비고 |
---|---|---|---|---|
cancel_tid | 50 | PG사 취소 고유 거래번호 | 필수 | |
cancel_code | 4 | 취소 응답코드 | 필수 | 정상 : 0000, 그외 에러 - 취소 응답코드 : 9029 발생시 > 입금후 취소 API 호출(키움페이만 이용가능) |
cancel_msg | 100 | 취소 응답메시지 | 필수 | |
cancel_date | 50 | 취소날자 | 필수 | |
cancel_amt | 10 | 취소 된 금액 | 필수 |