부트페이 API - 결제 검증, 결제취소

2021. 3. 2. 00:11API

반응형

docs.bootpay.co.kr/

 

부트페이 개발문서

 

docs.bootpay.co.kr

 

많은 애플리케이션에서 결제를 많이 사용한다. 

결제기능을 구현하기 위해서 부트페이 api를 사용하였고 서버단에서 해야할 일은 결제 검증과 취소이다. 

 

 

결제 검증하기 

 

2가지 검증

  1. 주문하려는 결제 금액이 검증데이터의 결제 금액과 일치하는가?
  2. 결제 완료라고 서버에 요청이 왔지만 검증데이터에서 status의 값이 1 ( 결제 완료 상태 )인가?

클라이언트에서 결제를 진행하고 나면 receiptId가 발급될 것이다.

receiptId를 body로 Post해서 그 receiptId에 status가 1인지 , receiptId에 있는 금액과 주문에서 이루어진 금액이 동일한지 확인하고 이상있으면 처리해주는 것이 결제검증이다.

 

 

 

공식문서에 있는 코드와 깃허브를 참고해서 구현하였다. 

 

 

 

PayController.php

<?php
require 'function.php';
require 'BootpayApi.php';
require_once('autoload.php');
spl_autoload_register('BootpayAutoload');
use Bootpay\Rest\BootpayApi;

const JWT_SECRET_KEY = "TEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEYTEST_KEY";

