Creating Addon Packages
Package your gateway driver as a standalone Composer package that auto-registers when installed. Users just composer require and the gateway is available.
Generate an Addon Scaffold
bash
php artisan payments:make-gateway Bkash --addon \
--key=bkash \
--display="bKash" \
--capabilities=redirect,webhook,refund \
--credentials=app_key:required,app_secret:requiredThis generates a complete package at packages/frolax/payment-bkash/:
packages/frolax/payment-bkash/
├── composer.json
├── config/
│ └── payment-bkash.php
├── src/
│ ├── BkashDriver.php
│ ├── BkashGatewayAddon.php
│ └── BkashServiceProvider.php
├── tests/
│ └── BkashDriverTest.php
└── docs/
└── README.mdPackage Structure
composer.json
json
{
"name": "frolax/payment-bkash",
"description": "bKash payment gateway driver for frolax/laravel-payments",
"require": {
"php": "^8.4",
"frolaxhq/laravel-payments": "^1.0"
},
"autoload": {
"psr-4": {
"Frolax\\PaymentBkash\\": "src/"
}
},
"extra": {
"laravel": {
"providers": [
"Frolax\\PaymentBkash\\BkashServiceProvider"
]
}
}
}GatewayAddonContract
Your addon implements GatewayAddonContract to declare its metadata:
php
<?php
namespace Frolax\PaymentBkash;
use Frolax\Payment\Contracts\GatewayAddonContract;
class BkashGatewayAddon implements GatewayAddonContract
{
public function gatewayKey(): string
{
return 'bkash';
}
public function displayName(): string
{
return 'bKash';
}
public function driverClass(): string|callable
{
return BkashDriver::class;
}
public function capabilities(): array
{
return ['redirect', 'webhook', 'refund'];
}
public function credentialSchema(): array
{
return [
'app_key' => 'required',
'app_secret' => 'required',
'username' => 'required',
'password' => 'required',
'webhook_secret' => 'optional',
];
}
public function defaultConfig(): array
{
return [
'sandbox_url' => 'https://tokenized.sandbox.bka.sh/v1.2.0-beta',
'live_url' => 'https://tokenized.pay.bka.sh/v1.2.0-beta',
];
}
}Service Provider
Extend GatewayAddonServiceProvider:
php
<?php
namespace Frolax\PaymentBkash;
use Frolax\Payment\Contracts\GatewayAddonContract;
use Frolax\Payment\Discovery\GatewayAddonServiceProvider;
class BkashServiceProvider extends GatewayAddonServiceProvider
{
public function gatewayAddon(): GatewayAddonContract
{
return new BkashGatewayAddon();
}
public function register(): void
{
parent::register();
$this->mergeConfigFrom(
__DIR__ . '/../config/payment-bkash.php',
'payments.gateways.bkash',
);
}
}Driver Implementation
Same as Creating Gateway Drivers, implement GatewayDriverContract + capability interfaces.
Publishing Your Addon
1. Development (Local)
Add the package as a local repository in your app's composer.json:
json
{
"repositories": [
{
"type": "path",
"url": "packages/frolax/payment-bkash"
}
]
}Install:
bash
composer require frolax/payment-bkash:@dev2. Production (Packagist)
- Push your addon to GitHub (e.g.,
frolaxhq/payment-bkash) - Register on Packagist
- Users install with:
bash
composer require frolax/payment-bkashThe gateway is available immediately with zero config.
Checklist
Before publishing your addon:
- [ ]
GatewayAddonContractimplemented with all metadata - [ ]
GatewayDriverContractimplemented withcreate()andverify() - [ ] Capability interfaces implemented for listed capabilities
- [ ]
credentialSchema()correctly lists required/optional keys - [ ] Laravel auto-discovery added to
composer.json - [ ] Tests covering create, verify, and webhook verification
- [ ] Config file with default settings
- [ ] README with setup instructions
Credential Validation
Your credential schema is used by payments:credentials:sync to validate that required credentials are present:
bash
# After installing the addon, users can validate:
php artisan payments:credentials:sync --gateway=bkash --profile=live