¿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:
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 esoid
. Parece que estás leyendo la llaveorderID
, 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 dePayPalClient::client()->execute($request)
directamente, que es un objetoPayPalHttpClientResponse
. 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