55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
환불을 구현 하려면 어떤식으로 해야 되나여?
cashPoints 를 구매하는 기능을 구현 했는데 일단 유저 정보에 바로 업데이트 하도록 했는데요환불(캐쉬 포인트를 다시 현금으로) 구현 하려면 결제 액수, 결제 uid , 결제 날짜 등 저장을 payment 모델등에 저장하고 그 정보를 토대로 iamport 지원하는 모듈에서 제공하는 환불 요청 함수등을 이용해 환불 함수 실행 하도록 하면 될까여?또 액수 정보와 함께 cashPoints => 현금화 요청 날리면 현금으로 환불해주는 기능 구현 하려면 어떤식으로 해야 될까여?
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
next js 에서 결제 구현할때 에러 발생하는데 디버깅 팁 주실수 있나요?
에러가 발생한 코드```// pages/buyPoints.tsx import { useState } from 'react'; import { useRouter } from 'next/router'; import { Box, Button, Input, Heading, Flex } from '@chakra-ui/react'; import { v4 as uuidv4 } from 'uuid'; const BuyPointsPage: React.FC = () => { const router = useRouter(); const [points, setPoints] = useState<number>(0); const [merchantUid, setMerchantUid] = useState<string>(uuidv4()); // UUID 생성 및 상태 관리 const handleBuyPoints = () => { try { // 포인트를 구매하는 로직을 구현 const IMP = window.IMP; const code = process.env.PORTONE_SHOP_ID; IMP.init(code); const payment_props = { "merchant_uid": merchantUid + "tm2024", // UUID 사용 "name": "tm2024 point", "amount": points, // 입력한 포인트 값을 amount에 설정 } IMP.request_pay(payment_props, function (response: any) { // 결제 완료 후 처리할 로직 작성 location.href = "127.0.0.1:3000/"; }); } catch (error) { console.error(error); } }; return ( <Flex direction="column" alignItems="center"> <Box p={4}> <Heading size="md" mb={4}>포인트 구매 페이지</Heading> <Flex alignItems="center"> <Input type="number" value={points} onChange={(e) => setPoints(parseInt(e.target.value))} placeholder="구매할 포인트를 입력하세요" mr={2} /> <Button onClick={handleBuyPoints} colorScheme="blue"> 포인트 구매 </Button> </Flex> </Box> </Flex> ); }; export default BuyPointsPage;https://github.com/hyunsokstar/frontend-for-tm2024/blob/main/src/pages/buyPoints.tsx
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
사용자가 진행을 중단하였습니다.
자꾸 여쭤봐서 죄송합니다...여기 있는 질문과 답변들을 확인해봤을 때, PG사들마다 입력해줘야하는 값들이 다른 것은 인지하고 있습니다.PG사를 키움페이(다우)로 사용하려고하는데, 결제 테스트를 해보면 실제 결제는 되지만(돈이 빠져나감) console.log에 나온 값은 다음과 같이 보이면 결제는 Fail되었다고 보입니다.뭐가 문제일까요?....포트원측에도 여쭤보긴했지만, 답은 없고.., 구글링 아무리 해봐도 이런 사례가 잘 없어서 염치없지만 여기에 자꾸 여쭤봅니다 ㅜ[결과값]error_msg: "사용자가 진행을 중단하였습니다." imp_uid: "imp_431512464444" merchant_uid: "c638f37e-1063-472d-8455-4b353e1cd923" pay_method: "card" pg_provider: "daou" pg_type: "payment" success: false[코드]def order_pay(request, pk): .... payment_props = { "pg": "daou.CTS17362", "pay_method": 'card', "merchant_uid": payment.merchant_uid, "amount": payment.desired_valuation, "name": payment.name, "buyer_name": payment.buyer_name, "buyer_email": payment.buyer_email, "buyer_tel": str(request.user.phone_number), }키움페이 관련 설정값 안내 링크: https://developers.portone.io/docs/ko/pg/payment-gateway/daou/readme?v=v1
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
결제창 출력이 되지 않습니다.
<script src="">https://cdn.iamport.kr/v1/iamport.js"></script> <script>(function(){const IMP = window.IMP;const code = "iamport";IMP.init(code);const merchant_uid = "merchant_" + new Date().getTime();IMP.request_pay({merchant_uid: merchant_uid,name: "주문 테스트",amount: 100, }, function(response){// 결제 끝났을 때console.log(response); }); })();</script> KGINICIS Standard Pay Call FailedV901 : 잘못된 접근 방식입니다. 잠시 후 다시 시도해주세요.=> 영상과 동일하게 진행하였지만 잘못된 접근이라며 결제창이 뜨지 않습니다.영상 시점과 지금 시점의 api 링크나 접근 방법이 달라진 것일까요?
- 해결됨파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
결제 중간 이탈
order_detail까지 모두 잘 따라 만들었습니다.이전에 테스트했을 때는 분명 안그랬던거 같은데... 결제를 하다가 중간에 나오거나 되돌아가면, 이게 redirect되면서 order_detail의 페이지로 이동합니다. 제 생각에는 결제를 시도하기 위한 페이지로 다시 돌아가는게 맞다고 생각하는데...원래 이게 맞는건지, 아니면 제 코드가 잘못된건지 여쭤볼 수 있을까요?models.pyclass 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 } )
- 해결됨파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
포트원 결제 payment_detail 이전 과정 문제
원래 잘 안올리고 다른 질문부터 확인하긴하는데, 몇 사례가 없어 찾아보기 힘들어 이렇게 요청드려요. 밑에 글이랑 비슷한데, order_check를 했을 때, 404(포트원에서 결제내역을 찾을 수 없습니다) 에러가 보입니다. 밑의 질문 답변처럼 order_pay.html에서 console.log를 찍어 확인해보려 해도, 콘솔창에 보이지 않네요... 어떻게 해결해야할까요?코드도 공유드립니다.order_pay.html {% block extra-script %} {{ payment_props|json_script:"payment-props" }} <script src="https://cdn.iamport.kr/v1/iamport.js"></script> <script> (function() { const IMP = window.IMP; const next_url = "{{ next_url }}"; IMP.init("{{ portone_shop_id }}"); const json_string = document.querySelector("#payment-props").textContent; const props = JSON.parse(json_string); IMP.request_pay(props, function(response) { // location.href = next_url; console.log(response); console.log(props); }); })(); </script> {% endblock %}views.py @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("membership:order_detail", order.pk) # TODO: order_detail 구현 payment = OrderPayment.create_by_order(order) payment_props = { "pg": "uplus", "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": "성수이로 20길 16", "buyer_postcode": "04783", } 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]), } )
- 해결됨파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
포트원 다른 PG사 결제창 테스트 문제
안녕하세요. 잘 수강 했습니다. 좋은 강의 감사합니다.실 서비스 결제를 하는데 많은 도움이 되고 있습니다. 다름이 아니라 강의를 참고해 (구)토스페이먼츠는 잘 구현이 되었습니다.주문 결제 주문목록 등 다 구현이 되었는데요. 제가 실제 연동 PG사를 웰컴페이먼츠로 안내 받아. 테스트에 연동에서 토스페이먼츠나 웰컴페이먼츠를 대표 PG사로 사용 시 결제창이 뜨지 않거나, 위와 같은 오류가 발생해 문의 드립니다.문서를 봐도 다른 게 없는 것 같은데, 왜 안되는지 이유를 잘 모르겠습니다. 토스페이먼츠(구) : 결제 잘됨.토스페이먼츠 : 결제창이 뜨지 않고 바로 주문내역 (결제전) 상태로 이동월컴페이먼츠 : 결제창 뜨지 않고 위 이미지 처럼 바로 오더체크로 이동 후 오류 발생 (404, 'Not Found') Traceback (most recent call last): File "/Users/adver/program/advercoder_ai/mall/models.py", line 184, in update self.meta = self.api.find(merchant_uid=self.merchant_uid) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/adver/program/advercoder_ai/env/lib/python3.11/site-packages/iamport/client.py", line 91, in find return self.find_by_merchant_uid(merchant_uid) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/adver/program/advercoder_ai/env/lib/python3.11/site-packages/iamport/client.py", line 82, in find_by_merchant_uid return self._get(url) ^^^^^^^^^^^^^^ File "/Users/adver/program/advercoder_ai/env/lib/python3.11/site-packages/iamport/client.py", line 61, in _get return self.get_response(response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/adver/program/advercoder_ai/env/lib/python3.11/site-packages/iamport/client.py", line 33, in get_response raise Iamport.HttpError(response.status_code, response.reason) iamport.client.Iamport.HttpError: (404, 'Not Found') Not Found: /mall/orders/73/check/93/ 이런 상황이다 보니, 어떻게 이것을 풀어가야 할지 고민이 되서 여쭤봅니다. (구)토스페이먼츠와 다른 무언가를 해야 하는 설정이 있을까요?문서를 봐도 잘 모르겠어서 여쭤 봅니다.조언해 주시면 감사하겠습니다. 감사합니다!
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
수량
여기서 testproduct 아래에 수량 창이 하나더 뜨나요?코드에서 어디부분때문에 그런건가요?
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
test_mall .payment_detail
payment_detail이 안나옵니다.근데 여기서부터 살짝 이상합니다..이메일을 쓰고 다음 누르고 하면 결제까지는 잘되는데 결제하고 나서이 오류가 뜹니다.어디부분 부터 보면 좋을까요?일단 코드 오타 있는지 확인은 한번 해봤는데 아직 까지는 못 찾았습니다.
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
장고나 파이썬버전
장고 4.0.10이랑 python 3.10.4버전도 진도 따라가는데 괜찮나요?
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
Identifier 'IMP' has already been declare 에러 질문입니다
15번째 payment 관련 강의를 진행중입니다. 폼 입력 후에 진행을 하면Identifier 'IMP' has already been declare 라는 에러가 발생하는데 어떻게 해결해야 할런지요?재정의를 하면 안된다는 의미라는데... 방법을 잘 모르겠습니다.
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
썸네일 적용하면 쿼리수가 369로 늘어나요
{% extends "mall/base.html" %} {% load humanize %} {% load thumbnail %} {% block content %} <div class="row"> {% for product in product_list %} <div class="col-sm-6 col-lg-4"> <div class="card"> {% thumbnail product.photo "300x300" crop="center" as thumb %} <img src="{{ thumb.url }}" alt="{{ product.name }} 사진" class="card-img-top object-fit-cover"/> {% endthumbnail %} <div class="card-body"> {{ product.category.name }} <div> <h5 class="text-truncate">{{ product.name }}</h5> </div> <div class="d-flex justify-content-between"> <div>{{ product.price|intcomma }}원</div> <div> <a href="#" class="btn btn-primary">장바구니에 담기</a> </div> </div> </div> </div> </div> {% endfor %} </div> {% endblock %}
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
옵션 설계에 관해서
이 강의에 있는 소스코드를 조금 수정해서 제가 원하는 서비스를 구현하고 있어요이 강의에선 상품 모델만 있지만, 상품에 대한 옵션이 있는 서비스이거든요구체적으로 청소 서비스인데, 청소 옵션으로 "이불빨래, 30분 추가 청소, 등등..."처음에는 옵션이라는 ,별도의 테이블을 만드는 것을 생각했는데 재사용성에 있어서 그렇게 멋지다는 생각이 안들었어요. 템플릿에서 조회할 때 옵션 테이블을 따로 조회하는 것보다는product라는 것을 조회하면 그것에 딸린 옵션들을 조회하게끔 설계하고 싶었거든요 부모 class --> Product자식 클래스 ---> CleanProduct, OptionProduct이렇게 테이블을 구현하고 템플릿에서는 product = Product테이블 인스턴스이렇게 한 뒤, if ( product==CleanProduct) then 청소 상품임elif (product ==OptionsProduct) then 옵션 상품임 이렇게 하려고 했거든요. Abstract는 이럴 때 쓰는 건 아닌 것 같고 찾아보니 멀티테이블 상속으로 처리를 하더군요. 근데 그것은 오버로딩을 하려면 별도의 유틸을 설치하고 그런 곤란함이 있고... 위 관점이 객체지향적인 관점에선 바람직해보이지만 SQL 관점에선 없는 개념(?)이라 좀 거시기 했습니다. 그래서 아래처럼 구현을 했는데 이게 바람직한 방향인지 궁금합니다 //모델class Category(models.Model):name = models.CharField(max_length=100, unique=True)class Product(models.Model):class Type(models.TextChoices):SERVICE = "s", "용역"OPTION = "o", "상품옵션"PRODUCT = "p", "실물상품"category = models.ForeignKey(Category, on_delete=models.CASCADE, db_constraint=False, related_name="product_set")related_product = models.ForeignKey("Product", on_delete=models.CASCADE, db_constraint=False, null=True, blank=True)type = models.CharField(choices=Type.choices, max_length=20, default="s")name = models.CharField(max_length=100, db_index=True)description = models.TextField(blank=True)price1 = models.PositiveIntegerField() # 0 포함price2 = models.PositiveIntegerField() # 0 포함photo = models.ImageField(upload_to="store/product/photo/%Y/%m/%d", null=True, blank=True)created_at = models.DateTimeField(auto_now_add=True)updated_at = models.DateTimeField(auto_now=True)class CartProduct(models.Model):user = models.ForeignKey(User, on_delete=models.CASCADE, db_constraint=False, related_name="cart_product_set")product = models.ForeignKey(Product, on_delete=models.CASCADE, db_constraint=False)quantity = models.PositiveIntegerField(default=0) //뷰def cart(request, pk):product = get_object_or_404(Product, pk=pk)option_qs= Product.objects.filter(related_product=product)context={"product":product, "option_qs":option_qs}return render(request, 'store/cart.html', context)//템플릿{{ product }}<hr>{% for i in option_qs.all %}{{ i }}<br>{% endfor %} Product안에 타입이라는 필드를 넣었고, Product가 자기 자신을 외래키로 활용하게끔 했어요(related_product) 그래서 A라는 상품과 b,c,d라는 옵션이 있다면(1)A라는 상품을 얻어온다(2)A라는 상품을 외래키로 갖고 있는 Product를 얻어온다.하기 위해서요. 제가 너무 복잡하고 이상하게 구현하고 있는 건 아닌 지 궁금해요.(1) 이렇게 외래키로 스스로를 참조해도 되는 것인지(2) 멀티테이블 상속 방식으로 구현하는 게 나을 것인지?(3) 더 멋진 방법이 있는 지? (상품 옵션 테이블 설계 관점에서)너무 세세한 것 까지 여쭤봐서 죄송합니다. 근데 진석님 아니면 물어볼 곳이 없어요 ㅠ.ㅠ
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
pk필드에 대해서
안녕하세요, 대전에서 아주 잘 듣고 있는 수강생입니다 ㅎ 템플릿에서 db에 뭔가 요청을 할 때{% url '주소' id %} 이런식으로 요청하면 url에서'주소'/<int:pk>로 넘어가서 view에서 def 주소(request, pk): a = get_object_or_404(Product, pk=pk)이런식으로 조회를 하잖아요? 근데 우리가 모델에서 pk라는 필드를 정의한 적이 없는데 get object or 404 함수는 어떻게 pk인자를 받아서 id인자를 알아서 찾아오나요? 혹시나해서 모델에서 기본적으로 id 필드말고 pk 필드가 있는 지 봤는데 그런 것 같진 않더군요. primary key가 되는 필드를 알아서 매핑하는건가요? 아니면 제가 모르는 장고의 동작이 별도로 있나요?
- 해결됨파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
AbstractPortonePayment 모델 update 속성 질문
self.pay_status = self.meta["status"]order_detail 뷰 구현 파트에서 결제 완료 후 템플릿에서 {{payment.pay_status}}를 하려고 보니 meta가 비어있는 값이더라구요.혹시 이 meta가 어떻게 저장되는지 알 수 있을까요?payment = OrderPayment.create_by_order(order)에서 payment.meta를 print해 보아도 비어있는 값이라 어디서 잘못되었는지 찾고 있습니다..
- 해결됨파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
장바구니 담기 뷰 강의에서 질문이 있습니다.
장바구니 담기 뷰를 듣기 전까지 ProductListView에서 쿼리셋을 호출하는 변수는 아래와 같이 작성하고 있었습니다. -> 계속 이 쿼리를 참조하고 있다고 생각했습니다. product_qs = Product.objects.all().select_related( "category" )product_list.html에서는 해당 쿼리를 {% for product in product_list %}으로 불러오고 있는데 여기서 쿼리셋의 이름이 되는 product_list가 어떻게 저 이름을 가지게 되는건지 앞 강의에서 설명해 주신것 같은데 맞을까요? 다시 들으려고 했는데 강의가 많아 혹시 어떤 회차인지 알려주시면 감사하겠습니다 ..ㅠ.ㅠ(뷰에서는 따로 객체 이름을 지정해서 전달하지 않아서요) status=ACTIVE인 쿼리만 불러오기 위해 product_qs에 filter를 걸었더니 전체 목록이 나오더라구요. 그럼 제가 그동안 참고하고 있던(화면에 리스트가 보여지는)것은 ProductListView에서 어떤 쿼리셋을 참고하고 있던 것인가요? product_qs = Product.objects.filter(status=Product.Status.ACTIVE).select_related( "category" )product_qs 변수명을 queryset으로 변경하니 필터로 걸러진 목록이 잘 나왔습니다. 그렇다면 제가 변수명을 틀리게 작성하고 있었다는 것인데 어떻게 보여진 것일까요?(3번과 맥락이 비슷합니다!)
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
디지털 제품 다운로드
안녕 하세요?이미지 파일 또는 pdf 파일등과 같이 디지털 제품을 판매하려고 할때 결제후 각 구매 제품을 다운로드하게 처리 하려면 어떻게 하는것이 좋을까요?1. 모델에 file 추가2.order_detail 뷰에 추가 별도 처리 하면 되는지요?좋은 의견이나 참조 문서가 있으시면 알려주시면 대단히 감사 하겠습니다
- 미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
404 에러
payment_pay tempate에서 code를 view 단에서 portone_shop_id 즉, 제 가맹점 식별코드를 사용해서 IMP.init을 하는데, 안열립니다.처음에는 전부 구현 후, 404에러가 떠서 강사님이 자신의 가맹점 식별코드를 사용하지 않고, iamport걸 사용해서 찾을 수 없다가 뜬다고 말씀하셨는데, 저는 바꾸고 나서도 계속 변함없이 뜹니다. 오류를 계속 추적해봤는데, model 단에서도 Iamport api가 연결이 안되고, template 에서도 바꾼 가맹점 식별코드를 사용해도 api를 불러오지 못합니다. 그 전까지는 iamport 가맹점 식별코드를 사용해서 pg 사의 모듈이 잘 떴습니다. 혹시나 해서 코드를 재발급 받고 다시 적용을 했는데도 똑같이 404 에러가 나옵니다.