CookiePay API 매뉴얼

비인증결제

비인증결제 요청전문

비인증결제 요청은 먼저 TOKEN 발행 API를 통해 TOKEN을 발급 받은 후 발행된 TOKEN을 가지고 결제취소 API와 통신하게 되어 있습니다.

요청 시 주의사항 (필독)

요청 시 ORDERNO는 유니크 한 값이어야 합니다. 결제 시 마다 새로 생성 된 ORDER KEY값을 넘겨주셔야 합니다. 중복 된 주문번호일 경우 결제 실패가 일어나거나 결제 데이터가 부정확할 수 있습니다.

기본도메인(요청도메인)
라이브 : https://www.cookiepayments.com [POST] 
테스트 : https://sandbox.cookiepayments.com [POST] 
URL
{요청도메인}/keyin/payment [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 "{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"
PHP
/* 토큰 발행 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",
  }
}


PHP (비인증결제응답) > 복호화후 응답필드 값으로 디비처리하기

// 결제정보 수신 후 데이터베이스에 입력되는 필드값은 고객님의 홈페이지 결제 테이블에 맞게 입력하셔야 합니다. 
// 결제요청시 결제시도 데이터는 디비에 우선 저장하신후 [비인증결제 응답전문] 신호를 받으신후 결제완료 정보를 업데이트합니다.
// 계좌이체, 가상계좌의 경우 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] 
URL
{요청도메인}/api/paycert [POST] 
TOKEN 발행 URL
{요청도메인}/payAuth/token [POST] 
TOKEN 요청 전문 파라미터
구분 항목명 길이 내용 비고
필수 pay2_id 30 쿠키페이 결제 연동 id 쿠키페이에서 발급받은 결제 연동 id
필수 pay2_key 50 쿠키페이 결제 연동 key 쿠키페이에서 발급받은 결제 연동 key
결제검증 요청 전문 파라미터
구분 항목명 길이 내용 비고
필수 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);
$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)