Liam
Liam
I'm studying 🥸

AWS Lambda에 Bootpay연동하기 - 결제 검증

AWS Lambda에 Bootpay연동하기 - 결제 검증



💡 Intro

BootPay는 무료로 서비스되는 결제 검증 API입니다. 초기에 일반 PG 사와 별도의 계약 없이 개발을 먼저 할 수 있어서, 인앱 결제가 급하게 필요했던 저는 BootPay를 이용하기로 했습니다. 간단하게 사용방법을 정리해 보도록 하겠습니다.(매우 간단해요!)🙌



🔎 Bootpay란?

부트페이는 개발자를 위한 결제연동 서비스로, 구글 애널리틱스와 같이 결제 데이터 분석 서비스를 제공합니다. 또한 웹, 앱 SDK 모두 지원하며 국내외 여러 PG(복수 선택 가능)와 결제수단을 소스코드 한 줄로 사용할 수 있으므로 불필요한 작업을 줄일 수 있습니다.



📚 결제 검증

부트페이 측에서는 결제 검증에 대해, 이렇게 설명하고 있습니다.

결제 검증을 해야하는 이유

  • 결제 연동은 Client Side에서 동작되기 때문에 결제 금액 및 결제 상태에 대한 변조가 가능하다고 합니다. 그러므로 반드시 처음 요청했던 금액과 결제가 올바르게 이루어졌는지에 대해 서버사이드에서 서버로 영수증 키를 보내 확인하는 과정을 거쳐야 합니다.

그렇다면 결제 검증을 무조건 해야하나요?

  • 결제 검증을 하지 않더라도 PG사에서 제공하는 결제 로직을 모두 완료할 수 있습니다. 방금 말했다시피, 실제 결제가 이루어지지만 Client Side에서 언제든 변조된 데이터를 구현하신 서버로 보내 부정적인 방법으로 구매 완료 데이터를 보낼 수 있기 때문에, 결제 검증은 필수로 하는것이 좋다고 Bootpay에서는 설명하고 있습니다.

📕 1. Lambda layer생성

Bootpay 결제 검증 및 취소 모듈(python)을 다운 받은 뒤, 아래와 같이 Lambda layer를 생성합니다.


Add_layer.png


📘 2. Add a layer


생성한 Bootpay layer를 Lambda함수에 추가해 줍니다.


Lambda_layer.png


그리고 import합니다.


1
from lib.BootpayApi import BootpayApi



📒 3. 검증코드 작성하기

아래와 같이 검증코드만 작성하면 매우 간단하게 결제 검증을 끝낼 수 있습니다.😀 저는 웹결제가 없었기 떄문에 앱에서 결제 후 서버사이드에서 결제 검증만 진행하였으며, application_id와 private_key는 Bootpay 관리자에서 확인할 수 있습니다. 또한 아래 코드와 같이 결제 금액으로 비교를 해주면 되는데, 가격말고도 원하는 다른 데이터를 추가로 비교할 수 도있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from lib.BootpayApi import BootpayApi

bootpay = BootpayApi(
    '[[ application_id ]]',
    '[[ private_key ]]'
)

result = bootpay.get_access_token()
if result['status'] is 200:
    verify_result = bootpay.verify('[[ receipt_id ]]')
    if verify_result['status'] is 200:
        # 원래 주문했던 금액이 일치하는가?
        # 그리고 결제 상태가 완료 상태인가?
        if verify_result['data']['status'] is 1 and verify_result['data']['price'] is price:
            # TODO: 이곳이 상품 지급 혹은 결제 완료 처리를 하는 로직으로 사용하면 됩니다.



🔮 검증결과

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
31
32
33
34
35
36
{
  "status": 200,
  "code": 0,
  "message": "",
  "data": {
    "receipt_id": "",
    "order_id": "12345678910",
    "name": "테스트음식",
    "price": 3000,
    "unit": "krw",
    "pg": "kcp",
    "method": "card",
    "pg_name": "KCP",
    "method_name": "카드결제",
    "payment_data": {
      "card_name": "BC카드",
      "card_no": "",
      "card_quota": "00",
      "card_auth_no": "",
      "receipt_id": "",
      "n": "테스트음식",
      "p": 3000,
      "pg": "KCP",
      "pm": "카드결제",
      "pg_a": "kcp",
      "pm_a": "card",
      "o_id": "",
      "p_at": "2021-12-27",
      "s": 1,
      "g": 2
    },
    "requested_at": "2021-12-27 16:47:52",
    "purchased_at": "2021-12-27 16:48:53",
    "status": 1
  }
}


결제가 완료되면 “s”값이 1이 나옵니다. “status”의 경우 현재 결제의 상태를 보여주는데, 다음과 같이 나타낼 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
gist4
결제 상태 ( 현재 결제의 상태를 나타냅니다. 결제 검증에서 가장 중요한 지표가 됩니다. )

0 - 결제 대기 상태입니다. 승인이 나기 전의 상태입니다.
1 - 결제 완료된 상태입니다.
2 - 결제승인  상태입니다. transactionConfirm() 함수를 호출하셔서 결제를 승인해야합니다.
3 - 결제승인  상태입니다. PG사에서 transaction 처리중입니다.
20 - 결제가 취소된 상태입니다.
-20 - 결제취소가 실패한 상태입니다.
-30 - 결제취소가 진행중인 상태입니다.
-1 - 오류로 인해 결제가 실패한 상태입니다.
-2 - 결제승인이 실패하였습니다.


서류작성 및 PG사 심사(앱 결제테스트 등)는 거의 3주 가까이 걸렸는데, 서버사이드의 작업은 3시간도 채 걸리지 않고 작업을 끝낼 수 있었습니다. 또한 Bootpay 개발자와 원할한 소통도 가능하고 Bootpay 버그에 대한 수정 요청도 빠르게 처리해 주기 때문에,(우리는 앱단에서 요청사항이 있었는데, 4일내로 업데이트 해주셨음…) 저 처럼 빠른시일내 앱결제 시스템이 필요한경우가 있으신분은 Bootpay를 한번 고려해보는것도 좋은 선택인것 같습니다!😛



[참고자료]

comments powered by Disqus