A Manual Gateway is used when a transaction cannot be verified automatically via API or SMS. The system provides the user with payment instructions, and the user must manually submit a Transaction ID (TrxID) or reference number for administrative approval.
Consistency is key. Follow this structure exactly:
Root Folder: pp-content/pp-modules/pp-gateways/
Gateway Folder: Must be lowercase, no spaces, and unique (e.g., wise-manual).
Main File: class.php (All logic goes here).
Assets: Place your logo.jpg inside an assets/ folder.
pp-gateways/
└── wise-manual/
├── class.php
└── assets/
└── logo.jpgThe class name inside class.php must follow the PascalCase version of your folder name + the word Gateway.
Folder: wise-manual -> Class: WiseManualGateway
Folder: perfect-money -> Class: PerfectMoneyGateway
Every manual gateway class must implement these six core methods:
info()Defines the metadata. For manual gateways, the gateway_type and verify_by keys are mandatory.
public function info() {
return [
'title' => 'Wise Manual',
'logo' => 'assets/logo.jpg',
'currency' => 'USD',
'tab' => 'global',
'gateway_type' => 'manual', // Important: Must be 'manual'
'verify_by' => 'trxid', // Tells the system to ask for a Transaction ID
];
}color()Defines the branding colors for the payment page.
primary_color: Header/Main theme.
btn_color: The "Verify/Submit" button color.
fields()These are the settings shown in the Admin Panel. For example, if you need the Admin to provide their Wise Email, you define it here.
public function fields() {
return [
[
'name' => 'recipient_wise_account',
'label' => 'Recipient Wise Account',
'type' => 'text', // Options: text, number, image
]
];
}supported_languages()Define which languages your instructions support.
'en' => 'English', 'bn' => 'বাংলা', etc.
lang_text()This is your translation dictionary. Each numeric key represents a "step" in the payment process. Use placeholders like {amount} or {currency} to make them dynamic.
instructions($data)This builds the actual UI the customer sees. It maps the lang_text to the user interface.
$data ArrayThe instructions($data) method automatically receives a $data array. Use it to pull live info:
$data['options']: Pulls settings saved by the Admin in the fields() method.
$data['transaction']['local_net_amount']: The exact amount the user needs to pay.
$data['transaction']['local_currency']: The currency of the payment.
Here is the logic for a step that shows the account number and adds a "Copy" button:
[
'text' => '5', // Refers to lang_text key '5'
'copy' => true,
'value' => $data['options']['recipient_wise_account'],
'vars' => [
'{recipient_wise_account}' => $data['options']['recipient_wise_account']
]
],User sees the Instructions defined in your class.
User makes the payment externally (e.g., on the Wise App).
User enters their Transaction ID into the system (triggered by verify_by => trxid).
The transaction status becomes Pending.
The Admin manually verifies the ID and approves the payment in the backend.