비인증결제 요청은 먼저 TOKEN 발행 API를 통해 TOKEN을 발급 받은 후 발행된 TOKEN을 가지고 결제취소 API와 통신하게 되어 있습니다.
요청 시 주의사항 (필독)
요청 시 ORDERNO는 유니크 한 값이어야 합니다. 결제 시 마다 새로 생성 된 ORDER KEY값을 넘겨주셔야 합니다. 중복 된 주문번호일 경우 결제 실패가 일어나거나 결제 데이터가 부정확할 수 있습니다.
라이브 : https://www.cookiepayments.com [POST]
테스트 : https://sandbox.cookiepayments.com [POST]
{요청도메인}/keyin/payment [POST]
{요청도메인}/payAuth/token [POST]
항목명 | 길이 | 내용 | 구분 | 비고 |
---|---|---|---|---|
pay2_id | 30 | cookiepayments에서 발급받은 ID | 필수 | cookiepayments사에서 부여 |
pay2_key | 50 | cookiepayments에서 발급받은 연동키 | 필수 | cookiepayments사에서 부여 |
샘플예제
/* 토큰 발급 API */
curl -H "Content-Type: application/json" \
-d '{
"pay2_id": "cookiepayments에서 발급받은 ID",
"pay2_key": "cookiepayments에서 발급받은 연동키"
}' \
-X POST "{TOKEN 발행 URL}"
/* 비인증결제 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": "카드유효기간",
"BUYERNAME": "고객명",
"BUYERID": "고객 ID",
"BUYEREMAIL":"고객 E-MAIL",
"BUYERPHONE":"고객 휴대폰번호",
"QUOTA":"할부개월",
"RETURNURL": "결제 결과 값 받는 주소"
}' \
-X POST "{요청도메인}/keyin/payment"
/* 토큰 발행 API */
$tokenheaders = array();
array_push($tokenheaders, "content-type: application/json; charset=utf-8");
$token_url = "{TOKEN 발행 URL}";
$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 = "{요청도메인}/keyin/payment";
$request_data_array = array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'ORDERNO'=> '주문번호',
'PRODUCTNAME'=> '상품명',
'AMOUNT'=> '결제금액',
'BUYERNAME'=> '고객명',
'BUYEREMAIL'=> '고객 E-MAIL',
'CARDNO'=>'카드번호',
'EXPIREDT'=>'카드유효기간',
'PRODUCTCODE'=> '상품코드',
'BUYERID'=> '고객 ID',
'BUYERADDRESS'=> '고객 주소',
'BUYERPHONE'=> '고객 휴대폰번호',
'QUOTA'=> '할부개월',
'ETC1'=> '추가필드 1',
'ETC2'=> '추가필드 2',
'ETC3'=> '추가필드 3',
'ETC4'=> '추가필드 4',
'ETC5'=> '추가필드 5',
);
$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);
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 Keyin()
{
//토큰 발행 요청
string TOKEN_URL = "{TOKEN 발행 URL}";
//전송 데이터 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 KEYIN_URL = "{요청도메인}/keyin/payment"; //요청 URL
string TOKEN = Convert.ToString(token_result["TOKEN"]); //응답 받은 토큰 값
//요청 HEADER 세팅
HttpWebRequest keyin_request = (HttpWebRequest)WebRequest.Create(KEYIN_URL);
keyin_request.Method = "POST";
keyin_request.ContentType = "application/json";
keyin_request.Headers.Add("ApiKey", API_KEY);
keyin_request.Headers.Add("TOKEN", TOKEN);
//전송 데이터 JSON 형식 만들기
var keyin_json = new JObject();
keyin_json.Add("API_ID", API_ID); //COOKIEPAY에서 발급받은 가맹점연동 ID
keyin_json.Add("ORDERNO", ""); //주문번호
keyin_json.Add("PRODUCTNAME", ""); //상품명
keyin_json.Add("AMOUNT", ""); //결제금액
keyin_json.Add("BUYERNAME", ""); //고객명
keyin_json.Add("BUYEREMAIL", ""); //고객 E-MAIL
keyin_json.Add("CARDNO", ""); //카드번호
keyin_json.Add("EXPIREDT", ""); //카드유효기간
keyin_json.Add("BUYERID", ""); //고객 ID
keyin_json.Add("BUYERPHONE", ""); //고객 휴대폰번호
keyin_json.Add("QUOTA", ""); //할부개월
keyin_json.Add("CARDPWD", ""); //비밀번호 앞두자리
keyin_json.Add("CARDAUTH", ""); //생년월일
//데이터 전송
byte[] keyin_bytes = Encoding.UTF8.GetBytes(keyin_json.ToString());
keyin_request.ContentLength = keyin_bytes.Length;
Stream keyin_reqStream = keyin_request.GetRequestStream();
keyin_reqStream.Write(keyin_bytes, 0, keyin_bytes.Length);
keyin_reqStream.Flush();
keyin_reqStream.Close();
//응답
HttpWebResponse keyin_response = (HttpWebResponse)keyin_request.GetResponse();
HttpStatusCode keyin_status = keyin_response.StatusCode;
Stream keyin_res_stream = keyin_response.GetResponseStream();
StreamReader keyin_read_stream = new StreamReader(keyin_res_stream);
string keyin_resp_data = keyin_read_stream.ReadToEnd();
//응답 정보
var keyin_result = JObject.Parse(keyin_resp_data);
keyin_read_stream.Close();
keyin_res_stream.Close();
keyin_response.Close();
string RESULTCODE = Convert.ToString(keyin_result["RESULTCODE"]);
//응답 성공
if (RESULTCODE == "0000")
{
string ORDERNO = Convert.ToString(keyin_result["ORDERNO"]);
int AMOUNT = Convert.ToInt32(keyin_result["AMOUNT"]);
string TID = Convert.ToString(keyin_result["TID"]);
string ACCEPTDATE = Convert.ToString(keyin_result["ACCEPTDATE"]);
string ACCEPTNO = Convert.ToString(keyin_result["ACCEPTNO"]);
string CARDNAME = Convert.ToString(keyin_result["CARDNAME"]);
string TEMP_ORDERNO = Convert.ToString(keyin_result["TEMP_ORDERNO"]);
string RECEIPT_URL = Convert.ToString(keyin_result["RECEIPT_URL"]);
string QUOTA = Convert.ToString(keyin_result["QUOTA"]);
//데이터 MS-SQL DB 입력
using (SqlConnection connection = new SqlConnection("Server=; Uid=; Pwd =; database="))
{
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = @"UPDATE PAY_MASTER
SET ACCEPT_DATE = @ACCEPT_DATE
,ACCEPT_NO = @ACCEPT_NO
,TID = @TID
,CARDNAME = @CARDNAME
,QUOTA = @QUOTA
WHERE ORDERNO = @ORDERNO
AND AMOUNT = @AMOUNT";
command.Parameters.AddWithValue("@ACCEPTDATE", ACCEPTDATE);
command.Parameters.AddWithValue("@ACCEPTNO", ACCEPTNO);
command.Parameters.AddWithValue("@TID", TID);
command.Parameters.AddWithValue("@CARDNAME", CARDNAME);
command.Parameters.AddWithValue("@QUOTA", QUOTA);
command.Parameters.AddWithValue("@ORDERNO", ORDERNO);
command.Parameters.AddWithValue("@AMOUNT", AMOUNT);
connection.Open();
int result = command.ExecuteNonQuery();
connection.Close();
}
/*데이터 MYSQL DB 입력
using (MySqlConnection connection = new MySqlConnection("Server=localhost;Port=3307;Database=mysql;Uid=;Pwd="))
{
var command = connection.CreateCommand();
command.CommandText = @"UPDATE PAY_MASTER
SET ACCEPT_DATE = @ACCEPT_DATE
,ACCEPT_NO = @ACCEPT_NO
,TID = @TID
,CARDNAME = @CARDNAME
,QUOTA = @QUOTA
WHERE ORDERNO = @ORDERNO
AND AMOUNT = @AMOUNT";
command.Parameters.AddWithValue("@ACCEPTDATE", ACCEPTDATE);
command.Parameters.AddWithValue("@ACCEPTNO", ACCEPTNO);
command.Parameters.AddWithValue("@TID", TID);
command.Parameters.AddWithValue("@CARDNAME", CARDNAME);
command.Parameters.AddWithValue("@QUOTA", QUOTA);
command.Parameters.AddWithValue("@ORDERNO", ORDERNO);
command.Parameters.AddWithValue("@AMOUNT", AMOUNT);
connection.Open();
int result = command.ExecuteNonQuery();
connection.Close();(
}*/
}
}
return View();
}
}
}
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.net.URL"%>
<%@ page import="java.net.URLConnection"%>
<%@ page import="java.net.HttpURLConnection"%>
<%@ page import="java.net.URLEncoder"%>
<%@ page import="java.net.UnknownHostException"%>
<%@ page import="org.json.simple.JSONObject"%>
<%@ page import="org.json.simple.JSONArray"%>
<%@ page import="org.json.simple.parser.JSONParser"%>
<%@ page import="org.json.simple.parser.ParseException"%>
<%
//http 요청 시 필요한 url 주소를 변수 선언
String token_request_data = "{ \"pay2_id\" : \"쿠키페이 결제 연동 ID\", \"pay2_key\" : \"쿠키페이 결제 연동 key\" }";
String keyin_request_data = "{ \"API_ID\" : \"쿠키페이 결제 연동 ID\", \"ORDERNO\" : \"test_1236\", \"PRODUCTNAME\" : \"proname\", \"AMOUNT\" : \"100\", \"BUYERNAME\" : \"naribi\", \"BUYEREMAIL\" : \"email@email.com\", \"CARDNO\" : \"1234123412341234\", \"EXPIREDT\" : \"1227\", \"PRODUCTCODE\" : \"procode\", \"BUYERID\" : \"userid\", \"BUYERADDRESS\" : \"address\", \"BUYERPHONE\" : \"01046850000\", \"QUOTA\" : \"00\", \"ETC1\" : \"\" }";
String pay2_key = "쿠키페이 결제 연동 key";
String Token_Url = "{요청도메인}/payAuth/token";
String Keyin_Url = "{요청도메인}/keyin/payment";
//http 통신을 하기위한 객체 선언 실시
URL token_url = null;
URL keyin_url = null;
HttpURLConnection conn_token = null;
HttpURLConnection conn_keyin = null;
//http 통신 요청 후 응답 받은 데이터를 담기 위한 변수
String responseDataToken = "";
BufferedReader br_token = null;
BufferedReader br_keyin = null;
StringBuffer sb_token = null;
StringBuffer sb_keyin = null;
// 메소드 호출 결과값을 반환하기 위한 변수
String responseCodeToken = "";
String responseCodeKeyin = "";
String returnDataToken = "";
String returnDataKeyin = "";
String returnToken = "";
String ReturnJsonStrToken = "";
String ReturnJsonStrKeyin = "";
try {
//파라미터로 들어온 url을 사용해 connection 실시
token_url = new URL(Token_Url);
conn_token = (HttpURLConnection) token_url.openConnection();
//http 요청에 필요한 타입 정의 실시
conn_token.setRequestMethod("POST");
conn_token.setRequestProperty("Content-Type", "application/json; utf-8"); //post body json으로 던지기 위함
conn_token.setRequestProperty("Accept", "application/json");
conn_token.setDoOutput(true); //OutputStream을 사용해서 post body 데이터 전송
try (OutputStream os_token = conn_token.getOutputStream()){
byte request_data_token[] = token_request_data.getBytes("utf-8");
os_token.write(request_data_token);
os_token.close();
}
catch(Exception e) {
e.printStackTrace();
}
//http 요청 실시
conn_token.connect();
//http 요청 후 응답 받은 데이터를 버퍼에 쌓는다
br_token = new BufferedReader(new InputStreamReader(conn_token.getInputStream(), "UTF-8"));
sb_token = new StringBuffer();
while ((responseDataToken = br_token.readLine()) != null) {
sb_token.append(responseDataToken); //StringBuffer에 응답받은 데이터 순차적으로 저장 실시
}
// http 요청 응답 코드 확인 실시
responseCodeToken = String.valueOf(conn_token.getResponseCode());
//메소드 호출 완료시 반환하는 변수에 버퍼 데이터 삽입 실시(토큰인증 결과 받는곳)
returnDataToken = sb_token.toString();
JSONParser parser_token = new JSONParser();
//String jsonStr = "{ \"RTN_CD\": \"0000\", \"RTN_MSG\": \"성공\", \"TOKEN\": \"token_value\"}";
ReturnJsonStrToken = returnDataToken;
JSONObject ReturnJsonObjToken;
try {
ReturnJsonObjToken = (JSONObject)parser_token.parse(ReturnJsonStrToken);
out.println("RTN_CD : " + ReturnJsonObjToken.get("RTN_CD")+"<br>");
out.println("RTN_MSG : " + ReturnJsonObjToken.get("RTN_MSG")+"<br>");
out.println("TOKEN : " + ReturnJsonObjToken.get("TOKEN")+"<br>");
returnToken = ReturnJsonObjToken.get("TOKEN").toString();
// 토큰 가져오기에 성공했다면 > 키인 결제 시작
if(ReturnJsonObjToken.get("RTN_CD").toString().equals("0000")){
out.println("keyin_start : "+returnToken+"<br>");
keyin_url = new URL(Keyin_Url);
conn_keyin = (HttpURLConnection) keyin_url.openConnection();
//http 요청에 필요한 타입 정의 실시
conn_keyin.setRequestMethod("POST");
conn_keyin.setRequestProperty("Content-Type", "application/json; utf-8"); //post body json으로 던지기 위함
conn_keyin.setRequestProperty("Accept", "application/json");
conn_keyin.setRequestProperty("ApiKey", pay2_key);
conn_keyin.setRequestProperty("TOKEN", returnToken);
conn_keyin.setDoOutput(true); //OutputStream을 사용해서 post body 데이터 전송
try (OutputStream os_keyin = conn_keyin.getOutputStream()){
byte request_data_keyin[] = keyin_request_data.getBytes("utf-8");
os_keyin.write(request_data_keyin);
os_keyin.close();
}
catch(Exception e) {
e.printStackTrace();
}
//http 요청 실시
conn_keyin.connect();
//http 요청 후 응답 받은 데이터를 버퍼에 쌓는다
br_keyin = new BufferedReader(new InputStreamReader(conn_keyin.getInputStream(), "UTF-8"));
sb_keyin = new StringBuffer();
while ((responseDataToken = br_keyin.readLine()) != null) {
sb_keyin.append(responseDataToken); //StringBuffer에 응답받은 데이터 순차적으로 저장 실시
}
// http 요청 응답 코드 확인 실시
responseCodeKeyin = String.valueOf(conn_keyin.getResponseCode());
//메소드 호출 완료시 반환하는 변수에 버퍼 데이터 삽입 실시(토큰인증 결과 받는곳)
returnDataKeyin= sb_keyin.toString();
JSONParser parser_keyin = new JSONParser();
ReturnJsonStrKeyin = returnDataKeyin;
JSONObject ReturnJsonObjKeyin;
out.println("returnDataKeyin : "+returnDataKeyin);
// 결제 리턴 값 저장...
// .
// .
}
} catch (ParseException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//http 요청 및 응답 완료 후 BufferedReader를 닫아줍니다
try {
if (br_token != null) {
br_token.close();
}
if (br_keyin != null) {
br_keyin.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
%>
항목명 | 길이 | 내용 | 구분 | 비고 |
---|---|---|---|---|
ApiKey | 제한없음 | 쿠키페이 결제 연동 key | 필수(헤더) | 쿠키페이에서 발급받은 결제 연동 key |
TOKEN | 제한없음 | 인증 TOKEN | 필수(헤더) | TOKEN 발급 API통해 발급 TOKEN 값 |
API_ID | 20 | 쿠키페이 결제 연동 id | 필수 | 쿠키페이에서 발급받은 결제 연동 id |
ORDERNO | 50 | 주문번호 | 필수 | 각 주문마다 유니크해야 합니다 |
PRODUCTNAME | 40 | 상품명 | 필수 | & 문자 포함시 오류 발생 |
AMOUNT | 10 | 결제 금액 | 필수 | 숫자만 사용합니다 |
BUYERNAME | 20 | 고객명 | 필수 | 결제자 이름 |
BUYEREMAIL | 50 | 고객 e-mail | 선택 | |
CARDNO | 16 | 카드번호 | 필수 | |
EXPIREDT | 4 | 카드유효기간 (YYMM) | 필수 | |
CARDPWD | 2 | 카드비밀번호 앞 2자리 | 다날,토스 필수 | 카드 비밀번호 앞 2자리 |
CARDAUTH | 10 | 카드소유자 생년월일(YYMMDD) | 다날,토스 필수 | 생년월일 YYMMDD 혹은 사업자번호 10자리 |
PRODUCTCODE | 10 | 상품코드 | 선택 | |
BUYERID | 20 | 고객 ID | 선택 | |
BUYERADDRESS | 100 | 고객 주소 | 선택 | |
BUYERPHONE | 20 | 고객 휴대폰번호 | 선택 | |
TAXYN | 1 | 과세/비과세 | 선택 | Y:과세, N:비과세, M:복합과세 - default : 과세 └ 복합과세는 키움페이,모빌리언스,웰컴페이만 사용가능 |
QUOTA | 2 | 할부개월 | 선택 | 일시불: 00, 2개월: 02, ... 12개월: 12 (최대12개월) |
ETC1 | 100 | 사용자 추가 필드1 | 선택 | 입력시 응답파라미터에 값을 전달합니다 |
ETC2 | 100 | 사용자 추가 필드2 | 선택 | 입력시 응답파라미터에 값을 전달합니다 |
ETC3 | 100 | 사용자 추가 필드3 | 선택 | 입력시 응답파라미터에 값을 전달합니다 |
ETC4 | 100 | 사용자 추가 필드4 | 선택 | 입력시 응답파라미터에 값을 전달합니다 |
ETC5 | 100 | 사용자 추가 필드5 | 선택 | 입력시 응답파라미터에 값을 전달합니다 |
결과값은 Form Data로 전송됩니다.
항목명 | 길이 | 내용 | 구분 | 비고 |
---|---|---|---|---|
RESULTCODE | 4 | 결과 코드 | 필수 | 암호화 리턴 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG | 100 | 결과 메세지 | 필수 | 암호화 리턴 응답 메시지 ("성공" 또는 오류 메세지) |
ENC_DATA | 암호호된 리턴값 | 필수 | 암호회된 리턴값 |
항목명 | 길이 | 내용 | 구분 | 비고 |
---|---|---|---|---|
decryptData | 복호화된 데이터 | 필수 | ||
RESULTCODE | 4 | 결과 코드 | 필수(JSON) | PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG | 100 | 결과 메시지 | 필수(JSON) | PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ORDERNO | 50 | 주문번호 | 필수(JSON) | 결제한 주문번호 |
AMOUNT | 10 | 결제 된 금액 | 필수(JSON) | 결제 금액 |
TID | 50 | PG 거래 고유번호 | 필수(JSON) | PG사 결제 거래고유번호 (전표출력 및 결제취소에 사용됩니다) |
ACCEPTDATE | 20 | 승인일시 | 필수(JSON) | PG사 결제 승인일시 |
ACCEPTNO | 10 | 승인번호 | 필수(JSON) | PG사 결제 승인번호 |
QUOTA | 2 | 할부기간 | 필수(JSON) | 카드 할부결제시 할부기간 (00:일시불, 01:1개월) |
ETC1 | 100 | 사용자 추가 필드1 | 선택 | |
ETC2 | 100 | 사용자 추가 필드2 | 선택 | |
ETC3 | 100 | 사용자 추가 필드3 | 선택 | |
ETC4 | 100 | 사용자 추가 필드4 | 선택 | |
ETC5 | 100 | 사용자 추가 필드5 | 선택 |
{
"RESULTCODE": "0000", // 복호화 응답 코드
"RESULTMSG": "성공", // 복호화 응답 메시지
"decryptData": {
"RESULTCODE": "0000", // PG사 응답 코드 (성공시 "0000", 그외 에러)
"RESULTMSG": "성공", // PG사 응답 메시지 ("성공" 또는 오류 메세지)
"ORDERNO": "주문번호",
"AMOUNT": "1004",
"TID": "PG 거래 고유번호",
"ACCEPTDATE": "승인일시",
"ACCEPTNO": "승인번호",
"QUOTA": "할부기간",
"ETC1": "사용자 추가 필드1",
"ETC2": "사용자 추가 필드2",
"ETC3": "사용자 추가 필드3",
"ETC4": "사용자 추가 필드4",
"ETC5": "사용자 추가 필드5",
}
}
// 결제정보 수신 후 데이터베이스에 입력되는 필드값은 고객님의 홈페이지 결제 테이블에 맞게 입력하셔야 합니다.
// 결제요청시 결제시도 데이터는 디비에 우선 저장하신후 [비인증결제 응답전문] 신호를 받으신후 결제완료 정보를 업데이트합니다.
// 계좌이체, 가상계좌의 경우 ACCEPT_NO 승인번호의 리턴 값이 없으므로 예외 처리하여 주시기 바랍니다.
// 결제 테이블 설계의 경우 비즈니스 로직에 때라 상이하므로 아래 예제 코드는 참조만 하여 주시기 바랍니다.
// 응답전문의 경우 기본 암호화 되어 리턴되므로 > 암호화 전문 복호화하기 api(전문)을 사용하시어 복호화후 디비처리하여 주십시요.
$headers = array();
array_push($headers, "content-type: application/json; charset=utf-8");
array_push($headers, "ApiKey: COOKIEPAY에서 발급받은 연동키");
$cookiepay_api_url = "{요청도메인}/EdiAuth/cookiepay_edi_decrypt";
$edi_date = date('YmdHis');
$request_data_array = array(
'API_ID' => 'cookiepayments에서 발급받은 ID', // 쿠키페이 결제 연동 id
'ENC_DATA' => '암호화된 응답값',
);
$cookiepay_api_json = json_encode($request_data_array, TRUE);
$ch = curl_init(); // curl 초기화
curl_setopt($ch,CURLOPT_URL, $cookiepay_api_url);
curl_setopt($ch,CURLOPT_POST, false);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cookiepay_api_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); // 응답값을 $response 변수 넣는다.
curl_close($ch);
$result_array = json_decode($response, true);
$params_decode = $result_array['decryptData'];
if( !empty($params_decode['ACCEPT_NO']) && !empty($params_decode['TID']) && !empty($params_decode['ORDERNO']) ) {
/*
[API_ID] => xxxxxxx
[ORDERNO] => 20230206020000000
[AMOUNT] => 100
[TID] => CEH11111111111111111
[USERID] => guest
[BUYERNAME] => test
[BUYEREMAIL] =>
[PRODUCTCODE] => test
[PRODUCTNAME] => test
[ACCEPT_DATE] => 20230206110242
[ACCEPT_NO] => 11111111
[CARDCODE] => CCBC
[CARDNAME] => 케이뱅크체크
[CARDNO] => **********002163
[QUOTA] => 00
[ETC1] => 사용자 추가 필드1
[ETC2] => 사용자 추가 필드2
[ETC3] => 사용자 추가 필드3
[ETC4] => 사용자 추가 필드4
[ETC5] => 사용자 추가 필드5
[PAY_METHOD] => CARD
*/
/* 전달받은 결제정보로 결제완료 처리 예제코드 */
$SQL = "UPDATE '결제테이블' set ";
$SQL .= "ACCEPT_DATE = '".$params_decode['ACCEPT_DATE']."', ";
$SQL .= "ACCEPT_NO = '".$params_decode['ACCEPT_NO']."', ";
$SQL .= "TID = '".$params_decode['TID']."',";
$SQL .= "CARDCODE = '".$params_decode['CARDNO']."',";
$SQL .= "CARDNAME = '".$params_decode['CARDNAME']."',";
$SQL .= "QUOTA = '".$params_decode['QUOTA']."',";
$SQL .= "PAY_STATUS = '결제성공' ";
$SQL .= "WHERE ORDERNO = '".$params_decode['ORDERNO']."' ";
$SQL .= "AND AMOUNT = '".$params_decode['AMOUNT']."' ";
$SQL .= "AND PAY_STATUS = '결제대기' ";
$SQL .= "LIMIT 1 ";
$result = mysql_query($SQL, 'Connect_Info');
}
결제 요청은 클라이언트 상에서 이루어지기 때문에 클라이언트의 스크립트를 조작하여 금액을 위변조하여 결제요청을 할 수 있습니다. 이 경우 결제 완료 후 처음 요청했던 금액과 실제로 결제된 금액이 일치하는지 확인하는 과정이 필요합니다.
라이브 : https://www.cookiepayments.com [POST]
테스트 : https://sandbox.cookiepayments.com [POST]
{요청도메인}/api/paycert [POST]
{요청도메인}/payAuth/token [POST]
구분 | 항목명 | 길이 | 내용 | 비고 |
---|---|---|---|---|
필수 | pay2_id | 30 | 쿠키페이 결제 연동 id | 쿠키페이에서 발급받은 결제 연동 id |
필수 | pay2_key | 50 | 쿠키페이 결제 연동 key | 쿠키페이에서 발급받은 결제 연동 key |
구분 | 항목명 | 길이 | 내용 | 비고 |
---|---|---|---|---|
필수 | tid | 50 | PG 거래 고유번호 | PG사 결제 거래고유번호 |
샘플예제
/* 토큰 발급 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"
샘플 예제
/* 토큰 발행 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);
$result = json_decode($result, true);
curl_close($ch);
if($result['RTN_CD'] == '0000') {
$headers = array(
"Content-Type: application/json",
"TOKEN: {TOKEN API통해 발행된 TOKEN 값}",
);
$paycert_url = "{요청도메인}/api/paycert";
$request_data = array(
'tid' => '{결제 후 응답받은 PG사 거래 고유번호}',
);
$request_data = json_encode($request_data, JSON_UNESCAPED_UNICODE);
$ch = curl_init(); // curl 초기화
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 | 결과 코드 | 필수(JSON) | PG사 응답 코드 (성공시 "0000", 그외 에러) |
RESULTMSG | 100 | 결과 메시지 | 필수(JSON) | PG사 응답 메시지 ("성공" 또는 오류 메세지) |
ORDERNO | 50 | 주문번호 | 필수(JSON) | |
AMOUNT | 10 | 결제 된 금액 | 필수(JSON) | |
BUYERNAME | 20 | 고객명 | 필수(JSON) | |
BUYEREMAIL | 50 | 고객 E-MAIL | 선택(JSON) | |
PRODUCTNAME | 40 | 상품명 | 필수(JSON) | |
PRODUCTCODE | 10 | 상품코드 | 필수(JSON) | |
PAYMETHOD | 20 | 결제수단 | 필수(JSON) | |
BUYERID | 20 | 고객 ID | 필수(JSON) | |
TID | 50 | PG 거래 고유번호 | 필수(JSON) | |
ACCEPTNO | 10 | 승인번호 | 필수(JSON) | |
ACCEPTDATE | 20 | 승인일시 | 필수(JSON) | |
CANCELDATE | 20 | 취소날짜 | 필수(JSON) | |
CANCELMSG | 50 | 취소메시지 | 필수(JSON) |