본문 바로가기
Project/pre-print-project

iamport를 활용한 m_redirect_url, webhook 테스트 진행하기

by 지식을 쌓는 개구리 2024. 7. 11.

 

iamport를 활용해서 테스트 결제 서비스를 개발 완료하고 이를 AWS까지 배포진행하였다.

지금은 로직상 페이지가 넘어가버리면 결제 진행이 끊겨버리기에 pc환경에서는 상관 없으나

모바일 환경에서는 결제를 진행할 때 페이지가 넘어가버리기 때문에 문제가 생길 수 밖에 없다.

따라서 m_redirect_url 설정을 통해 모바일 환경에서도 결제가 진행될 수 있게 해보겠다.

 

m_redirect_url 설정 

m_redirect_url 은 결제 처리 후 사용자가 리디렉션될 URL을 지정하는 데 사용되는 것으로

주로 모바일 결제 환경에서 활용되며 결제 완료 후 결과 페이지로 사용자를 안내하는 역할을 한다.

이 필드는 결제 요청 시 포함되어있고 결제가 완료되면 결제 게이트웨이가 사용자 브라우저를 이 URL로 리디렉션한다.

이를 통해 결제 결과를 처리하고 사용자에게 알릴 수 있다.

payment_props = {
    "merchant_uid": payment.merchant_uid,
    "name": payment.name,
    "amount": payment.desired_amount,
    "buyer_name": payment.buyer_name,
    "buyer_email": payment.buyer_email,
    "m_redirect_url": request.build_absolute_uri(check_url),
}

 

작동방식

1. 결제 요청

=> 결제 요청 시 m_redirect_url을 포함한 다양한 결제 정보를 결제 게이트웨이로 보낸다.

=> 위 코드에서 payment_props 딕셔너리 안에 m_redirect_url이 포함되어 있다.

 

2. 결제 처리

=> 결제 게이트웨이는 결제 요청을 처리하고, 결제가 완료되거나 실패하면 설정된 m_redirect_url로 사용자 브라우저를 리디렉션한다.

 

3. 리디렉션 후 처리

=> 사용자가 m_redirect_url로 리디렉션되면 해당 URL에서 결제 결과를 처리하고

사용자에게 결제 성공 또는 실패를 알리는 페이지를 보여준다.

=> 보통 이 URL에는 결제 결과에 대한 추가 파라미터가 포함되고 서버에서 이를 분석하여 적절한 후속 처리를 수행한다.

 

=> 모바일에서도 정상적으로 잘 작동된다! -> 페이지가 결제화면으로 넘어가도 다시 잘 돌아오는 모습

 

 

webhook 테스트 진행

Webhook은 특정 이벤트가 발생했을 때 자동으로 설정된 URL로 HTTP POST 요청을 보내는 방식이다.

이를 통해 서버 간의 실시간 통신이 가능해지며 이벤트 발생 시 자동으로 다른 시스템에 알림을 보낼 수 있다.

결제시스템이니 이 경우엔 결제가 완료되면 결제 게이트웨이가 설정된 웹훅 URL로 결제 결과를 전송해 주는 방식으로 사용된다.

=> iamport에 웹훅 테스트 연동을 진행해보자!

 

1. 코드 작성

@require_POST
@csrf_exempt
@deny_from_untrusted_hosts(settings.PORTONE_WEBHOOK_IPS)
def portone_webhook(request):
    if request.META["CONTENT_TYPE"] == "application/json":
        payload = json.loads(request.body)
        merchant_uid = payload.get("merchant_uid")
    else:
        merchant_uid = request.POST.get("merchant_uid")

    if not merchant_uid:
        return HttpResponse("merchant_uid 인자가 누락되었습니다.", status=400)
    elif merchant_uid == "merchant_1234567890":
        return HttpResponse("test ok")

    payment = get_object_or_404(OrderPayment, uid=merchant_uid)
    payment.update()

    return HttpResponse("ok")

 

요청 방식: @require_POST 데코레이터로 POST 요청만 허용한다. @csrf_exempt로 CSRF 검사를 비활성화한다.

신뢰할 수 있는 호스트 확인: @deny_from_untrusted_hosts 데코레이터로 설정된 IP 목록에서만 접근을 허용한다.

요청 처리: JSON 형식이면 request.body에서 데이터를 파싱하고 그렇지 않으면 request.POST에서 merchant_uid를 가져온다. merchant_uid가 없으면 400 응답을 반환한다. || merchant_uid가 특정 값이면 테스트 응답을 반환한다.

결제 정보 갱신: merchant_uid를 기반으로 결제 객체를 가져오고 존재하지 않으면 404 오류를 반환한다. 결제 객체를 갱신하고 "ok" 응답을 반환한다.

 

 

2. iamport 어드민 페이지에서 웹훅 테스트

=> 다음과 같이 엔드포인트 url 작성하고 "저장"버튼을 클릭하자. -> 꼭 저장 버튼 클릭후 진행해야함

 

=> 호출 테스트 버튼을 클릭하면 이렇게 우리가 설정한 상태코드가 출력되는 것을 확인할 수 있다!

 

 

실 결제서비스 연동시 진행되는 것이고 아직은 배포만 해둔 테스트 서비스 이기에 결제해도 웹훅 호출이 진행되지 않는다.

따라서 결제서비스 pg사와 연동 진행후 실결제 환경에서 진행되는 것이기에 후에 배포하고 실 url을 이곳에서 바꿔주면 된다.