¿Cómo puedo integrar PayPal Smart Button en Laravel 8?

Estoy tratando de integrar los botones inteligentes de PayPal en mi sitio web Laravel 8. Esta es la documentación que estoy utilizando: https://developer.paypal.com/docs/checkout/integrate/

https://developer.paypal.com/docs/checkout/reference/server-integration/set-up-transaction/

https://github.com/paypal/Checkout-PHP-SDK

Cuestión: Tengo dos errores:

Este error subraya la hembra en mi parte delantera.

cart:278 POST http://127.0.0.1:8000/createOrder 500 (Internal Server Error)
{err: "Error: Expected an order id to be passed↵ 

Aquí está mi archivo de ruta:

use App\Http\Controllers\PayPalController;

Route::post('/createOrder', [PayPalController::class, 'createOrder']);

Aquí está mi PayPalController Método:

php

namespace App\Http\Controllers;

// To capture payment for paypal
namespace Sample\CaptureIntentExamples;

// Grabs the environment and request to be used for paypal
use Sample\PayPalClient;
use PayPalCheckoutSdk\Orders\OrdersCreateRequest;

// Request/Response
use Illuminate\Http\Request;
use Illuminate\Http\Response;


class PayPalController extends Controller
{
    public function createOrder() {

        $request = new OrdersCreateRequest();

        $request-prefer('return=representation');

        $request->body = [
            "intent" => "CAPTURE",
            "purchase_units" => [[
                "reference_id" => "test_ref_id1",
                "amount" => [
                    "value" => "100.00",
                    "currency_code" => "USD"
                    ]
            ]], 
            "application_context" => [
                "cancel_url" => "https://127.0.0.1:8000/cart",
                "return_url" => "https://127.0.0.1:8000/"
            ]         
        ];           

        // 3. Call PayPal to set up a transaction
        $client = PayPalClient::client();

        $response = $client->execute($request);

        // 4. Return a successful response to the client.
        return $response;
    }
}

Aquí está mi parte delantera. ver archivo:


                                
@csrf

He editado el PayPalClient. archivo php con mis credenciales.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarybuilder


3 Respuestas:

  • Un error de 500 en su /crear La ruta del pedido es algo que necesitará para diagnosticar o depurar internamente. Intente cargar la URL en un navegador y ver si obtiene más salida de error de Laravel. Si no lo hace, edite el PHP correspondiente para obtener información más útil sobre lo que está pasando.

    Una vez que lo ordenas y estás devolviendo una realidad id como parte de un objeto JSON, usted necesita cambiar su código de extremo frontal para leer la clave de eso id. Parece que estás leyendo la llave orderID, que no se establecerá a menos que lo establezca específicamente.

    El siguiente código de demostración frontal es mejor, y tiene el manejo de error: https://developer.paypal.com/demo/checkout/#/pattern/server

    Esta parte de tu código de entrada:

    No tiene sentido, a menos que sea sólo para pruebas, pero todavía no tiene sentido.

    Todo lo que debe tener es un contenedor

    con la id paypal-button-container, para que la JS haga su propio botón. Ese botón no usa ni trabaja de ninguna manera con una forma HTML.

    Respondida el Dec 19, 2020 a las 00:40 - por pixelpioneerb898

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando indica que se está produciendo un error interno del servidor al momento de realizar la solicitud para crear una orden de PayPal. Hay algunas correcciones que puedes hacer en tu código para solucionar este problema:

    • Modifica tu método `createOrder` en el controlador `PayPalController` de la siguiente manera:
    php
    public function createOrder(Request $request) {
        $client = PayPalClient::client();
    
        $request = new OrdersCreateRequest();
        $request->prefer('return=representation');
        $request->body = [
            "intent" => "CAPTURE",
            "purchase_units" => [[
                "reference_id" => "test_ref_id1",
                "amount" => [
                    "value" => "100.00",
                    "currency_code" => "USD"
                ]
            ]],
            "application_context" => [
                "cancel_url" => "https://127.0.0.1:8000/cart",
                "return_url" => "https://127.0.0.1:8000/"
            ]
        ];
    
        try {
            $response = $client->execute($request);
            return response()->json(['orderID' => $response->result->id]);
        } catch (HttpException $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }
    
    • En tu archivo de rutas `web.php`, asegúrate de utilizar el middleware `web` para manejar la protección CSRF y procesar la solicitud POST. Puedes actualizar tu código de enrutamiento de la siguiente manera:
    php
    use App\Http\Controllers\PayPalController;
    use Illuminate\Support\Facades\Route;
    
    Route::middleware('web')->post('/createOrder', [PayPalController::class, 'createOrder']);
    
    • En tu vista donde se encuentra el código HTML y JavaScript para los botones de PayPal, asegúrate de incluir el token CSRF en la solicitud POST. Puedes hacerlo de la siguiente manera:
    html
    @csrf
    
    ...
    
    
    

    Con estas modificaciones, deberías poder solucionar el problema de error interno del servidor al crear la orden de PayPal en tu aplicación Laravel 8. Asegúrate también de haber configurado correctamente tus credenciales de PayPal en el archivo PayPalClient.php.

    Respondida el Dec 20, 2020 a las 00:43 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    El error indica que falta un ID de pedido en la respuesta desde el servidor.

    Solución:

    En el método createOrder, estás devolviendo la respuesta de PayPalClient::client()->execute($request) directamente, que es un objeto PayPalHttpClientResponse. Este objeto no contiene el ID de pedido necesario para el botón inteligente.

    Para obtener el ID de pedido, debes extraerlo de la propiedad result->id del objeto de respuesta:

    php
    public function createOrder() {
    
        $request = new OrdersCreateRequest();
    
        // ...
    
        // 3. Call PayPal to set up a transaction
        $client = PayPalClient::client();
    
        $response = $client->execute($request);
    
        // 4. Extract the order ID from the response
        $orderId = $response->result->id;
    
        // 5. Return the order ID
        return response()->json(['orderID' => $orderId]);
    }
    

    Parte frontal:

    En la parte frontal, debes actualizar el código para usar el ID de pedido devuelto desde el servidor:

    javascript
    paypal.Buttons({
        createOrder: function() {
          return fetch('/createOrder', {
            // ...
          }).then(function(res) {
            return res.json();
          }).then(function(data) {
            return data.orderID; // Use the same key name for order ID on the client and server
          });
        }
    }).render('paypal-button-container');

    Respondida el Dec 20, 2020 a las 00:53 - por Gemini

    Votos positivos: 0 | Votos negativos: 0