getcandy / stripe
Stripe payment driver for GetCandy.
Requires
- php: ^8.0
- getcandy/core: ^2.0-beta12
- livewire/livewire: ^2.0
- stripe/stripe-php: ^7.114
Requires (Dev)
- mockery/mockery: ^1.4.4
- orchestra/testbench: ^6.0|^7.0
- phpunit/phpunit: ^9.5.10
This package is auto-updated.
Last update: 2024-11-14 16:02:34 UTC
README
This addon enables Stripe payments on your GetCandy storefront.
Alpha Release
This addon is currently in Alpha, whilst every step is taken to ensure this is working as intended, it will not be considered out of Alpha until more tests have been added and proved.
Tests required:
- Successful charge response from Stripe.
- Unsuccessful charge response from Stripe.
- Test
manual
config reacts appropriately. - Test
automatic
config reacts appropriately. - Ensure transactions are stored correctly in the database
- Ensure that the payment intent is not duplicated when using the same Cart
- Ensure appropriate responses are returned based on Stripe's responses.
- Test refunds and partial refunds create the expected transactions
- Make sure we can manually release a payment or part payment and handle the different responses.
Requirements
- GetCandy >=
2.0-beta11
- A Stripe account with secret and public keys
- Laravel Livewire (if using frontend components)
- Alpinejs (if using frontend components)
Installation
Require the composer package
composer require getcandy/stripe
Publish the configuration
This will publish the configuration under config/getcandy/stripe.php
.
php artisan vendor:publish --tag=getcandy.stripe.config
Publish the views (optional)
GetCandy Stripe comes with some helper components for you to use on your checkout, if you intend to edit the views they provide, you can publish them.
php artisan vendor:publish --tag=getcandy.stripe.components
Enable the driver
Set the driver in config/getcandy/payments.php
<?php return [ // ... 'types' => [ 'card' => [ // ... 'driver' => 'stripe', ], ], ];
Add your Stripe credentials
Make sure you have the Stripe credentials set in config/services.php
'stripe' => [ 'key' => env('STRIPE_SECRET'), 'public_key' => env('STRIPE_PK'), ],
Keys can be found in your Stripe account https://dashboard.stripe.com/apikeys
Configuration
Below is a list of the available configuration options this package uses in config/getcandy/stripe.php
Backend Usage
Creating a PaymentIntent
use \GetCandy\Stripe\Facades\Stripe; Stripe::createIntent(\GetCandy\Models\Cart $cart);
This method will create a Stripe PaymentIntent from a Cart and add the resulting ID to the meta for retrieval later. If a PaymentIntent already exists for a cart this will fetch it from Stripe and return that instead to avoid duplicate PaymentIntents being created.
$cart->meta->payment_intent;
Fetch an existing PaymentIntent
use \GetCandy\Stripe\Facades\Stripe; Stripe::fetchIntent($paymentIntentId);
Both these methods will return a Stripe\PaymentIntent
object.
Storefront Usage
This addon provides some useful components you can use in your Storefront, they are built using Laravel Livewire and AlpineJs so bear that in mind.
If you are using the Demo Store, this is already set up for you so you can refer to the source code to see what's happening.
Set up the scripts
Place this in the <head>
of your Storefront.
@stripeScripts
Add the payment component
Wherever you want the payment form to appear, add this component:
@livewire('stripe.payment', [ 'cart' => $cart, 'returnUrl' => route('checkout.view'), ])
The returnUrl
is where we want Stripe to redirect us afer they have processed the payment on their servers.
Do NOT point this to the order confirmation page, as you'll see below
Process the result
You'll notice above we've told Stripe to redirect back to the checkout page, this is because although Stripe has either taken payment or allocated funds based on your policy, we still need GetCandy to process the result and create the transactions it needs against the order.
When Stripe redirects us we should have two parameters passed in the query string. payment_intent_client_secret
and payment_intent
. We can then check for these values and pass them off using GetCandy's Payments driver.
So, assuming we are using Livewire and on a CheckoutPage
component (like on the Demo Store)
if ($request->payment_intent) { $payment = \GetCandy\Facades\Payments::driver('card')->cart($cart)->withData([ 'payment_intent_client_secret' => $request->payment_intent_client_secret, 'payment_intent' => $request->payment_intent, ])->authorize(); if ($payment->success) { redirect()->route('checkout-success.view'); return; } }
And that should be it, you should then see the order in GetCandy with the correct Transactions.
If you have set your policy to manual
you'll need to go into the Hub and manually capture the payment.
Contributing
Contributions are welcome, if you are thinking of adding a feature, please submit an issue first so we can determine whether it should be included.
Testing
Currently we use a manual MockClient to mock the responses the Stripe API will return. This is likely to be improved upon as tests are written, but it should be apparent what this is doing, so feel free to add your own responses.