2017-10-07 128 views
0

我正在为我的网站设置在线支付门户。 我用下面的代码:404没有发现泡沫请求发送错误-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

请显示您的实际视图和网址。 –

+0

@DanielRoseman感谢您的评论。我更新了有问题的代码并添加了整个views.py文件。 – msln

回答

0

这里有相当多的东西,不作任何意义。

首先,您不能告诉您的付款提供商使用127.0.0.1地址回拨您的网站。这只是你的本地主机;但显然网关是互联网上的其他地方。它需要有一个可以调用的网站的实际地址。其次,与你的问题无关,但仍然是一个非常严重的问题,你绝对不能使用这样的全局变量。这些将由您网站的所有用户共享,所以金额会混杂起来。我对这个支付提供商一无所知,但我绝对确定它会提供回调参数中的金额。

+0

门户提供商网站中有一些示例代码显示与localhost一起工作没有问题,但我不确定,也许如果我将该代码上传到我的服务器,问题就解决了。 – msln

+0

问题在于泡沫库。我使用了“zeep”库,解决了问题。但我有一个问题,你说我不应该在我的代码中使用'global amount',那么如何在第二个函数中使用它?它将用于'verify'功能。所以如何将它发送到第二个函数('verify')? – msln

+0

正如我所说的,绝对可以肯定的是,数量是在回调函数的参数中提供的。 –