해결된 질문
작성
·
215
0
order_detail까지 모두 잘 따라 만들었습니다.
이전에 테스트했을 때는 분명 안그랬던거 같은데...
결제를 하다가 중간에 나오거나 되돌아가면, 이게 redirect되면서 order_detail의 페이지로 이동합니다.
제 생각에는 결제를 시도하기 위한 페이지로 다시 돌아가는게 맞다고 생각하는데...
원래 이게 맞는건지, 아니면 제 코드가 잘못된건지 여쭤볼 수 있을까요?
models.py
class OrderPayment(AbstractPortonePayment):
order = models.ForeignKey(Order, on_delete=models.CASCADE, db_constraint=False, help_text="주문")
def update(self):
super().update()
if self.is_paid_ok:
self.order.status = Order.Status.PAID
self.order.save()
# 다수의 결제시도
self.order.orderpayment_set.exclude(pk=self.pk).delete()
elif self.pay_status in (self.PayStatus.CANCELED, self.PayStatus.FAILED):
self.order.status = Order.Status.FAILED_PAYMENT
self.order.save()
@classmethod
def create_by_order(cls, order: Order) -> "OrderPayment":
return cls.objects.create(
order=order,
name=order.name,
desired_valuation=order.valuation,
buyer_name=order.user.name,
buyer_email=order.user.email,
)
# 주문 생성
@login_required
def order_new(request, pk):
membership = Membership.objects.filter(pk=pk).first()
order = Order.create_from_membership_list(request.user, membership)
return redirect('membership:order_pay', order.pk)
# 주문 결제
@login_required
def order_pay(request, pk):
order = get_object_or_404(Order, pk=pk, user=request.user)
if not order.can_pay():
messages.error(request, "현재 결제를 할 수 없는 주문입니다.")
return redirect(order)
payment = OrderPayment.create_by_order(order)
payment_props = {
"pg": "uplus",
"pay_method": 'card',
"merchant_uid": payment.merchant_uid,
"name": payment.name,
"amount": payment.desired_valuation,
"buyer_name": payment.buyer_name,
"buyer_email": payment.buyer_email,
"buyer_tel": str(request.user.phone_number),
"buyer_addr": request.user.address,
"buyer_postcode": "00000"
}
return render(
request,
'membership/order_pay.html',
{
'portone_shop_id': settings.PORTONE_SHOP_ID,
'payment_props': payment_props,
'next_url': reverse('membership:order_check', args=[order.pk, payment.pk]),
}
)
# 결제 점검
@login_required
def order_check(request, order_pk, payment_pk):
payment = get_object_or_404(OrderPayment, pk=payment_pk, order__pk=order_pk)
payment.update()
return redirect('membership:order_detail', order_pk)
@login_required
def order_detail(request, pk):
order = get_object_or_404(Order, pk=pk, user=request.user)
return render(
request,
'membership/order_detail.html',
{
'order': order
}
)
답변 2
0
0
안녕하세요.
말씀하신 아래의 "결제를 하다가 중간에 나오거나 되돌아가면" 상황은 어떤 상황이실까요?
결제를 하다가 중간에 나오거나 되돌아가면, 이게 redirect되면서 order_detail의 페이지로 이동합니다.
결제 과정은 IMP.request_pay 자바스크립트 함수를 호출하면, 전적으로 포트원 API를 통해서 처리됩니다.
결제가 성공하거나 실패를 하면, 위 IMP.request_pay 함수의 두번째 인자로 지정한 함수가 호출이 되구요. 그 함수의 response 인자를 통해 결제상황을 파악하실 수 있습니다.
location.href = next_url; 부분을 주석처리하시고, response 인자를 console.log(response); 출력하시어 현재의 결제상황을 파악해보시겠어요? 포트원 설정 상의 뭔가 이슈가 있으실 수도 있으실 듯 합니다.
현재 구현은 결제 성공/실패 유무에 상관없이, 포트원 결제 과정이 끝나면 order_check 페이지를 통해 서버 단에서 payment 정보를 갱신한 후에, order_detail 페이지로 전환토록 구성되어있습니다.