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)
if request.user.is_authenticated:
print(request.POST['paid_amount'])
if 10 == int(request.POST['paid_amount']):
user = request.user
create_order = Order(user=user)
create_order.amount_paid = totals
create_order.save()
order_id = create_order.pk
for product in cart_products():
product_id = product.id
if product.is_sale:
price = product.sale_price
else:
price = product.price
for key,value in quantiles().items():
if int(key) == product.id:
create_order_item = OrderItem(order_id=order_id,product_id=product_id,quantity=value,price=price)
create_order_item.save()
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()
return HttpResponse("SUCCESS")
else:
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,
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>
<strike>
${{ product.price }}
</strike>
${{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,
name: '장바구니 주문',
amount: 10,
buyer_name: '{{user.username}}',
buyer_tel: '010-1234-5678',
buyer_email: '{{user.email}}',
}, function(rsp) {
if (rsp.success) {
console.log(rsp);
console.log("결재성공");
$.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>
<link rel="icon" type="image/x-icon" href="{% static 'store/assets/favicon.ico' %}"/>
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet"/>
<link href="{% static 'store/css/styles.css' %}" rel="stylesheet"/>
{% comment %} #dev_47 {% endcomment %}
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<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>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="{% static 'store/js/scripts.js' %}"></script>
</head>
아래를 확인

