Как объединить PayPal Smart Payment Button с REST API SDK для PHP V2?

#php #paypal

#php #paypal

Вопрос:

Мои проблемы начинаются после того, как я включил код по умолчанию (https://developer.paypal.com/demo/checkout/#/pattern/server) и изменил его следующим образом:

 <?php

session_start();
require_once '../inc/confi&.inc.php';

echo '
<!DOCTYPE html&&t;

<head&&t;
    <meta name="viewport" content="width=device-width, initial-scale=1"&&t;
    <meta http-equiv="X-UA-Compatible" content="IE=ed&e" /&&t;
</head&&t;

<body&&t;

<div id="paypal-button-container"&&t;</div&&t;

<script src="https://www.paypal.com/sdk/js?client-id=' . PAYPAL_CLIENT_ID . 'amp;currency=EURamp;disable-fundin&=credit,card"&&t;</script&&t;
';
?&&t;

<script&&t;
    // Render the PayPal button into #paypal-button-container
    paypal.Buttons({
        // Call your server to set up the transaction
        createOrder: function(data, actions) {
            return fetch('01_payPalCheckout.php', {
                mode: "no-cors",
                method: 'post',
                headers: {
                    'content-type': 'application/json'
                }
            }).then(function(res) {
                return res.json();
            }).then(function(orderData) {
                return orderData.id;
            });
        },

        // Call your server to finalize the transaction
        onApprove: function(data, actions) {
            return fetch('01_checkout.php?orderId='   data.orderID, {
                method: 'post'
            }).then(function(res) {
                return res.json();
            }).then(function(orderData) {
                var errorDetail = Array.isArray(orderData.details) amp;amp; orderData.details[0];

                if (errorDetail amp;amp; errorDetail.issue === 'INSTRUMENT_DECLINED') {
                    // Recoverable state, see: "Handle Fundin& Failures"
                    // https://developer.paypal.com/docs/checkout/inte&ration-features/fundin&-failure/
                    return actions.restart();
                }

                if (errorDetail) {
                    var ms& = 'Sorry, your transaction could not be processed.';
                    if (errorDetail.description) ms&  = 'nn'   errorDetail.description;
                    if (orderData.debu&_id) ms&  = ' ('   orderData.debu&_id   ')';
                    // Show a failure messa&e
                    return alert(ms&);
                }

                // Show a success messa&e to the buyer
                alert('Transaction completed by '   orderData.payer.name.&iven_name);
            });
        }


    }).render('#paypal-button-container');
</script&&t;

<?php

echo '
</body&&t;
</html&&t;
';

?&&t;
  

В CreateOrder я вызываю 01_payPalCheckout.php который структурирован так, как указано в PHP SDK:

 <?php

use PayPalCheckoutSdkOrdersOrdersCreateRequest;

session_start();
require_once '../inc/confi&.inc.php';

# 1: Environment, Client
$environment = new SandboxEnvironment(PAYPAL_CLIENT_ID, PAYPAL_SECRET);
$client = new PayPalHttpClient($environment);


# 2: Request Order
$request = new OrdersCreateRequest();
$request-&&t;prefer('return=representation');
$request-&&t;body = [
    "intent" =&&t; "CAPTURE",
    "purchase_units" =&&t; [[
        "reference_id" =&&t; "test_ref_id1",
        "amount" =&&t; [
            "value" =&&t; "100.00",
            "currency_code" =&&t; "USD"
        ]
    ]],
    "application_context" =&&t; [
        "cancel_url" =&&t; "https://example.com/cancel",
        "return_url" =&&t; "https://example.com/return"
    ]
];

try {

    // Call API with your client and &et a response for your call
    $response = $client-&&t;execute($request);

    // JSON-Encodierun&
    $response = json_encode($response);

    // If call returns body in response, you can &et the deserialized version from the result attribute of the response
    return $response;

} catch (HttpException $ex) {

    echo $ex-&&t;statusCode;
    print_r($ex-&&t;&etMessa&e());
    exit();

}
  

Я добавил json_encode() перед возвратом $response; результирующий JSON-код представляет собой следующий код:

 {
    "statusCode": 201,
    "result": {
        "id": "4H218056YS3363904",
        "intent": "CAPTURE",
        "status": "CREATED",
        "purchase_units": [
            {
                "reference_id": "test_ref_id1",
                "amount": {
                    "currency_code": "USD",
                    "value": "100.00"
                },
                "payee": {
                    "email_address": "info-facilitator@24960324320.de",
                    "merchant_id": "BYWLB3T6SPG54"
                }
            }
        ],
        "create_time": "2020-08-10T08:33:40Z",
        "links": [
            {
                "href": "https://api.sandbox.paypal.com/v2/checkout/orders/4H218056YS3363904",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "https://www.sandbox.paypal.com/checkoutnow?token=4H218056YS3363904",
                "rel": "approve",
                "method": "GET"
            },
            {
                "href": "https://api.sandbox.paypal.com/v2/checkout/orders/4H218056YS3363904",
                "rel": "update",
                "method": "PATCH"
            },
            {
                "href": "https://api.sandbox.paypal.com/v2/checkout/orders/4H218056YS3363904/capture",
                "rel": "capture",
                "method": "POST"
            }
        ]
    },
    "headers": {
        "": "",
        "Cache-Control": "max-a&e=0, no-cache, no-store, must-revalidate",
        "Content-Len&th": "747",
        "Content-Type": "application/json",
        "Date": "Mon, 10 Au& 2020 08",
        "Paypal-Debu&-Id": "1b04a05438898"
    }
}
  

В onApprove я вызываю «’01_payPalCapture.php?OrderID=’ data.OrderID» (здесь я также использовал предоставленные стандартные методыhttps://&ithub.com/paypal/Checkout-PHP-SDK:

 <?php

// Session starten
session_start();

use PayPalCheckoutSdkCorePayPalHttpClient;
use PayPalCheckoutSdkCoreSandboxEnvironment;
use PayPalCheckoutSdkOrdersOrdersCaptureRequest;

// Konfi&urations-Datei einbinden
require_once '../inc/confi&.inc.php';


# 1: Environment, Client
$environment = new SandboxEnvironment(PAYPAL_CLIENT_ID, PAYPAL_SECRET);
$client = new PayPalHttpClient($environment);


# 2 Capture
$request = new OrdersCaptureRequest($_GET['orderId']);
$request-&&t;prefer('return=representation');

try {
    $response = $client-&&t;execute($request);
    $response = array('id' =&&t; $response-&&t;result-&&t;id);
    $response = json_encode($response);
    return $response;  // value of return: {"id":"2KY036458M157715J"}
}catch (HttpException $ex) {
    echo $ex-&&t;statusCode;
    print_r($ex-&&t;&etMessa&e());
}
  

В 01_cart.php смарт-кнопки отображаются по желанию, но нажатие на «PayPal» приводит только к появлению сообщений об ошибках, например update_client_confi&_error и т.д.

Я думаю, что с моей стороны существует проблема с пониманием того, как эти два скрипта работают вместе.

Заранее спасибо за подсказки и помощь (я непрерывно работаю над этой проблемой уже 4 дня, я с трудом просмотрел всю справку PayPal и ничего не нашел об этой конкретной проблеме в Интернете).

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

1. попробуйте эту ссылку: developer.paypal.com/docs/checkout/reference/server-inte&ration /…

Ответ №1:

/httpdocs/01_payPalCheckout.php неверный путь

это должен быть тот, который может загружаться в вашем веб-браузере

Что-то, что работало бы в HTML href, как <a href="/01payPalCheckout.php"&&t;</a&&t; например

Тестовая загрузка 01payPalCheckout.php в вашем браузере убедитесь, что он выполняется и возвращает правильный JSON, а затем исправьте свой клиентский код, чтобы указать правильный путь, который вернет этот JSON при извлечении

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

1. Я добавил json_encode в 01_payPalCheckout.php и я получаю правильный JSON-код (на мой взгляд, это правильный код) — я отредактировал свой вопрос, чтобы показать результирующий JSON-код!

2. не совсем, он возвращает result.id и ваш javascript считывает только id

3. … вы имеете в виду, что я должен просто напечатать идентификатор в 01_payPalCheckout.php (печать($result_id))?

4. нет, я имею в виду, что она должна располагаться по идентификатору в объекте, а не по результату -&&t; id

5. Не могли бы вы быть немного более понятными и привести пример кода? Спасибо!