Priklad integracie PayPalu alebo stripe
- Polki
- Člen | 553
PayPal:
Nainstaluj si rozšíření paypal/paypal-checkout-sdk
A pak:
local.neon
parameters:
payPalClientId: 'clientId'
payPalClientSecret: 'clientSecret'
services:
- PayPalCheckoutSdk\Core\SandboxEnvironment(clientId: %payPalClientId%, clientSecret: %payPalClientSecret%) // Na produkci je NUTNÉ předělat na 'PayPalCheckoutSdk\Core\ProductionEnvironment' a taky možná lepší je udělat to přes továrnu
common.neon
services:
- PayPalCheckoutSdk\Core\PayPalHttpClient // Možná radši továrna?
- App\Model\PaypalConnector
latte soubor
<div id="paypal-button-container"></div>
<script src="https://www.paypal.com/sdk/js?client-id={$payPalApiClientId}¤cy=CZK"></script>
<script>
paypal.Buttons({
// Sets up the transaction when a payment button is clicked
createOrder: function(data, actions) {
return actions.order.create({
intent: 'CAPTURE',
application_context: {
locale: 'cs-CZ',
brand_name: 'name',
shipping_preferences: 'NO_SHIPPING',
user_action: 'PAY_NOW',
return_url: {link //Paypal:success},
cancel_url: {link //Paypal:error}
},
purchase_units: [{
items: [
{foreach $basketContent as $row}
{
name: {$row->products->name},
unit_amount: {
currency_code: "CZK",
value: {$row->price}
},
quantity: {$row->cnt}
}{if !$iterator->isLast()},{/if}
{/foreach}
],
description: 'description',
custom_id: {$user->id},
amount: {
currency_code: "CZK",
value: {$fullPrice}, // Can reference variables or functions. Example: `value: document.getElementById('...').value`
breakdown: {
item_total: {
currency_code: "CZK",
value: {$fullPrice}
}
}
}
}]
});
},
// Finalize the transaction after payer approval
onApprove: function(data, actions) {
return actions.order.capture().then(function(orderData) {
return fetch({link Paypal:confirm}, {
method: 'POST',
body: JSON.stringify({
orderID: data.orderID
}),
headers: {
'Content-Type': 'application/json'
}
}).then(
function(response) {
if (response.status !== 200) {
window.location.href = {link Paypal:error};
}
window.location.href = {link Paypal:success};
}
);
}).catch(function(details) {
// Show a error message to your buyer
window.location.href = {link Paypal:error};
});
}
}).render('#paypal-button-container');
</script>
PaypalPresenter:
class PaypalPresenter extends Presenter
{
#[Inject]
public PaypalConnector $paypalConnector;
public function actionConfirm(): void
{
try {
$orderId = json_decode(file_get_contents('php://input'), true)['orderID'];
$this->paypalConnector->verifyOrder($orderId);
} catch (Exception $e) {
$this->getHttpResponse()->setCode(IResponse::S402_PAYMENT_REQUIRED);
}
$this->sendPayload();
}
}
App\Model\PaypalConnector:
class PaypalConnector
{
use SmartObject;
public function __construct(
private PayPalHttpClient $client,
private BasketRepository $basketRepository, // Klasický repo, který se ti stará o košík.
): void
{ }
public function processOrder(string|int $orderId): bool
{
$client = $this->client;
$ordersGetRequest = new OrdersGetRequest($orderId);
$response = $client->execute($ordersGetRequest);
$result = $response->result;
//$customId = $result->purchase_units[0]->custom_id;
if ($response->result->status === 'COMPLETED') {
$this->basketRepository->setPaid($orderId); // Nastaví celou objednávku jako zaplacenou
// Následující printy by se možná oplatilo si někam logovat. V případě problémů je pak lehko dohledatelné, co se dělo.
print "Status Code: {$response->statusCode}\n";
print "Status: {$response->result->status}\n";
print "Order ID: {$response->result->id}\n";
print "Intent: {$response->result->intent}\n";
print "Links:\n";
foreach($response->result->links as $link)
{
print "\t{$link->rel}: {$link->href}\tCall Type: {$link->method}\n";
}
print "Gross Amount: {$response->result->purchase_units[0]->amount->currency_code} {$response->result->purchase_units[0]->amount->value}\n";
echo json_encode($response->result, JSON_PRETTY_PRINT);
return true;
}
throw new Exception('Payment is required', 1264656);
}
}
No a nakonec si vytvoříš nějaké krásné šablony na error stránku Paypal/error.latte a success stránku Paypal/success.latte.
That's all.
stripe jsem ještě nedělal Sorry
- Michal Kumžák
- Člen | 106
Koukni i sem https://github.com/…d/stripe-api. Zkus nejdřív hledat na googlu, než sem začneš psát.
- MKI-Miro
- Člen | 278
@Polki dakujem
mame ale este 2 otazky k tomu PayPalu:
1. Ako kontrolujes stav objednavky?
Ja pouzivam /v2/checkout/orders/{order_id} – to funguje dobre pokial je
objednavka dokoncena.
Ak dokonecna nie je tak dostanem hlasku
""issue":„INVALID_RESOURCE_ID“,„description“:„Specified resource ID
does not exist.“ – ako keby sa ani nikdy nevytvorila. Tym padom mam
v systeme bud COMPLETED alebo INVALID_RESOURCE_ID.
Mas to aj ty tak?
2. Ako trigerujes opatovany pokus o zaplatenie?
Priklad: GoPay to ma spravene tak ze pri vytovreni objednavky sa mu zada url
ktoru ma zavolat ak sa stav objednavky zmeni. Na danej url sa tym padom viem
rozhodnut ci zakaznikovi poslat mail s moznostou opatovneho zaplatenia.
V PayPale ale hladam a nic take nevidim
Dakujem