Skip to content

Commit

Permalink
Merge pull request #55 from FLUX-SE/stripe-js-with-api
Browse files Browse the repository at this point in the history
Stripe JS gateway and Sylius API support
  • Loading branch information
Prometee authored Jun 27, 2024
2 parents be35fe1 + cb12473 commit af830d2
Show file tree
Hide file tree
Showing 118 changed files with 2,357 additions and 537 deletions.
103 changes: 51 additions & 52 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ jobs:
strategy:
fail-fast: false
matrix:
php: [ 8.1 ]
symfony: [ ^5.4, ^6.4 ]
php: [ "8.1" ]
symfony: [ "^5.4", "^6.4" ]

steps:
-
uses: actions/checkout@v3
uses: actions/checkout@v4

-
name: Setup PHP
Expand All @@ -58,7 +58,7 @@ jobs:

-
name: Cache Composer
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-php-${{ matrix.php }}-symfony-${{ matrix.symfony }}-composer-${{ hashFiles('**/composer.json') }}
Expand Down Expand Up @@ -88,7 +88,7 @@ jobs:

-
name: Run ECS
run: vendor/bin/ecs check src
run: vendor/bin/ecs check
if: always() && steps.end-of-setup.outcome == 'success'

-
Expand All @@ -108,39 +108,33 @@ jobs:
strategy:
fail-fast: false
matrix:
php: [7.4, 8.0, 8.1, 8.2, 8.3]
symfony: [^5.4, ^6.4]
sylius: [~1.10.0, ~1.11.0, ~1.12.0]
node: [18.x]
mysql: [5.7]
php: ["8.0", "8.1", "8.2", "8.3"]
symfony: ["^5.4", "^6.4"]
sylius: ["~1.12.0", "~1.13.0"]
node: ["20.x"]
mysql: ["8.0"]

exclude:
-
sylius: ~1.10.0
symfony: ^6.4
sylius: "~1.12.0"
php: "7.4"
-
sylius: ~1.11.0
php: 7.4
sylius: "~1.13.0"
php: "7.4"
-
sylius: ~1.11.0
symfony: ^6.4
sylius: "~1.13.0"
php: "8.0"
-
sylius: ~1.12.0
php: 7.4
-
php: 7.4
symfony: ^6.4
-
php: 8.0
symfony: ^6.4
php: "8.0"
symfony: "^6.4"

env:
APP_ENV: test
DATABASE_URL: "mysql://root:[email protected]/sylius?serverVersion=${{ matrix.mysql }}"

steps:
-
uses: actions/checkout@v3
uses: actions/checkout@v4

-
name: Setup PHP
Expand All @@ -153,7 +147,7 @@ jobs:

-
name: Setup Node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: "${{ matrix.node }}"

Expand All @@ -180,63 +174,54 @@ jobs:
name: Run webserver
run: (cd tests/Application && symfony server:start --port=8080 --dir=public --daemon)

-
name: Run Chrome Headless
run: google-chrome-stable --enable-automation --disable-background-networking --no-default-browser-check --no-first-run --disable-popup-blocking --disable-default-apps --allow-insecure-localhost --disable-features=Translate --disable-extensions --no-sandbox --enable-features=Metal --headless --remote-debugging-port=9222 --window-size=2880,1800 https://127.0.0.1 > /dev/null 2>&1 &

-
name: Get Composer cache directory
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

-
name: Cache Composer
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.json **/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-${{ matrix.php }}-composer-
-
name: Configure global composer
if: matrix.symfony != ''
run: composer global config --no-plugins allow-plugins.symfony/flex true

-
name: Restrict Sylius version
if: matrix.sylius != ''
run: composer require "sylius/sylius:${{ matrix.sylius }}" --no-update --no-scripts --no-interaction

