PayIsland Flutter/Dart SDK

Official Flutter/Dart SDK for integrating with PayIsland payment APIs.

This is the Phase 1 foundation for server-side or trusted Dart integrations. It supports client initialization, inbound transaction initialization, transaction verification, webhook signature verification, typed API exceptions, examples, and tests.

Installation

flutter pub add payisland

Or add it manually:

dependencies:
  payisland: ^0.1.0

Then run:

dart pub get

Initialization

import 'package:payisland/payisland.dart';

final payIsland = PayIslandClient(secretKey: 'test_secret_key');

PayIsland determines sandbox or live mode from the API key. The SDK does not expose a sandbox/live environment flag.

Transaction Initialization

final response = await payIsland.transactions.initialize({
  'callback_url': 'https://example.com/webhooks/payislands',
  'payment_item_id': '6',
  'transaction_reference': 'order_${DateTime.now().millisecondsSinceEpoch}',
  'channel': 'card',
  'amount': '1000',
  'customer_info': {
    'email': 'ada@example.com',
    'phone_number': '08011112222',
    'first_name': 'Ada',
    'last_name': 'Lovelace',
  },
});

print(response['data']['authorization_url']);

For card transactions, 3DS authentication can leave a transaction in a pending or intermediate state until the customer completes authentication and PayIsland finalizes the result. Always verify the transaction reference before fulfillment.

Transaction Verification

final response = await payIsland.transactions.verify('order_123');

print(response);

Webhook Verification

final isValid = payIsland.webhooks.verifySignature(
  payload: rawPayload,
  signature: signature,
  secret: webhookSecret,
);

if (!isValid) {
  throw Exception('Invalid webhook signature');
}

Webhook signatures are verified with HMAC SHA256 using constant-time comparison where possible. After verifying the signature, verify the transaction reference with PayIsland before fulfilling an order.

Error Handling

API errors throw PayIslandApiException:

try {
  final response = await payIsland.transactions.verify('order_123');
  print(response);
} on PayIslandApiException catch (error) {
  print(error.message);
  print(error.statusCode);
  print(error.responseBody);
}

Configuration

Use PayIslandConfig when you need to override the base URL or timeout, usually for tests:

final payIsland = PayIslandClient.fromConfig(
  PayIslandConfig(
    secretKey: 'test_secret_key',
    baseUrl: 'https://ags.payislands.com',
    timeout: Duration(seconds: 30),
  ),
);

Default base URL:

https://ags.payislands.com

Authentication uses:

Authorization: Bearer <secretKey>

Default headers:

Content-Type: application/json
Accept: application/json
User-Agent: payisland-flutter

Examples

dart run example/initialize_payment.dart
dart run example/verify_payment.dart <reference>
dart run example/webhook_verification.dart

Environment variables:

PAYISLAND_SECRET_KEY=your_test_secret_key
PAYISLAND_PAYMENT_ITEM_ID=your_payment_item_id
PAYISLAND_WEBHOOK_SECRET=your_webhook_secret

Development Commands

dart pub get
dart analyze
dart test
dart format .
dart pub publish --dry-run

Pub.dev Publishing

Before publishing, run:

dart format .
dart analyze
dart test
dart pub publish --dry-run

Publish when the dry run is clean:

dart pub publish

License

MIT. See LICENSE.

Libraries

payisland
Official Flutter/Dart SDK for integrating with PayIsland payment APIs.