$res = (object)array();
header('Content-Type: json;charset=utf-8');
$req = json_decode(file_get_contents("php://input"));
try {
    addAccessLogs($accessLogs, $req);
    switch ($handler) {
        case "ACCESS_LOGS":
            //            header('content-type text/html charset=utf-8');
            header('Content-Type: text/html; charset=UTF-8');
            getLogs("./logs/access.log");
            break;
        case "ERROR_LOGS":
            //            header('content-type text/html charset=utf-8');
            header('Content-Type: text/html; charset=UTF-8');
            getLogs("./logs/errors.log");
            break;

        case "makeOrder":
        	$receiptId = $req->receiptId;
        	//생략
			$bootpay = BootpayApi::setConfig(
                '60001de55b294800272a1a79',
                'vm6Lg0TQZSzo6mEzx7Lkwg1LFSM7p/05NUYvJyLdMuw='
            );
//            $bootpay = BootpayApi::setConfig(
//                '[[ application_id ]]',
//                '[[ private_key ]]'
//            );
            $response = $bootpay->requestAccessToken();
            if ($response->status === 200) {
                $result = $bootpay->verify($receiptId);
                if ($result->data->price === $totalPrice && $result->data->status === 1) { //결제 검증하기
                    //주문정보 주문테이블에 저장하고 주문인덱스얻기
                    $orderIdx=addOrderInfo($storeIdx,$userIdxInToken,$paymentIdx,$totalPrice,$toStore,$noPlastic,
                        $deliveryReqIdx,$orderState,$orderMenu,$orderMenuOption,$couponIdx,$receiptId);
                    $res->result->orderIdx =$orderIdx;
                    $res->isSuccess = TRUE;
                    $res->code = 1000;
                    $res->message = "주문하기 성공";
                    echo json_encode($res, JSON_NUMERIC_CHECK);
                    break;
                }
                else{
                    $res->isSuccess = FALSE;
                    $res->code = 3001;
                    $res->message = "결제금액이 일치하지않거나 status가 1이 아닙니다.(검증실패)";
                    echo json_encode($res, JSON_NUMERIC_CHECK);
                    break;
                }
            }
            else{
                $res->isSuccess = TRUE;
                $res->code = 3002;
                $res->message = "부트페이 access token 발행 실패";
                echo json_encode($res, JSON_NUMERIC_CHECK);
                break;
            }

 

결제 취소하기 

 

receiptId 에 대한 결제를 취소하는 로직이다. 

 

PayController.php

        case "getCancellation":
            http_response_code(200);
            $orderIdx=$req->orderIdx;
            $receiptId = getReceiptId($orderIdx);

			// 생략

            require_once('autoload.php');
            spl_autoload_register('BootpayAutoload');


//            $bootpay = BootpayApi::setConfig(
//                '[[ application_id ]]',
//                '[[ private_key ]]'
//            );
            $bootpay = BootpayApi::setConfig(
                '60001de55b294800272a1a79',
                'vm6Lg0TQZSzo6mEzx7Lkwg1LFSM7p/05NUYvJyLdMuw='
            );
            $response = $bootpay->requestAccessToken();

            if ($response->status === 200) {
                $orderInfo=getOrderIdx($orderIdx);
                if(empty($orderInfo)){
                    $res->isSuccess = FALSE;
                    $res->code = 4000;
                    $res->message = "주문정보를 가져올 수 없습니다.";
                    echo json_encode($res, JSON_NUMERIC_CHECK);
                    break;
                }
                if($orderInfo[0]['orderState']!=1){
                    $res->isSuccess = FALSE;
                    $res->code = 4001;
                    $res->message = "주문취소할 수 없는 상태입니다.(주문수락,배달준비중,배달중,배달완료,주문취소)";
                    echo json_encode($res, JSON_NUMERIC_CHECK);
                    break;
                }
                $name=getUserName($orderInfo[0]['userIdx']);

                $result = $bootpay->cancel($receiptId,'',$name,'단순변심');
                if ($result->status === 200) {
                    // 주문 상태 바꾸기
                    deleteOrder($orderIdx);
                    $res->isSuccess = TRUE;
                    $res->code = 1000;
                    $res->message = "주문/결제 취소 성공";
                    echo json_encode($res, JSON_NUMERIC_CHECK);
                    break;
                }
                else{
                    $res->isSuccess = FALSE;
                    $res->code = 3000;
                    $res->message = "주문/결제 취소 실패";
                    echo json_encode($res, JSON_NUMERIC_CHECK);
                    break;
                }
            }
            else{
                $res->isSuccess = FALSE;
                $res->code = 3001;
                $res->message = "status가 200이 아닙니다.(액세스토큰받기실패)";
                echo json_encode($res, JSON_NUMERIC_CHECK);
                break;
            }

 

 

부트페이 개발문서에 있는 깃허브링크들어가서 필요한 코드들 가져오면 되는데 폴더 구조가 다르다보니 그걸 맞춰주는데 시간을 많이 썼다. 

부트페이 개발문서는 매우 친절한 편이고 개발문서보고 개발하면 쉽게 개발할 수 있을 것이다~!

 

 

나의 깃허브링크

github.com/kimmjieun/coupang_eats_server/blob/main/api-server/controllers/PayController.php

 

kimmjieun/coupang_eats_server

쿠팡이츠 클론 프로젝트 (서버개발). Contribute to kimmjieun/coupang_eats_server development by creating an account on GitHub.

github.com

 

 

참고 

 

tyrannocoding.tistory.com/11

 

[JAVA, SPRING, BOOTPAY] 부트페이 검증하기(SERVER)

부트페이 연동 : tyrannocoding.tistory.com/10 [JAVA, SPRING] 부트페이 연동(WEB) 부트페이란?  부트페이(Bootpay)는 무료로 서비스되는 결제 연동 API 입니다.  장점으로는 PG 계약과 상관없이 즉시 개발이..

tyrannocoding.tistory.com

 

 

blog.naver.com/canbe76/221654134945

 

[전주홈페이지제작]부트페이(Bootpay) 무료 결제 연동 API (한번에 다양한 PG사 결제연동) :: PHP 웹 연

부트페이(Bootpay)는 무료로 서비스되는 결제연동 API입니다.http://www.bootpay.co.kr/무ቺ...

blog.naver.com

growingsaja.tistory.com/514

 

[Python][Bootpay] 결제 검증 환경 구성하기

 [ 작업 환경 ] Centos 7.8 Python 3.6 Flask 1.1 부트페이 활용 신청을 정상적으로 완료하여 승인이 된 후에 아래 작업을 진행해주셔야합니다. 1. 결제 검증 요청시 필요한 인증키와 어플리케이션 ID 확인

growingsaja.tistory.com

medium.com/@bootpay.co.kr/%ED%8E%98%EC%9D%B4%EC%95%B1-api%EB%A1%9C-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-%EA%B2%B0%EC%A0%9C-%EA%B2%80%EC%A6%9D-2-3-4659bd100f86

 

페이앱 API로 연동하기 — 결제 검증 (2/3)

페이앱을 부트페이를 통해서 결제를 연동하였다. 결제 연동은 클라이언트에서, 결제 검증 및 취소는 서버사이드에서 이루어진다. 따라서 결제 연동은 javascript, android, ios 환경에서 연동하며, 결

medium.com

 

반응형