https://yellowdonkey0329.blogspot.com/2018/12/django.html

위의 블로그를 참고하여 만들었다. 

 

공식문서를 확인하고 싶다면

https://docs.iamport.kr/implementation/payment

접속하면 된다.

 

1. iamport 가입

일단 iamport 홈페이지에 접속해서 회원 가입을 한 뒤 로그인을 하고

다음 정보를 기억하자 (메모장에 적어놓으면 된다.)

1. 가맹점 식별코드

2. REST API 키 

3. REST API secret

 

2. billing app 만들기

굳이 app을 만들필요는 없지만 나는 billing app을 만들어 적용을 하였다. 나중에 결제 기능을 수정할 수도 있으니 app을 만들어서 관리하는 것이 좋다고 생각한다. 

 

python manage.py startapp billing을 해주고 settings/base.py에 billing을 등록시켜준다. 그리고 당장은 Django의 view를 사용할 계획이니 urls.py에 billing의 urls을 등록해준다. 

 

base.py
urls.py

3. templates 작성

templates/billing/pay.html

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <script src="http://code.jquery.com/jquery-1.12.4.min.js" ></script>
        <script src="http://service.iamport.kr/js/iamport.payment-1.1.5.js"></script>
        <script>
            IMP.init('imp');
            let csrftoken = '{{ csrf_token }}'
            IMP.request_pay({
                pg: 'html5_inicis',
                pay_method: 'card',
                merchant_uid: 'merchant_' + new Date().getTime(),
                name: '테스트입니다.',
                amount: 100,
                buyer_email: 'iamport@siot.do',
                buyer_name: 'yellowdonkey',
                buyer_tel: '010-1234-5678',
                buyer_addr: '서울특별시 강남구 삼성동',
                buyer_postcode: '123-456'
            }, function (rsp) {
                if (rsp.success) {
                    //[1] 서버단에서 결제정보 조회를 위해 jQuery ajax로 imp_uid 전달하기
                    jQuery.ajax({
                        url: "/payments/complete/", //cross-domain error가 발생하지 않도록 동일한 도메인으로 전송
                        headers:{'X-CSRFToken':csrftoken},
                        type: 'POST',
                        dataType: 'json',
                        data: {
                            imp_uid: rsp.imp_uid
                            //기타 필요한 데이터가 있으면 추가 전달
                        },
                    }).done(function (data) {
                        //[2] 서버에서 REST API로 결제정보확인 및 서비스루틴이 정상적인 경우
                        alert("ajax done");               
                        console.log("ajax done");
                        if (data.status=='success') {
                            var msg = '결제가 완료되었습니다.';
                            msg += '\n고유ID : ' + rsp.imp_uid;
                            msg += '\n상점 거래ID : ' + rsp.merchant_uid;
                            msg += '\결제 금액 : ' + rsp.paid_amount;
                            msg += '카드 승인번호 : ' + rsp.apply_num;
                            alert(msg);
                            console.log(msg);
                        } else {
                            //[3] 아직 제대로 결제가 되지 않았습니다.
                            //[4] 결제된 금액이 요청한 금액과 달라 결제를 자동취소처리하였습니다.
                            var msg = '아직 제대로 결제가 되지 않았습니다.';
                            alert(msg);
                            console.log(msg);
                        }
                    }).fail(function () {
                        alert("ajax fail");
                        console.log("ajax fail");
                    }).always(function () {
                        alert("ajax always");
                        console.log("ajax always");
                    });
                } else {
                    var msg = '결제에 실패하였습니다.';
                    msg += '에러내용 : ' + rsp.error_msg;
                    alert(msg);
                }
            });
        </script>
    </head>

    <body>
    </body>

</html>

IMP.init에는 아까 저장해놓은 가맹점 식별코드를 넣으면 된다.

 

추후에 템플릿 언어로 관련 정보를 바꿔주면 될 것이다. 결제가 완료되면 ajax을 통해 POST로 json 형태의 데이터를 서버에 보내줄 것이다. 

 

4. urls.py 작성

ajax 부분을 통해 결제가 성공했을 때, 관련정보가 /payments/complete/을 통해 전달되는 것을 확인할 수 있다. 이제 billing app의 urls를 작성해보자.

 

billing/urls.py

from . import views
from django.conf.urls import url
from django.views.generic import TemplateView


urlpatterns = [
    url(r'^payment_test/$', TemplateView.as_view(template_name='billing/pay.html'), name='payment_test'),
    url(r'^payments/complete/$', views.payment_complete, name='payment_complete'),
]

 

5. View.py 작성

이제 POST를 통해 데이터가 왔을 때, 처리하기 위해 view를 정의하면된다. 현재는 블로그의 튜토리얼을 따라하는 과정이라 wagtail의 page가 아닌 view로 해보려고 한다.

 

from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.utils.decorators import method_decorator
import json
import requests


# Create your views here.
@method_decorator(csrf_exempt)
def payment_complete(request):

    if request.method == 'POST' and request.is_ajax():
        imp_uid = request.POST.get('imp_uid')

        # // 액세스 토큰(access token) 발급받기
        data = {
            "imp_key": "",
            "imp_secret": ""
        }

        response = requests.post('https://api.iamport.kr/users/getToken', data=data)
        data = response.json()
        my_token = data['response']['access_token']

        #  // imp_uid로 아임포트 서버에서 결제 정보 조회
        headers = {"Authorization": my_token}
        response = requests.get('https://api.iamport.kr/payments/'+imp_uid, data=data, headers = headers)
        data = response.json()

        # // DB에서 결제되어야 하는 금액 조회 const
        order_amount = 100
        amountToBePaid = data['response']['amount']  # 아임포트에서 결제후 실제 결제라고 인지 된 금액
        status = data['response']['status']  # 아임포트에서의 상태

        if order_amount==amountToBePaid:
            # DB에 결제 정보 저장
            # await Orders.findByIdAndUpdate(merchant_uid, { $set: paymentData}); // DB에
            if status == 'ready':
                # DB에 가상계좌 발급정보 저장
                return HttpResponse(json.dumps({'status': "vbankIssued", 'message': "가상계좌 발급 성공"}),
                                    content_type="application/json")

            elif status=='paid':
                return HttpResponse(json.dumps({'status': "success", 'message': "일반 결제 성공"}),
                                    content_type="application/json")

            else:
                pass

        else:
            return HttpResponse(json.dumps({'status': "forgery", 'message': "위조된 결제시도"}), content_type="application/json")
    else:
        return render('payment_complete.html', locals())

처음에 저장해놓은 key와 secret을 넣으면 된다.

view에서 하는 일은 html을 통해 결제가 될 때, 결제 정보를 받아서 imp_uid를 통해 iamport 서버에서 조회하여 확인하는 과정을 거친다. 

 

'Back-End > Django' 카테고리의 다른 글

Django Signals  (0) 2021.10.22
Django ORM  (0) 2021.10.21
Django Bulma 적용 방법  (0) 2021.08.24
Django template 태그 모음  (0) 2021.08.12
Django Admin Custom 3(간단한 Custom 연습)  (0) 2021.08.09

+ Recent posts