Я работаю на веб-сайте django и не могу вызвать функцию в нужном месте - PullRequest
0 голосов
/ 05 августа 2020

У меня есть форма оформления заказа на моем django сайте: <form class="row contact_form" action="." method="post" id="form">. В конце этой формы есть кнопка отправки: <input id="form-button" class="btnabc btnabc-outline-info btnabc-lg" type="submit" value="Continue to Payment"> При нажатии этой кнопки я хочу перенаправить пользователя на платежный шлюз, и если его транзакция прошла успешно, я хочу сохранить его информацию, которую он ввел в форму:

Это код javascript для кнопки:

document.getElementById('payment-info').addEventListener('click', function (e) {
      submitFormData()
    })

    function submitFormData() {
      console.log('Payment Button Clicked')
      var userFormData = {
        'name': null,
      }

      var shippingInfo = {
        'address': null,
      }

      shippingInfo.address = form.address.value
      userFormData.name=form.name.value

      var url = "/process_order/"
      fetch(url, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-CSRFToken': csrftoken,
        },
        body:JSON.stringify({'form': userFormData, 'shipping': shippingInfo }),
      })
        .then((response) => response.json())
        .then((data) => {
          console.log('Success:', data);
          alert('Transaction Completed')
          window.location.href = "{% url 'index' %}"
        })    
    }

Это мой views.py:

def processOrder(request):
    transaction_id = datetime.datetime.now().timestamp()
    data = json.loads(request.body)
    
    if request.user.is_authenticated:
        customer=request.user.customer
        order, created=Order.objects.get_or_create(customer=customer, complete=False)
        total=float(data['form']['total'])
        order.transaction_id=transaction_id

        if total == order.get_cart_total:
            order.complete = True
        order.save()
    

        ShippingAddress.objects.create(
            customer=customer,
            order=order,
            address=data['shipping']['address'],
            city=data['shipping']['city'],
            state=data['shipping']['state'],
            zipcode=data['shipping']['zipcode'],
            name=data['form']['name'],
            email=data['form']['email'],
            mobile=data['form']['mobile'],
        )

        param_dict = {

                'MID': 'DIY12386817555501617',
                'ORDER_ID': str(order.id),
                'TXN_AMOUNT': '4',
                'CUST_ID': 'j',
                'INDUSTRY_TYPE_ID': 'Retail',
                'WEBSITE': 'WEBSTAGING',
                'CHANNEL_ID': 'WEB',
                'CALLBACK_URL':'http://127.0.0.1:8000/handlerequest/',

        }
        param_dict['CHECKSUMHASH'] = Checksum.generate_checksum(param_dict, MERCHANT_KEY)
        return render(request, 'paytm.html', {'param_dict': param_dict})

    return HttpResponse('Done')


@csrf_exempt
def handlerequest(request):
    # paytm will send you post request here
    form = request.POST
    response_dict = {}
    for i in form.keys():
        response_dict[i] = form[i]
        if i == 'CHECKSUMHASH':
            checksum = form[i]

    verify = Checksum.verify_checksum(response_dict, MERCHANT_KEY, checksum)
    if verify:
        if response_dict['RESPCODE'] == '01':
            print('order successful')
        else:
            print('order was not successful because' + response_dict['RESPMSG'])
    
    return render(request, 'paymentstatus.html', {'response': response_dict})

Эта функция handlerequest в основном предназначена для проверки, подтверждена ли транзакция или нет.

Это мой paytm. html

<form action="https://securegw-stage.paytm.in/theia/processTransaction" method="post" name="paytm">
        {% for key,value in param_dict.items %}
    <input type="hidden" name="{{key}}" value="{{value}}">
    {% endfor %}
    </form>
</body>
<script>
    document.paytm.submit()
</script>

В настоящее время, когда я нажимаю кнопку оплаты, он просто сохраняет информацию формы (submitformdata () в javascript) без проверки транзакции, а также я не попадаю на страницу оплаты, где пользователь может заплатить.

Ошибка связана с местом, где я вызываю функцию submitformdata, и я не могу понять способ вызвать эту функцию только тогда, когда транзакция подтверждена. Пожалуйста, помогите мне найти способ сделать это. Любая помощь будет принята.

1 Ответ

0 голосов
/ 05 августа 2020

на самом деле причина в том, что когда вы пытаетесь реализовать это, вы не поместили это на сервер прямо сейчас, поэтому paytm не может получить доступ к URL-адресу обратного вызова для проверки транзакции, так же как я не могу получить доступ к 127.0.0.1:8000 из мой ноутбук прямо сейчас, поэтому вам нужно развернуть это приложение, поэтому есть одна вещь, которую вы можете сделать, это использовать 'pagekite. net', и вы запустите временное приложение на этом URL-адресе и сделаете URL-адрес обратного вызова в соответствии с этим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...