57.Django(장고) - ecommerce 프로젝트 - 아임포트(결재모듈) 연동 - 코딩

JungSik Heo·2024년 12월 15일

1.\payment\admin.py

admin.site.register(Payment)

2.\payment\models.py

class Payment(models.Model):
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    imp_uid = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

3.\payment\views.py

def payment_process_order(request):
    
    if request.POST:

        cart = Cart(request)
        cart_products = cart.get_prods
        quantiles = cart.get_quants
        totals = cart.cart_total()
        cart_delete = cart.delete

        print(totals)
        
        #Gether Order Info
        if request.user.is_authenticated:
            
            print(request.POST['paid_amount'])

            #dev_47 금액이 같은지 확인
            #if totals == request.POST['paid_amount']:
            if 10 == int(request.POST['paid_amount']): #테스트를 위하여 10으로 넣고 대입입             
                #logged in
                user = request.user
                #Create Order
                create_order = Order(user=user)
                create_order.amount_paid = totals
                create_order.save()

                #dev_44
                #Add Order Items
                #Get the oorder ID
                order_id = create_order.pk

                #Get product info
                for product  in cart_products():
                    product_id = product.id
                    #Get product price
                    if product.is_sale:
                        price = product.sale_price
                    else:
                        price = product.price

                    #Get quantity
                    for key,value in quantiles().items():
                        if int(key)  == product.id:
                            #Create Order Item
                            create_order_item = OrderItem(order_id=order_id,product_id=product_id,quantity=value,price=price)
                            create_order_item.save()            
                
                
                #Delete cart item(만약 카트도 지우고 싶다면)
                for key in list(quantiles().keys()):
                    cart_delete(key)
                
                #결재 데이터 저장
                create_payment = Payment(order=create_order)
                create_payment.imp_uid = request.POST['imp_uid']
                create_payment.save()
            
                #messages.success(request, "결재 금액이 일치합니다.")
                return HttpResponse("SUCCESS")

            else:
                #messages.success(request, "결재 금액이 일치하지 않습니다.")
                return HttpResponse("FAIL")

        else:
            messages.success(request, "You Must be logged In To order the products")
            return redirect('/login')
    else:
        messages.success(request, "Access denied")
        return redirect('/')

4.\templates\cart\cart_summary.html

{% extends 'layout/base.html' %}
{% load static %}

