Как исправить ошибку создания заказа на оформление заказа в Paypal

#laravel #paypal

#laravel #paypal

Вопрос:

Я использую фреймворк Laravel 8 для PHP и пытаюсь интегрировать paypal в свой локальный веб. Однако я застрял на «create_order_error», хотя я строго следовал некоторым фрагментам примеров, предоставленным paypal, я все еще сталкиваюсь с этим профессионалом

Ссылки:

  • https://developer.paypal.com/demo/checkout/#/pattern/server
  • https://github.com/paypal/Checkout-PHP-SDK#code
  • https://developer.paypal.com/docs/checkout/reference/server-integration/

Ошибка: SyntaxError: Unexpected token < in JSON at positio…1kLoyti46gxJY-Rl1PH23n49yWhfamp;currency=PHP:2:79380"
Код:

 <script>
    // Render the PayPal button into #paypal-button-container
    paypal.Buttons({
        style: {
            shape:  'pill',
            layout: 'horizontal',
            color:  'blue',
            height: 35
        },
        // Call your server to set up the transaction
        createOrder: function(data, actions) {
            return fetch('/billing/createOrder', {
                method: 'post',
                headers: {
                    'content-type': 'application/json'
                }
            }).then(function(res) {
                return res.json();
            }).then(function(orderData) {
                return orderData.id;
            });
        },

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

Примечание: я удалил функцию onApprove, так как я застрял в CreateOrder

Контроллер

 <?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

use PayPalCheckoutSdkCorePayPalHttpClient;
use PayPalCheckoutSdkCoreSandboxEnvironment;
use PayPalCheckoutSdkOrdersOrdersCreateRequest;
use PayPalCheckoutSdkOrdersOrdersCaptureRequest;
use PayPalHttpHttpException;

class PaypalCheckoutController extends Controller
{

    private $environment;
    private $client;

    public function __construct()
    {
        $this->environment = new SandboxEnvironment(config('paypal.client_id'), config('paypal.secret'));
        $this->client = new PayPalHttpClient($this->environment);
    }

    public function index(Request $request)
    {
        return view('payment.checkout');
    }

    public function createOrder(Request $request) 
    {
        
        $order = new OrdersCreateRequest();
        $order->prefer('return=representation');

        $order->body = array(
            'intent' => 'CAPTURE',
            'application_context' =>
                array(
                    'return_url' => 'http://dummyweb.test/billing/checkout',
                    'cancel_url' => 'http://dummyweb.test/billing/checkout'
                ),
            'purchase_units' =>
                array(
                    0 =>
                        array(
                            'amount' =>
                                array(
                                    'currency_code' => 'PHP',
                                    'value' => '420.00'
                                )
                        )
                )
        );
        try {
            $result = $this->client->execute($order);
            return $result;
        }
        catch(HttpException $ex) {
            print_r($ex->getMessage());
        }
    }
}

 

Ответ №1:

Ошибка синтаксиса: неожиданный токен < в JSON в positio…

Вы возвращаете вещи, отличные от JSON, когда браузер вызывает / billing / CreateOrder . Вы должны возвращать только JSON.

Используйте вкладку Сеть в инструментах разработчика вашего браузера или загрузите путь в новой вкладке, чтобы просмотреть тело ответа того, что вы фактически возвращаете.

Это явно будет что-то другое, чем JSON. На основе этого сообщения об ошибке оно будет начинаться с некоторого HTML ( < символа)

Возвращайте только JSON. Вы должны иметь возможность скопировать все тело ответа в средство проверки JSON, и все будет в порядке.

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

1. Это означает, что я должен обернуть свой возврат в json на стороне сервера, верно?

2. К сожалению, когда я смотрю на «Сетевую вкладку», я не получаю ответа. Открывшееся новое окно для paypal немедленно закроется.

3. Проблема не в окне PayPal. Добавьте точку останова в свой код, где вы пытаетесь проанализировать свой не-JSON как JSON.

Ответ №2:

попробуйте

 return response()->json($result);
 

и в запросе на выборку добавьте заголовок

 Accept: 'application/json'