Programming_018
Messages postés108Date d'inscriptionvendredi 13 janvier 2017StatutMembreDernière intervention 7 mai 2024
-
6 mai 2023 à 17:10
Programming_018
Messages postés108Date d'inscriptionvendredi 13 janvier 2017StatutMembreDernière intervention 7 mai 2024
-
6 mai 2023 à 17:37
Bonjour,
J'ai un petit soucis au niveau de mon code.
Je créer un site e-commerce avec HTML, CSS, PHP 8.1, JS et Ajax ainsi que l'API REST de Paypal.
Quand la commande est correcte cela fonctionne super bien, mais lorsque mon article est en rupture de stock et qu'un client essaie de passer une commande avec ce dernier dans le panier et bien je n'arrive pas à annulé l'interaction de l'appel paypal en signalant que l'article est en rupture.
J'ai testé de faire un header('Location: ...'), cependant aucune action ne se fait dans la vue. Juste en mode développeur dans l'onglet réseau j'ai bien mon fichier du header Location qui apparait mais sur l'écran du visiteur cela reste sur le panier sans aucune modification ni information.
Si vous avez des conseils et astuces pour améliorer mon code je suis preneur également :-)
Je vous remercie par avance de votre future aide.
Voici quelques lignes de code qui pourrais vous aidez à m'aider :-)
Mon fichier PaypalPayment.php :
<?php
namespace Parts;
use Model\connectBDD;
use Model\Entity\Cart;
use PayPalCheckoutSdk\Orders\OrdersGetRequest;
use PayPalCheckoutSdk\Payments\AuthorizationsCaptureRequest;
use PayPalHttp\HttpException;
use PayPalHttp\IOException;
use Psr\Http\Message\ServerRequestInterface;
class PaypalPayment
{
public function __construct(readonly private string $client_id,readonly private string $client_secret,readonly private bool $isSandbox)
{
}
public function ui(Cart $cart): string
{
$clientID = PAYPAL_ID;
$order = json_encode([
"purchase_units"=> [[
"amount"=> [
"currency_code"=> "EUR",
"value"=> $cart->getTotalPrice(),
"breakdown"=> [
"item_total"=> [ /* Required when including the items array */
"currency_code"=> "EUR",
"value"=> $cart->getTotalPrice()
]
]
],
"items" => array_map(function ($product){
return [
'name' => $product['product']['name'],
'quantity' => $product['qty'],
'unit_amount' => [
'value' => $product['product']['price'],
'currency_code' => 'EUR'
]
];
}, $cart->getProducts())
]]
]);
return <<<HTML
<!-- Replace "test" with your own sandbox Business account app client ID -->
<script src="https://www.paypal.com/sdk/js?client-id=%7B%24clientID%7D¤cy=EUR&intent=authorize"></script>
<div id="paypal-button-container"></div>
<script>
paypal.Buttons({
// Sets up the transaction when a payment button is clicked
createOrder: (data, actions) => {
// return actions.order.create({})
return actions.order.create({$order})
},
// Finalize the transaction after payer approval
onApprove: async (data, actions) => {
const authorization = await actions.order.authorize();
const authorizationId = authorization.purchase_units[0].payments.authorizations[0].id;
await fetch("/assets/parts/paypal.php", {
method: "post",
headers: {
"content-type": "application/json"
},
body: JSON.stringify({authorizationId})
})
}
}).render('#paypal-button-container');
</script>
HTML;
}
/**
* @throws HttpException
* @throws IOException
* @throws \PaymentAmountMissMatchException
* @throws \Exception
*/
public function handle(ServerRequestInterface $request, Cart $cart)
{
require '../../Model/connectBDD.php';
if($this->isSandbox){
$environment = new \PayPalCheckoutSdk\Core\SandboxEnvironment(PAYPAL_ID,PAYPAL_SECRET);
}else{
$environment = new \PayPalCheckoutSdk\Core\ProductionEnvironment(PAYPAL_ID,PAYPAL_SECRET);
}
$client = new \PayPalCheckoutSdk\Core\PayPalHttpClient($environment);
$authorizationId = $request->getParsedBody()['authorizationId'];
$request = new \PayPalCheckoutSdk\Payments\AuthorizationsGetRequest($authorizationId);
$authorizationResponse = $client->execute($request);
$amount = floatval($authorizationResponse->result->amount->value);
if($amount !== $cart->getTotalPrice()) {
throw new \PaymentAmountMissMatchException($amount, $cart->getTotalPrice());
}
//Vérifier si le stock est dispo
foreach ($cart->getProducts() as $cartItem){
$db = new connectBDD();
$db = $db::instance();
if($cartItem['product']['quantity'] >= $cartItem['qty']){
$requestUpdate = $db->prepare("UPDATE article SET quantity='" . ($cartItem['product']['quantity'] - $cartItem['qty']) . "' WHERE name=:name");
$requestUpdate->bindValue(":name", $cartItem['product']['name']);
$requestUpdate->execute();
}else{
//Exemple de test pour essayer d'afficher un message à l'utilisateur
$_SESSION['stock'] = "Plus de stock pour cet article";
header('Location: notStock.php');
return false;
}
}
//Verrouiller le stock
//Sauvegarder les infos de l'utilisateur
$orderId = $authorizationResponse->result->supplementary_data->related_ids->order_id;
$request = new OrdersGetRequest($orderId);
$orderResponse = $client->execute($request);
//Capturer le paiement
$request = new AuthorizationsCaptureRequest($authorizationId);
$response = $client->execute($request);
$_SESSION['or_id_com'] = $orderId;
if($response->result->status !== "COMPLETED"){
//C'est pas ok
throw new \Exception();
}
header('Location: confirmCommand.php');
}
}
Programming_018
Messages postés108Date d'inscriptionvendredi 13 janvier 2017StatutMembreDernière intervention 7 mai 20247 Modifié le 6 mai 2023 à 17:38
En fait j'ai réussi gràce à l'ajax et à un alert certe c'est moche mais ça à le mérite de fonctionnait :-)