Shulz
Shulz

Reputation: 625

How to fix Paypal Checkout Order Creation Error

I am using Laravel 8 framework for PHP and I am trying to integrate paypal into my the local web. However I am stuck on `create_order_error` even though I have strictly followed some sample snippets provided by paypal I still encounter this pro

References:

Error: SyntaxError: Unexpected token < in JSON at positio…1kLoyti46gxJY-Rl1PH23n49yWhf&currency=PHP:2:79380"
Code:

<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>

Note: I have removed the onApprove function since I'm stuck on createOrder

Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use PayPalCheckoutSdk\Core\PayPalHttpClient;
use PayPalCheckoutSdk\Core\SandboxEnvironment;
use PayPalCheckoutSdk\Orders\OrdersCreateRequest;
use PayPalCheckoutSdk\Orders\OrdersCaptureRequest;
use PayPalHttp\HttpException;

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());
        }
    }
}

Upvotes: 1

Views: 1694

Answers (2)

Sante
Sante

Reputation: 349

try

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

and in the fetch request add header

Accept: 'application/json'

Upvotes: 0

Preston PHX
Preston PHX

Reputation: 30359

SyntaxError: Unexpected token < in JSON at positio…

You are returning things other than JSON when the browser calls /billing/createOrder. You must only return JSON.

Use the Network tab in your browser's Developer Tools, or load the path in a new tab, to inspect the Response Body of what you are actually returning.

It will clearly be something other than JSON. Based on that error message it will start with some HTML (the < character)

Only return JSON. You need to be able to copy the entire Response Body into a JSON validator and have it be OK.

Upvotes: 1

Related Questions