-
name: Fix build on Sylius 1.10
if: matrix.sylius == '~1.10.0'
run: |
composer require "nyholm/psr7" --no-update --no-scripts --no-interaction
-
name: Fix build on Sylius 1.11
if: matrix.sylius == '~1.11.0'
run: |
composer require "nyholm/psr7" --no-update --no-scripts --no-interaction
-
name: Fix build with PHP 8.3
if: matrix.php == '8.3'
run: |
composer remove --dev "phpspec/phpspec" --no-update --no-scripts --no-interaction
-
name: Fix build with Symfony ^5.4
if: matrix.symfony == '^5.4'
run: |
composer require --dev "doctrine/annotations:^1.14" --no-update --no-scripts --no-interaction
-
name: Install PHP dependencies
run: composer install --no-interaction
env:
SYMFONY_REQUIRE: ${{ matrix.symfony }}

-
name: Install Behat driver
run: vendor/bin/bdi browser:google-chrome drivers

-
name: Get Yarn cache directory
id: yarn-cache
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT

-
name: Cache Yarn
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ${{ steps.yarn-cache.outputs.dir }}
key: ${{ runner.os }}-node-${{ matrix.node }}-yarn-${{ hashFiles('**/package.json **/yarn.lock') }}
Expand All @@ -257,14 +242,26 @@ jobs:
name: Prepare test application assets
run: |
(cd tests/Application && bin/console assets:install public -vvv)
(cd tests/Application && yarn build)
(cd tests/Application && yarn build:prod)
-
name: Prepare test application cache
run: (cd tests/Application && bin/console cache:warmup -vvv)

-
name: Load fixtures in test application
run: (cd tests/Application && bin/console sylius:fixtures:load -n)
-
name: Validate composer.json
run: composer validate --ansi --strict

-
name: Validate database schema
run: (cd tests/Application && bin/console doctrine:schema:validate)

-
name: Run security check
run: symfony security:check

-
name: Run PHPUnit
Expand All @@ -276,9 +273,11 @@ jobs:

-
name: Upload Behat logs
uses: codecov/codecov-action@v3
uses: actions/upload-artifact@v4
if: failure()
with:
name: Behat logs
path: etc/build/
name: Logs for Sylius ${{ matrix.sylius }}, PHP ${{ matrix.php }}, Symfony ${{ matrix.symfony }}, MySQL ${{ matrix.mysql }}
path: |
etc/build/
tests/Application/var/log
if-no-files-found: ignore
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

