인프런 커뮤니티 질문&답변

구재홍님의 프로필 이미지
구재홍

작성한 질문수

파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편

order_detail 뷰 구현

결제 중간 이탈

해결된 질문

작성

·

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,
        )

views.py

# 주문 생성
@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를 통해서 처리됩니다.

image

결제가 성공하거나 실패를 하면, 위 IMP.request_pay 함수의 두번째 인자로 지정한 함수가 호출이 되구요. 그 함수의 response 인자를 통해 결제상황을 파악하실 수 있습니다.

location.href = next_url; 부분을 주석처리하시고, response 인자를 console.log(response); 출력하시어 현재의 결제상황을 파악해보시겠어요? 포트원 설정 상의 뭔가 이슈가 있으실 수도 있으실 듯 합니다.

 

현재 구현은 결제 성공/실패 유무에 상관없이, 포트원 결제 과정이 끝나면 order_check 페이지를 통해 서버 단에서 payment 정보를 갱신한 후에, order_detail 페이지로 전환토록 구성되어있습니다.

 

구재홍님의 프로필 이미지
구재홍

작성한 질문수

질문하기