Как получить заказ от PayPal на Python

#python #paypal #kivy #paypal-rest-sdk

#python #paypal #kivy #paypal-rest-sdk

Вопрос:

Я пытался понять, как именно работает процесс захвата SDK PayPal. В настоящее время я работаю над мобильным приложением Python Kivy с возможностью оформления заказа через PayPal. Я пытался заставить этот пример работать: https://github.com/paypal/Checkout-Python-SDK#capturing-an-order но получите эту ошибку при выполнении:

 422
{'Cache-Control': 'max-age=0, no-cache, no-store, must-revalidate', 'Content-Length': '584', 'Content-Type': 'application/json', 'Date': 'Thu, 04 Mar 2021 18:32:56 GMT', 'Paypal-Debug-Id': 'd092a377ca029'}
{"name":"UNPROCESSABLE_ENTITY","details":[{"issue":"ORDER_NOT_APPROVED","description":"Payer has not yet approved the Order for payment. Please redirect the payer to the 'rel':'approve' url returned as part of the HATEOAS links within the Create Order call or provide a valid payment_source in the request."}],"message":"The requested action could not be performed, semantically incorrect, or failed business validation.","debug_id":"d092a377ca029","links":[{"href":"https://developer.paypal.com/docs/api/orders/v2/#error-ORDER_NOT_APPROVED","rel":"information_link","method":"GET"}]}
 

Насколько я понимаю, это происходит потому, что я одновременно пытаюсь создать и захватить заказ. Как я могу сделать так, чтобы захват начинался только после одобрения клиента, поэтому я, скорее всего, не увижу это сообщение об ошибке? Любая помощь приветствуется!

.py

 def PayPal(self):
    client_id = "ID"
    client_secret = "SECRET"

    environment = SandboxEnvironment(client_id=client_id, client_secret=client_secret)
    client = PayPalHttpClient(environment)

    request = OrdersCreateRequest()
    request.prefer("return=representation")

    request.request_body({
        "application_context": {
            "return_url": ""},

        "intent": "CAPTURE",

        "purchase_units": [{
            "amount": {
                "currency_code": "CAD",
                "value": str(App.get_running_app().cart)
            }}]})

    try:
        response = client.execute(request)
        print("Order With Complete Payload:")
        print("Status Code:", response.status_code)
        print("Status:", response.result.status)
        print("Order ID:", response.result.id)
        print("Intent:", response.result.intent)
        print("Links:")
        for link in response.result.links:
            print('t{}: {}tCall Type: {}'.format(link.rel, link.href, link.method))
            print("Total Amount: {} {}".format(response.result.purchase_units[0].amount.currency_code,
                                               response.result.purchase_units[0].amount.value))
            order = response.result
            print(order)
    except IOError as ioe:
        print(ioe)
        if isinstance(ioe, HttpError):
            print(ioe.status_code)
    webbrowser.open("https://www.sandbox.paypal.com/checkoutnow?token="   response.result.id)

    # Capture order
    request = OrdersCaptureRequest(order_id= response.result.id)

    try:
        response = client.execute(request)
        order = response.result.id

    except IOError as ioe:
        if isinstance(ioe, HttpError):
            print(ioe.status_code)
            print(ioe.headers)
            print(ioe)
        else:
            print(ioe)
 

Ответ №1:

Захват должен выполняться только после того, как клиент пройдет процедуру утверждения (в PayPal) и вернется в ваше приложение. Если вы укажете a return_url при создании заказа, для него можно установить глубокую обратную ссылку на ваше приложение, что должно быть намерением, которое затем вызывает функцию, которая только после этого выполняет захват.

Комментарии:

1. Спасибо за разъяснение! Я рассмотрю это.

2. Также стоит упомянуть, что действие по умолчанию при перенаправлении на PayPal — «продолжить», что означает, что последняя кнопка в PayPal скажет продолжить, и ожидается, что по возвращении вы увидите страницу просмотра заказа. Если вы хотите пропустить показ шага проверки и выполнить захват и сразу показать результат захвата, вам следует установить для user_action значение ‘PAY_NOW’