{% block content %}

  {% comment %} #dev_47 head 수정 {% endcomment %}
  {% include 'payment/head.html' %}
  
  {% comment %} dev_47 {% endcomment %}
  <script>

    var impCode = 'imp43216235';

    function handlePayment(pg, pay_method){
      console.log("handlePayment");
      console.log(pg);
      console.log(payMethod);

      // 결제하기 버튼 클릭 시 결제 요청
      IMP.init(impCode);
      IMP.request_pay({
          pg: pg,
          pay_method: payMethod,
          //merchant_uid: '212R3A11TD233AAC', // 주문번호 생성(생략시 포트원에서 자동생성)
          name: '상품1', //결제창에 노출될 상품명
          amount: 3000, // 결제 가격
          buyer_name: '김민규',
          buyer_tel: '010-1234-5678'
        }, function(rsp) {
            if (rsp.success) {
                // 결제 성공 시
                $.ajax({
                    type: 'POST',
                    url: 'api/v1/payment/validation/' + rsp.imp_uid
                }).done(function(data) {
                    console.log(data);
                    if (order.price == data.response.amount) {
                        order.impUid = rsp.imp_uid;
                        order.merchantUid = rsp.merchant_uid;
                        // 결제 금액 일치. 결제 성공 처리
                        $.ajax({
                            url: "api/v1/payment/order",
                            method: "post",
                            data: JSON.stringify(order),
                            contentType: "application/json"
                        }).then(function(res) {
                            console.log("res", res);
                            console.log("rsp", rsp);
                            var msg = '결제가 완료되었습니다.';
                            msg += '고유ID : ' + rsp.imp_uid;
                            msg += '상점 거래ID : ' + rsp.merchant_uid;
                            msg += '결제 금액 : ' + rsp.paid_amount;
                            msg += '카드 승인번호 : ' + rsp.apply_num;
                            alert(msg);
                        }).catch(function(error) {
                            alert("주문정보 저장을 실패 했습니다.");
                        });
                    }
                }).catch(function(error) {
                    alert('결제에 실패하였습니다. ' + rsp.error_msg);
                });
            } else {
                alert(rsp.error_msg);
            }
        });
    }
  </script>


  <!-- 네비게이션바 -->
  {% include "layout/navbar.html" %}

  <header class="bg-dark py-5">
    <div class="container px-4 px-lg-5 my-5">
      <div class="text-center text-white">
        <h1 class="display-4 fw-bolder">장바구니</h1>
        <p class="lead fw-normal text-white-50 mb-0">View your Cart</p>
      </div>
    </div>
  </header>

  <br/>

  <div class="container">
    {% if cart_products%}
      {% for product in cart_products %}
        <form action="{% url 'payment:payment_process_order'%}" method="post">
          {% csrf_token %}
          <div class="card mb-3">
            <div class="row g-0">
              <div class="col-md-4">
                <img src=" {{product.image.url}}" style="width:100%;height:18rem;object-fit:fill" class="img-fluid rounded-start" alt="..."/>
              </div>
              <div class="col-md-8">
                <div class="card-body mt-4">
                  <center>
                    <h5 class="card-title">{{product.name}}</h5>
                    <p class="card-text">{{product.description}}</p>

                    {% if product.is_sale%}

                      <div class="d-flex justify-content-center small text-warning mb-2">
                        <div class="bi-star-fill"></div>
                        <div class="bi-star-fill"></div>
                        <div class="bi-star-fill"></div>
                        <div class="bi-star-fill"></div>
                        <div class="bi-star-fill"></div>
                      </div>
                      <!-- Product price-->
                      <strike>
                        ${{ product.price }}
                      </strike>
                      &nbsp; ${{product.sale_price}}
                    {% else %}
                      ${{ product.price }}
                      <br/>
                      ID :
                      {{product.id}}
                      {%endif%}
                      <br/><br/>
                      <div class="row justify-content-center">
                        <div class="col-md-2">Quantity</div>
                        <div class="col-md-2">
                          <select class="form-select form-select-sm" id="select{{product.id}}" aria-label="Default select example">
                            {% for key, value in quantities.items %}
                              {% if key == product.id|slugify%}
                                <option selected="selected">{{ value }}</option>
                              {% endif %}
                            {% endfor %}
                            <option value="1">1</option>
                            <option value="2">2</option>
                            <option value="3">3</option>
                            <option value="4">4</option>
                            <option value="5">5</option>
                          </select>
                        </div>
                      </div>
                      <br/>
                      <a href="{% url 'store:home' %}" class="btn btn-secondary">홈으로</a>
                      {% comment %} <button type="button" value="{{product.id}}" id="add-cart" class="btn btn-secondary">Add to Cart</button> {% endcomment %}
                      <button type="button" data-index="{{product.id}}" class="btn btn-secondary update-cart">업데이트</button>
                      <button type="button" data-index="{{product.id}}" class="btn btn-danger delete-product">삭제</button>
                    </center>
                  </div>
                </div>
              </div>
            </div>
          {% endfor %}
          {% comment %} #dev_43 {% endcomment %}
        </form>
        {% comment %} #dev_47 임시로 {% endcomment %}
        <div class="text-center">
          <h3 id="totals" data-totals="{{totals}}">Total:{{totals}}원</h3>
          {% comment %} <a class="btn btn-success text-center" href="{% url 'payment:payment_process_order'%}">주문</a> {% endcomment %}
          {% comment %} <button id="cardPay" onclick="handlePayment('html5_inicis.INIpayTest', 'card')" type="submit" class="btn btn-success text-center" >카드결제</button>
          <button id="kakaoPay" onclick="handlePayment('kakaopay', 'card')" type="submit" class="btn btn-success text-center" >카카오페이</button> {% endcomment %}
          <button id="cardPay" data-pg="html5_inicis.INIpayTest" data-pay="card"  class="btn btn-success text-center request-pay" >카드결제</button>
          <button id="kakaoPay" data-pg="kakaopay" data-pay="card" class="btn btn-success text-center request-pay" >카카오페이</button>
        </div>
        <br />
        <br />
        <br />
      {% else %}
        There's Nothing in your cart
      {% endif %}
    </div>

    <script>

      $(document).on('click', '.request-pay', function (e) {
        let pg = $(this).data('pg');
        let payMethod = $(this).data('pay');
        let priceTotals = $("#totals").data('totals');        

        // 결제하기 버튼 클릭 시 결제 요청
        IMP.init(impCode);
        IMP.request_pay({
          pg: pg,
          pay_method: payMethod,
          //merchant_uid: '212R3A11TD233AAC', // 주문번호 생성(생략시 포트원에서 자동생성)
          name: '장바구니 주문', //결제창에 노출될 상품명
          //amount: priceTotals, // 결제 가격
          amount: 10,//테스트를 위하여 10원으로 설정
          buyer_name: '{{user.username}}', // 구매자 이름
          buyer_tel: '010-1234-5678',
          buyer_email: '{{user.email}}', // 구매자 이메일,
          //buyer_addr : buyerAddress, // 구매자 주소
          //buyer_postcode : '123-456', // 임의의 값
        }, function(rsp) {
            if (rsp.success) {
                // 결제 성공 시
                console.log(rsp);
                console.log("결재성공");                
                
                // 결제 성공 시 로직
                //1.주문 정보 저장을 위해 ajax 요청
                //2.서버에서 결재금액과 주문금액(세션에 저장되어있는)이 일치하는지 확인
                //3.일치하면 주문 정보 및 결재정보 저장
                $.ajax({
                  type: 'POST',
                  url: '{% url "payment:payment_process_order" %}',
                  data: {
                    imp_uid: rsp.imp_uid, //결재아이디(포트원에서 생성된 고유값)
                    paid_amount: rsp.paid_amount, //결재 금액                    
                    csrfmiddlewaretoken: '{{  csrf_token }}',
                    action: 'post'
                  },
                  success: function (response) {
                    console.log(response);
                    if(response == 'SUCCESS') {
                      alert('결제가 완료되었습니다.');
                      location.href = '/';
                    }else {
                      alert('결제에 실패하였습니다');
                      location.reload();
                    }
                    
                  },
                  error: function (e) {
                    alert('결제에 실패하였습니다. ' + rsp.error_msg);
                  }
                });
              } else {
                alert(rsp.error_msg);
              }
        });

      });


      $(document).on('click', '.update-cart', function (e) {
        let productid = $(this).data('index');
        let qty = $('#select' + productid + ' ' + 'option:selected').text();

        $.ajax({
          type: 'POST',
          url: '{% url "cart:cart_update" %}',
          data: {
            product_id: $(this).data('index'),
            product_qty: qty,
            csrfmiddlewaretoken: '{{  csrf_token }}',
            action: 'post'
          },
          success: function (json) {
            console.log(json);
            location.reload();
          },
          error: function (e) {
            console.log(e);
          }
        });
      });

      $(document).on('click', '.delete-product', function (e) {
        let productid = $(this).data('index');
    
        $.ajax({
          type: 'POST',
          url: '{% url "cart:cart_delete" %}',
          data: {
            product_id: $(this).data('index'),    
            csrfmiddlewaretoken: '{{  csrf_token }}',
            action: 'post',
          },
          success: function (json) {
            console.log(json);
            location.reload(); //페이지 새로 고침
          },
          error: function (e) {
            console.log(e);
          },
        });
      });
    </script>
  {%endblock content%}

5. templates\payment\head.html

{% load static %}

<head>
  <meta charset="utf-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
  <meta name="description" content=""/>
  <meta name="author" content=""/>
  <title>결제페이지</title>
  <!-- Favicon-->
  <link rel="icon" type="image/x-icon" href="{% static 'store/assets/favicon.ico' %}"/>
  <!-- Bootstrap icons-->
  <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet"/>
  <!-- Core theme CSS (includes Bootstrap)-->
  <link href="{% static 'store/css/styles.css' %}" rel="stylesheet"/>

  
  {% comment %} #dev_47 {% endcomment %}
  <!-- 아임포트 CDN -->
  <!-- jQuery -->
  <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  <!-- iamport.payment.js -->
  <script type="text/javascript" src="https://cdn.iamport.kr/js/iamport.payment-1.2.0.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/axios@1.1.2/dist/axios.min.js"></script>
  <!-- 아임포트 끝 -->

  <!-- Bootstrap core JS-->
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
  <!-- Core theme JS-->
  <script src="{% static 'store/js/scripts.js' %}"></script>
</head>

아래를 확인

profile
쿵스보이(얼짱뮤지션)

0개의 댓글