Priklad integracie PayPalu alebo stripe

MKI-Miro
Člen | 278
+
0
-

Ahojte

Nepodelil by sa niekto o ukazku toho ako mate v nette implementovany PayPal alebo stripe?

Dakujeem

Polki
Člen | 553
+
+1
-

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}&currency=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
+
0
-

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

@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