부트페이 API - 결제 검증, 결제취소
2021. 3. 2. 00:11ㆍAPI
반응형
많은 애플리케이션에서 결제를 많이 사용한다.
결제기능을 구현하기 위해서 부트페이 api를 사용하였고 서버단에서 해야할 일은 결제 검증과 취소이다.
결제 검증하기
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
참고
blog.naver.com/canbe76/221654134945
반응형
'API' 카테고리의 다른 글
농림축산식품 공공데이터 API 이용하기 (0) | 2021.04.11 |
---|---|
구글 로그인 API (Google Sign-In API) (0) | 2021.03.17 |
네이버로그인 API - 액세스토큰 발급, 사용자 정보 받기 (0) | 2021.02.03 |
카카오 로그인 API - 액세스 토큰 발급, 사용자 정보 받아오기 (1) | 2021.02.02 |