쪼렙 as! 풀스택

iamport 이용하여, 정기결제 붙이기. 본문

개발 일지/Web & Server

iamport 이용하여, 정기결제 붙이기.

코코앱 2019. 8. 15. 19:19

https://alzi.net  에 정기결제를 붙이는 작업을 했다.

 

정기결제는 일반결제와 프로세스가 다르다.

 

이전에 일반결제로 다 붙여놓았더니, 대표가, 정기결제로 하쟤서 어쩔수 없이 다 바꿨다.

 

일단 우리는 KG 이니시스를 이용한 정기결제를 사용하게 되었다. 

이니시스로 '정기결제' 요청을  데스크탑 PC 에서 하면,

'주민등록번호'와, '공인인증서'를 요구한다. ;;;; 지금이 어떤 시댄데;;;

 

결제프로세스는 이렇다.

 

일단, 사용자의 카드정보를 입력하는 이니시스 결제창을 띄운다음, 사용자의 '빌링키'를 얻어온다.

IMP.request_pay({
  pg : "html5_inicis.INIBillTst", // 실제 계약 후에는 실제 상점아이디로 변경
  pay_method : 'card', // 'card'만 지원됩니다.
  merchant_uid : "MERCHANT_ID",
  name : '상품명',
  amount : 0, // 결제창에 표시될 금액. 실제 승인이 이뤄지지는 않습니다. (모바일에서는 가격이 표시되지 않음)
  customer_uid : "CUSTOMER_UID", //customer_uid 파라메터가 있어야 빌링키 발급을 시도합니다.
  buyer_email : "asdf@asdf.com",
  buyer_name : "사용자 이름",
  buyer_tel : "010xxxxxxxx"
  }, (rsp) => {
  	if ( rsp.success ) {
	  console.log('빌링키 발급 성공', rsp)
	  //빌링키 발급이 완료되었으므로, 우리서버에 바로 결제 요청을 시작.
  	} else {
	  alert(rsp.error_msg);
	  console.error(rsp)
  	}
 });

 

빌링키를 성공적으로 받아오면, 우리 서비스 서버에 CUSTOMER_UID 를 보내서 저장해두고,

그 customer_uid 를 이용해서, 결제를 요청하면 되는것이다.

 

나는 PHP 를 이용하므로, iamport PHP 라이브러리를 사용했다.

https://github.com/iamport/iamport-rest-client-php

 

처음, 빌링키를 받으면, 곧바로 iamport->subscrtionAgain 을 이용하여 바로 결제를 진행한다.

$iamport = new Iamport(IMP_API_KEY, IMP_API_SEC);
$data = ['customer_uid'=>$customerUid, 'merchant_uid'=>'MERCHANT_UID',
	'amount'=>'19900', 'name'=>'상품명',
	'buyer_tel'=>'010-xxxx-xxxx', 'buyer_email'=>'asdf@asdf.com' ];
$result = $iamport->subscribeAgain($data);
if ( $result->success ) {
	/**
	*	IamportPayment 를 가리킵니다. __get을 통해 API의 Payment Model의 값들을 모두 property처럼 접근할 수 있습니다.
	*	참고 : https://api.iamport.kr/#!/subscribe/payments/again 의 Response Model
	*/
	$payment_data = $result->data;
	echo '## 결제정보 출력 ##';
	echo '결제상태 : '. $payment_data->status;
	echo '결제금액 : '. $payment_data->amount;
	echo '결제수단 : '. $payment_data->pay_method;
	echo '결제된 카드사명 : '. $payment_data->card_name;
	echo '결제(실패) 매출전표 링크 : '. $payment_data->receipt_url;
	if ($payment_data->status == 'paid') {
		// 결제성공
	}
	else {
		// 결제실패
        echo $payment_data->fail_reason;
	}
} else {
	echo $result->error['code'];
    echo $result->error['message'];
}

 

그럼이제, 정기결제를 위해, 다음 결제를 예약해야 한다. 결제가 완료가 되면, iamport 대시보드에 설정해놓은 WebHook 으로, 내 서버로 요청이 들어온다.

 

그리고 저렇게 결제가 완료가 되면

여기에 저장해둔 Notification URL 에 등록한 내 서버의 훅 URL 에 요청이 들어온다.

 

그러면 거기서 결제 완료가 되었으니, 다음 결제 예약을 하면 되는것이다.

 

$iamport = new Iamport(IMP_API_KEY, IMP_API_SEC);
$scheduledAt = time() + 100; //지금부터 100초 후에 예약 결제
$data = ['customer_uid'=>$customerUid];
$data['schedules'] = [['merchant_uid'=>'MERCHANT_UID', 'schedule_at'=>$scheduledAt,
	'amount'=>'가격', 'name'=>'상품명','buyer_name'=>'구매자명'
	]];
$result = $iamport->subscribeSchedule($data);
if($result->success) {
	//결제 예약이 성공하였다.
}else {
	echo $result->error['code'];
	echo$result->error['message'];
}

주의해야할게, 한번에 여러개의 결제 예약을 걸 수 있다. 그래서 'schedules'는 배열이다. 

 

이러면, 결제가 성공되면, 내 서버의 웹 훅이 호출되고,

웹 훅에서 결제 성공이 되었으니, 다음 결제 예약이 또 되고, 이런식이다.

 

 

 

Comments