/etc/build/*
!/etc/build/.gitignore
drivers

/tests/Application/yarn.lock

Expand All @@ -12,3 +13,7 @@
/phpstan.neon
/phpspec.yml
/behat.yml

# Symfony CLI https://symfony.com/doc/current/setup/symfony_server.html#different-php-settings-per-project
/.php-version
/php.ini
41 changes: 37 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
[![Latest Version on Packagist][ico-version]][link-packagist]
[![Software License][ico-license]](LICENSE)
[![Build Status][ico-github-actions]][link-github-actions]
[![Quality Score][ico-code-quality]][link-code-quality]

## Sylius Payum Stripe gateway plugin

Expand Down Expand Up @@ -158,20 +157,54 @@ in the Sylius admin.
> ⚠️ Using `stripe trigger checkout.session.completed` will always result in a `500 error`,
> because the test object will not embed any usable metadata.

## Advanced usages
### More?

See documentation here : https://github.com/FLUX-SE/PayumStripe/blob/master/README.md

## API (Sylius Api Platform)

### Stripe JS gateway

The endpoint : `GET /api/v2/shop/orders/{tokenValue}/payments/{paymentId}/configuration`
will make a Payum `Capture` and respond with the Stripe Payment Intent client secret, like this :

```json
{
'publishable_key': 'pk_test_1234567890',
'use_authorize': false,
'stripe_payment_intent_client_secret': 'a_secret'
}
```

After calling this endpoint your will be able to use Stripe Elements to display a Stripe Payment form, the same as this template is doing it:
https://github.com/FLUX-SE/PayumStripe/blob/master/src/Resources/views/Action/stripeJsPaymentIntent.html.twig.
More information here : https://docs.stripe.com/payments/payment-element

### Stripe Checkout Session gateway

The endpoint : `GET /api/v2/shop/orders/{tokenValue}/payments/{paymentId}/configuration`
will make a Payum `Capture` and respond with the Stripe Checkout Session url, like this :

```json
{
'publishable_key': 'pk_test_1234567890',
'use_authorize': false,
'stripe_checkout_session_url': 'https://checkout.stripe.com/c/pay/cs_test...'
}
```

Since this endpoint is not able to get any data from you, a service can be decorated to specify the Stripe Checkout Session `success_url` you need.
Decorate this service : `flux_se.sylius_payum_stripe.api.payum.after_url.stripe_checkout_session` to generate your own dedicated url.
You will have access to the Sylius `Payment` to decide what is the url/route and the parameters of it.

[docs-assets-create-payment-method]: docs/assets/create-payment-method.png
[docs-assets-gateway-configuration]: docs/assets/gateway-configuration.png
[docs-assets-gateway-configuration-authorize]: docs/assets/gateway-configuration-authorize.png

[ico-version]: https://img.shields.io/packagist/v/Flux-SE/sylius-payum-stripe-plugin.svg?style=flat-square
[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square
[ico-github-actions]: https://github.com/FLUX-SE/SyliusPayumStripePlugin/workflows/Build/badge.svg
[ico-code-quality]: https://img.shields.io/scrutinizer/g/Flux-SE/SyliusPayumStripePlugin.svg?style=flat-square

[link-packagist]: https://packagist.org/packages/flux-se/sylius-payum-stripe-plugin
[link-scrutinizer]: https://scrutinizer-ci.com/g/FLUX-SE/SyliusPayumStripePlugin/code-structure
[link-github-actions]: https://github.com/FLUX-SE/SyliusPayumStripePlugin/actions?query=workflow%3A"Build"
[link-code-quality]: https://scrutinizer-ci.com/g/FLUX-SE/SyliusPayumStripePlugin
7 changes: 7 additions & 0 deletions UPGRADE.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# UPGRADE FROM `v2.0.10` to `v2.0.11`

This class has been deprecated :

- `\FluxSE\SyliusPayumStripePlugin\Form\Type\StripeCheckoutSessionGatewayConfigurationType`
use `\FluxSE\SyliusPayumStripePlugin\Form\Type\StripeGatewayConfigurationType` instead.

# UPGRADE FROM `v2.0.8` to `v2.0.9`

This class has been renamed :
Expand Down
35 changes: 33 additions & 2 deletions behat.yml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,15 @@ imports:
- tests/Behat/Resources/suites.yaml

default:
formatters:
pretty:
verbose: true
paths: false
snippets: false

extensions:
DMore\ChromeExtension\Behat\ServiceContainer\ChromeExtension: ~
Robertfausk\Behat\PantherExtension: ~

FriendsOfBehat\MinkDebugExtension:
directory: etc/build
Expand All @@ -15,14 +22,32 @@ default:
files_path: "%paths.base%/vendor/sylius/sylius/src/Sylius/Behat/Resources/fixtures/"
base_url: "https://127.0.0.1:8080/"
default_session: symfony
javascript_session: chrome_headless
javascript_session: panther
sessions:
symfony:
symfony: ~
chrome_headless:
chromedriver:
chrome:
api_url: http://127.0.0.1:9222
validate_certificate: false
chrome_headless_second_session:
chrome:
api_url: http://127.0.0.1:9222
validate_certificate: false
panther:
panther:
options:
webServerDir: "%paths.base%/tests/Application/public"
manager_options:
connection_timeout_in_ms: 5000
request_timeout_in_ms: 120000
chromedriver_arguments:
- --log-path=etc/build/chromedriver.log
- --verbose
capabilities:
acceptSslCerts: true
acceptInsecureCerts: true
unexpectedAlertBehaviour: accept
show_auto: false

FriendsOfBehat\SymfonyExtension:
Expand All @@ -31,3 +56,9 @@ default:
class: Tests\FluxSE\SyliusPayumStripePlugin\Application\Kernel

FriendsOfBehat\VariadicExtension: ~

FriendsOfBehat\SuiteSettingsExtension:
paths:
- "features"

SyliusLabs\SuiteTagsExtension: ~
Loading

0 comments on commit af830d2

Please sign in to comment.