본문 바로가기

Programming/php

[php] 아임포트 가상계좌 입금처리(webhook)

결제방식 무통장입금으로 고객이 발급된 가상계좌로 입금했을 때 자동으로 결제완료로 주문상태를 변경처리 필요

 

아임포트에서 지원하는 웹훅으로 결제상태를 전달받고 주문의 상태를 변경해준다.

 

1. 아임포트 관리자 콘솔 설정

아임포트 관리자콘솔 시스템설정

상태를 변경해줄 파일 url을 입력해주고 content-type을 지정해준다.

(application/json 타입으로 받으면 응답이 어떤 형태로 오는지 알 수 없어서 한참 삽질하다 그냥 urlencoded 형태로..)

url 인풋창 우측에 호출테스트 눌러보면 위와같이 url형태로 값들이 전송되는 것을 확인가능.

imp_uid : 아임포트에서 생성된 주문uid

merchant_uid : 서버에서 생성해 결제시 전송한 쇼핑몰 uid

status : 결제상태

 

가상계좌 입금을 확인하는 경우 3. 가상계좌에 결제 금액이 입금되었을 때(status : paid) 만 처리해주면 된다.

나머지 경우는 따로 필요없어서 처리하지 않았음

 

2. 웹훅 처리할 파일 작성

이 경우에는 결제타입(pay_method)이 가상계좌입금 또는 무통장입금(vbank) 일 때만 처리해주면 되기때문에

post로 받은 변수중 merchant_uid 값을 들고와서 해당 값을 db에서 검색해서 들고오고

주문의 상태를 변경, 결제를 완료로 바꿔준다.

 

//아임포트 라이브러리
require_once($_SERVER['DOCUMENT_ROOT'].'/lib/iamport.php');
$IAMPORT = new Iamport(IAMPORTREST, IAMPORTSEC);

$ot_code = $_POST['merchant_uid'];
$query = "select * from 주문정보테이블 where ot_code = '{$ot_code}'";
$row = mysqli_fetch_assoc($query);

//검색해온 주문이 가상계좌 결제이면서 아직 결제대기 상태일때만 처리해준다.
if($row['pay_type'] == 'vbank' && $row['pay_status'] == 'ready'){
	//아임포트 라이브러리로 다시한번 결제 상태 확인해오기
    $iamport = $IAMPORT->findByMerchantUID($ot_code);
    if($iamport->data->status == 'paid') {
        if($row['ot_price'] == $iamport->data->amount){
        	//결제완료되었고 입금된 금액이 주문건에 있는 금액과 같다면
            //주문상태를 pay_status를 paid로 변경하고 결제완료일시를 업데이트해줌
            ....생략....
        }
    }
}

입금금액과 실제 주문금액을 대조해서 다르면 결제를 취소하고

입금액을 환불처리하는 로직도 짰는데 테스트해보니 가상계좌가 주문금액과 다른 금액을 입금하려고 시도하면

입금부터가 막혀있어서 이부분은 소용이 없었다는..ㅋ