2017-10-07 6 views
0

내 웹 사이트에 온라인 결제 포털을 설정 중입니다. 나는 코드 아래 사용404 suds 요청에서 오류를 찾을 수 없습니다. - python - django

ZARINPAL_WEBSERVICE ='https://www.zarinpal.com/pg/services/WebGate/wsdl' # Required 
MERCHANT_ID = 'blah-blah-blah' # Required 
amount = 0 

@method_decorator(login_required, name='dispatch') 
class Upgrade(View): 
    def get(self, request): 
     current_plan = UserPlan.objects.filter(user=request.user).first() 
     all_plans = Plans.objects.all() 
     old_plans = None 
     if current_plan: 
      new_plans = all_plans.filter(no__gt=current_plan.no) 
      old_plans = all_plans.filter(no__lte=current_plan.no) 
     else: 
      new_plans = all_plans 

     return render(request, 'business/upgrade.html', {'current_plan': current_plan, 
                'new_plans': new_plans, 
                'old_plans': old_plans}) 

    def post(self, request): 
     current_plan = UserPlan.objects.filter(user=request.user).first() 
     form = UpgradeForm(request.POST) 
     if form.is_valid(): 
      new_plan = form.cleaned_data.get('requested_plan') 
      requested_plan = Plans.objects.filter(no=new_plan).first() 
      global amount 
      if current_plan: 
       amount = requested_plan.price - current_plan.price 
      else: 
       amount = requested_plan.price 

      # redirect to ZarinPal page and send data to it 
      description = u'TEST DESCRIPTION' # Required 
      email = form.cleaned_data.get('email') # Optional 
      mobile = form.cleaned_data.get('phone') # Optional 
      CallbackURL = 'http://127.0.0.1:8000/business/verify/' 
      client = Client(ZARINPAL_WEBSERVICE) 
      result = client.service.PaymentRequest(MERCHANT_ID, amount, description, email, mobile, CallbackURL) 
      if result.Status == 100: 
       return redirect('https://www.zarinpal.com/pg/StartPay/' + result.Authority) 
      else: 
       return HttpResponse('Error') 
     else: 
      messages.error(request, form.errors) 
      print(form.errors) 
      return redirect('upgrade_plan') 


@login_required 
def verify(request): 
    client = Client(ZARINPAL_WEBSERVICE) 
    if request.GET.get('Status') == 'OK': 
     result = client.service.PaymentVerification(MMERCHANT_ID, 
               request.GET['Authority'], 
               amount) 
     if result.Status == 100: 
      # in this step, it must create or update UserPlan row in DB. 
     # also, it should be create a row in Sells table and save transaction defatils. 

      return HttpResponse('Transaction was successfull. RefID: ' + str(result.RefID)) 
     elif result.Status == 101: 
      return HttpResponse('Transaction submitted : ' + str(result.Status)) 
     else: 
      return HttpResponse('Transaction failed. Status: ' + str(result.Status)) 
    else: 
     return HttpResponse('Transaction failed or canceled by user') 

를하지만 나에게 지불 게이트를 표시하기 전에, 그것은 오류 발생 :

Exception at /business/upgrade/
(404, 'Not Found')
Request Method: POST
Request URL: http://localhost:8000/business/upgrade/ Django Version: 1.11.4 Exception Type: Exception Exception Value:
(404, 'Not Found')

및 오류 코드의 라인입니다 :

result = client.service.PaymentRequest(MERCHANT_ID, amount, description, email, mobile, CallbackURL) 

뭐가 문제 야? 어떻게 해결할 수 있을까요? 감사

* UPDATE *
아래의 조각 내 urls.py 파일입니다

from django.conf.urls import url 
from . import views 
urlpatterns = [ 
    # for explicit urls 
    url(r'^upgrade/$', views.Upgrade.as_view(), name='upgrade_plan'), 
    url(r'^verify/$', views.verify, name='verify'), 
] 
+0

실제보기 및 URL을 표시하십시오. –

+0

@DanielRoseman 의견을 주셔서 감사합니다. 나는 문제의 코드를 업데이트하고 전체 views.py 파일을 추가했습니다. – msln

답변

0

어떤 이해가되지 않습니다 여기에 꽤 몇 가지가 있습니다.

첫 번째로 127.0.0.1 주소로 사이트에 콜백을하도록 지불 업체에 알릴 수 없습니다. 그건 당신의 로컬 호스트 일뿐입니다. 하지만 분명히 게이트웨이는 인터넷상의 다른 곳에 있습니다. 전화 할 수있는 사이트의 실제 주소가 있어야합니다.

둘째, 질문과 관련이 없지만 여전히 심각한 문제이므로이 경우 전역 변수를 절대 사용하지 않아야합니다. 그것들은 귀하의 사이트의 모든 사용자들에 의해 공유 될 것이므로, 그 금액은 모두 섞일 것입니다. 나는이 지불 공급자에 대해 아무것도 모르지만 콜백의 매개 변수에 금액을 제공한다는 것을 확신합니다.

+0

localhost로 작업 한 모습을 보여준 게이트 제공 업체 웹 사이트에 몇 가지 예제 코드가 있지만 아무 문제가 없지만 확실하지 않습니다. 코드를 내 서버에 업로드하면 문제가 해결 될 수 있습니다. – msln

+0

문제는 suds 라이브러리에 대한 것이 었습니다. "zeep"라이브러리를 사용하고 문제가 해결되었습니다. 하지만 질문이 있는데 코드에'global amount '를 사용해서는 안된다고 했으므로 어떻게 두 번째 함수에서 사용할 수 있습니까? 그것은'verify' 함수에서 사용될 것입니다. 그래서 그것을 두 번째 함수 ('verify')로 보내는 방법은 무엇입니까? – msln

+0

내가 말했듯이, 그 금액은 콜백 함수의 매개 변수에서 제공된다는 것이 절대적으로 확실합니다. –