Accept crypto (BTC, ETH, USDT, USDC, Solana, Tron, UCASH and custom tokens) and cards (via your own Stripe) through U.CASH Pay on Shopware 6. Non-custodial: funds settle direct buyer-to-wallet; the plugin never holds funds or keys.
You need a free U.CASH Pay account and a store before this plugin can accept payments. Settlement is non-custodial: crypto goes straight to addresses you control.
- Sign up at pay.u.cash with your email and password, then click the verification link in the email U.CASH Pay sends you.
- Set your receive addresses. Go to Settings → Addresses and enter a wallet address for each coin you want to accept. You can also use ENS, Unstoppable Domains, or FIO names instead of raw addresses. This is where crypto payments settle.
- Create a store. Go to Account → Stores, click + Add Store, name it (for example, after this platform), and create it.
- Copy the store credentials. In that store's row, copy the Store Cloud Token and the Store Webhook Secret. Use the store-level token, not the account-wide one.
- Set the webhook URL. Paste this plugin's webhook callback URL (shown in the plugin settings below) into the store's Store Webhook URL field, save, then click Test Webhook to confirm U.CASH Pay can reach your store.
Then paste the Store Cloud Token and Store Webhook Secret into the plugin configuration fields described below.
To also accept fiat cards, connect your own Stripe account under Settings → Payment processors. Cards run non-custodially through Stripe.
- Buyer selects U.CASH Pay at checkout.
- The payment handler calls the SDK to create a pay.u.cash transaction, then redirects the buyer to the hosted
payment_url. - The buyer pays with crypto or card on the pay.u.cash hosted page.
- On settlement, pay.u.cash sends an HMAC-signed webhook to
/payment/ucashpay/webhook. - The webhook controller verifies the signature via the SDK, then marks the matching order Paid.
- Copy the plugin folder into
custom/plugins/UcashPay:cp -r shopware-ucashpay /path/to/shopware/custom/plugins/UcashPay
- From the Shopware install root:
bin/console plugin:refresh bin/console plugin:install --activate UcashPay bin/console cache:clear
- In the admin, open Settings > System > Plugins and confirm U.CASH Pay is active.
composer require ucash/shopware-ucashpay
bin/console plugin:refresh
bin/console plugin:install --activate UcashPay
bin/console cache:clear- Open Settings > System > System configuration (or Settings > Shop > Payment) in the Shopware admin.
- Under U.CASH Pay, set:
- Cloud token - copy from pay.u.cash Account > Stores.
- Webhook secret - copy from pay.u.cash Account > Stores (same screen).
- U.CASH base URL - leave
https://pay.u.cashunless you self-host.
- In pay.u.cash (Account > Stores), set the Webhook URL to:
https://your-store.com/payment/ucashpay/webhook - Save and clear the cache.
src/UcashPay.php- main plugin class. Seeds the payment method on install, toggles it active on activate/uninstall.src/Payment/UcashPayPaymentHandler.php-AsynchronousPaymentHandlerInterface.pay()creates the checkout via the SDK and redirects;finalize()is a no-op because settlement is authoritative via the webhook.src/Subscriber/PaymentSubscriber.php- event subscriber. Ensures U.CASH Pay appears in the checkout payment-method list, andfinalizeOrderFromWebhook()marks the order Paid after a verified webhook.src/Controller/WebhookController.php- Symfony routePOST /payment/ucashpay/webhook. Reads raw body +X-Webhook-Signature, verifies via the SDK, then settles the order.src/Service/PaymentService.php- SDK wrapper.require_oncesPayUCashIntegration.php, reads config fromSystemConfigService, exposescreateCheckout,verifyWebhook,testConnection.src/Resources/config/services.xml- DI wiring (handler, subscriber, service, controller).src/Resources/config/config.xml- admin config fields (cloud token, webhook secret, base URL).PayUCashIntegration.php- the shared zero-dependency SDK (PHP 7.2+, curl).
- Non-custodial. The plugin holds no funds and no private keys. Crypto settles direct buyer-to-wallet; cards run through the merchant's own Stripe configured inside pay.u.cash.
- Webhook is authoritative. The buyer return (
finalize()) intentionally does not mark the order paid. If the buyer returns before the webhook lands, the order stays unconfirmed and the webhook catches up. - Security. The webhook is authenticated solely by the HMAC signature (timestamp + SHA-256). No Shopware token or session is required on the route.
License: MIT.