Я пытаюсь интегрировать платежный шлюз Paytm на свой веб-сайт django, но возникают проблемы - PullRequest
0 голосов
/ 04 августа 2020

На этапах интеграции на веб-сайте paytm первым шагом является Инициирование API транзакции , для которого они предоставили этот код: https://developer.paytm.com/docs/initiate-transaction-api/?ref=payments

Я копирую, вставил это в моем views.py в представлении processOrder:

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'],
    )
    paytmParams = dict()

    paytmParams["body"] = {
      "requestType"   : "Payment",
      "mid"           : "YOUR_MID_HERE",
      "websiteName"   : "WEBSTAGING",
      "orderId"       : "ORDERID_98765",
      "callbackUrl"   : "https://localhost/handlerequest",
      "txnAmount"     : {
      "value"     : "1.00",
      "currency"  : "INR",
    },
      "userInfo"      : {
        "custId"    : "CUST_001",
    },
}
    checksum = PaytmChecksum.generateSignature(json.dumps(paytmParams["body"]), "YOUR_MERCHANT_KEY")

    paytmParams["head"] = {
     "signature"    : checksum
    }

    post_data = json.dumps(paytmParams)

# for Staging
    url = "https://securegw-stage.paytm.in/theia/api/v1/initiateTransaction?mid=YOUR_MID_HERE&orderId=ORDERID_98765"

    mid=YOUR_MID_HERE&orderId=ORDERID_98765"
    response = requests.post(url, data = post_data, headers = {"Content-type": "application/json"}).json()
print(response)

     return render(request,"paytm.html",{'paytmParams':paytmParams})
return JsonResponse('Payment Complete',safe=False)

, а это мой js для html html: <button class="btnabc btnabc-secondary btnabc-lg d-none" id='payment-info'>Proceed</button>

<script type="text/javascript">

    var total = '{{order.get_cart_total}}'

    var form = document.getElementById('form')

    form.addEventListener('submit', function (e) {
      e.preventDefault()
      console.log('form submitted..')
      document.getElementById('form-button').classList.add("d-none");
      document.getElementById('payment-info').classList.remove("d-none");
    })

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

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

      var shippingInfo = {
        'address': null,
        'city': null,
        'state': null,
        'zipcode': null,
      }

      shippingInfo.address = form.address.value
      shippingInfo.city = form.city.value
      shippingInfo.state = form.state.value
      shippingInfo.zipcode = form.zipcode.value
      userFormData.name=form.name.value
      userFormData.email=form.email.value
      userFormData.mobile=form.mobile.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' %}"
        })

    }
</script>

и это мой paytm. html

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

И вот те ошибки, которые я получаю, когда нажимаю кнопку оплаты:

POST http://127.0.0.1:8000/process_order/ 500 (Internal Server Error)
Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0
Promise.then (async)

Раньше, если бы я не загружал любой код интеграции с Paytm, затем при нажатии я получил успешное уведомление о завершении транзакции (как в моем коде), но теперь это не работает. Я не могу понять, в чем проблема. Любая помощь будет принята. Спасибо.

1 Ответ

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

Похоже, что один из ваших json поврежден. Основываясь на ошибке, я думаю, что это html вместо JSON.

Вы можете вручную регистрировать запрос и ответ каждого сетевого вызова api, чтобы убедиться, что он действителен json. Вы также можете использовать такой инструмент, как Hoss . У них есть агенты для javascript и python, которые автоматически отслеживают все вызовы API и отображают их, чтобы вы могли проверить любую проблему

...