일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- react
- Android
- 웹뷰
- ios
- beanstalk
- S3
- https
- cors
- TypeScript
- node.js
- NeXT
- angular4
- php
- Route53
- node
- 카카오톡
- AWS
- 네이티브
- hybrid
- fanzeel
- nextjs
- JavaScript
- swift
- angular
- Elastic Beanstalk
- 도메인
- 페이스북
- 안드로이드
- 감사일기
- 알려줌
- Today
- Total
쪼렙 as! 풀스택
iamport 이용하여, 정기결제 붙이기. 본문
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'는 배열이다.
이러면, 결제가 성공되면, 내 서버의 웹 훅이 호출되고,
웹 훅에서 결제 성공이 되었으니, 다음 결제 예약이 또 되고, 이런식이다.
'개발 일지 > Web & Server' 카테고리의 다른 글
안드로이드 하이브리드앱 웹뷰 WebView 에서 카카오톡 로그인 (앱) 사용하기 (2) | 2019.11.23 |
---|---|
MySQL, 정렬한 기준으로 1:1로 Join 해서 데이터 가져오기. group by 안쓰고 해결;; (0) | 2019.09.03 |
메일건 mailgun.com 에서 메일링 리스트 관리하기, 메일링 리스트에 속해있는 사람들에게 모두 메일 보내기. (0) | 2019.02.18 |
React - drag-list 로 항목 순서 변경하기. (0) | 2019.02.18 |
S3 에 업로드할 때, Cache-Control, MIME type 지정해주기. (0) | 2019.01.30 |