Transact Pay

pub package License: MIT

TransactPay provide innovative and flexible European BIN sponsorship and modular payment, debit, and prepaid services.

🌟 Getting Started

To start using this package, add transact_pay dependency to your pubspec.yaml

You also need to have Public key and Encryption key, which can be gotten from the transactpay marchant dashboard

dependencies:
  transact_pay: "<latest_release>"

📌 Simple Example (Thanks to @ChidiebereEdeh)

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:transact_pay/transact_pay.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Transact Pay API Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  // Example API Key and Encryption Key
  String apiKey = "PGW-PUBLICKEY-TEST-5D9411AB210740019FF1374C896D86D0";
  String encryptionKey =
      "NDA5NiE8UlNBS2V5VmFsdWU+PE1vZHVsdXM+cW5rdlhOWHRYdEF0Mi9RcDB4SzBSUXpXYTVKRWc5T0xTNFBqYzZKcmN1eDg4bmJsd2Fyd0h4dnlrUy9STk92eFltU2ZPTlEzbW9vM1hhaWpXd2IwbnVVOTJ4anBmSzByb0FYaFo0emdHVUdlS081emY4enlncExTYzFqS05MMFNXZHZWYndMeTN3WHJiRTBrSjZJRWVvSThLRSs0anRndzY1R084Z3hJeGpibjhNemI5YVNreFdaSnVMRFRLNzJHcGcxYkwrNDBLYnVNc2tVWlJVTGxhNC84Y1dYSlpId2JINjRWNkNHQlVMMGVQUmQ4dnB3aEhySzhZSlZaRGxuYTdNbmxQVjdoeGg1Q0dabkVsNy91WEJjaGYvTExLOFNyckdnRWN1anFKWEZxMm9nUlEwNzBxN2RmOXBNZ0Q5YXpTK3dya2dBck9wNnVFcXBFQ1NnbXlvb1VMZFV2MTBhQk4xRUN5YTY2UnhuV3dEck5QZktSWjU4ZmFlNnJkelpMaExlajNId2VJRjZYcHpwL280VTlmVDVwOFNWTStHK1FZalFFV0RieldhYzMyMUIxRVhWc2xkMXFFTDJzZEk0UEFWNy9DWUcwS2hvR256NVdyZnNBQ1lRRUFkQm16MXM1NktYZnczV3dYVDJoUE1xWWtTZ2c4ejFiR1AxWTZJeDU3RHViUjdVcDlwc2taV0ptUzdNdkM1NnRHN1F6OUdiNzBjVTRiNXYvYkdBZnNMNUlRanBrc2QyRENsU2U0Vm5oNEcyWE0xeTEzS0gyZWVvNnViMUczdVBUMGtzZ2RxSXRtdjFKcmN3SThWaXJOWG9oeW1xL2xpbWg1VUhDTWhzMUhlUTQwMXIvNWt0S200bDJISFMvdXhNcmZlUmVEVTRWMXVBZTNQRU1jUDg9PC9Nb2R1bHVzPjxFeHBvbmVudD5BUUFCPC9FeHBvbmVudD48L1JTQUtleVZhbHVlPg==";

  late TransactPay transactPay;
  late Future<String> createOrderFuture;
  late Future<String> payWithCardFuture;
  late Future<String> getBanksFuture;

  @override
  void initState() {
    super.initState();
    transactPay = TransactPay(apiKey: apiKey, encryptionKey: encryptionKey);

    // Initialize the futures once to prevent multiple API calls
    createOrderFuture = createOrder();
    payWithCardFuture = payWithCard();
    getBanksFuture = getBanks();
  }

  Future<String> fetchData(Function apiCall) async {
    try {
      http.Response response = await apiCall();
      return 'Status: ${response.statusCode}\nBody: ${response.body}';
    } catch (e) {
      return 'Error: $e';
    }
  }

  Future<String> createOrder() {
    Map<String, dynamic> payload = {
      "customer": {
        "firstname": "transact",
        "lastname": "pay",
        "mobile": "+2348134509421",
        "country": "NG",
        "email": "email@transactpay.ai"
      },
      "order": {
        "amount": 200,
        "reference": "12137e00034hjekhke",
        "description": "Pay",
        "currency": "NGN"
      },
      "payment": {"RedirectUrl": "https://www.hi.com"}
    };
    return fetchData(() => transactPay.createOrder(payload));
  }

  Future<String> payWithCard() {
    Map<String, dynamic> payload = {
      "reference": "12137e00034hjekhke",
      "paymentoption": "C",
      "country": "NG",
      "card": {
        "cardnumber": "5123450000784608",
        "expirymonth": "01",
        "expiryyear": "39",
        "cvv": "193"
      }
    };
    return fetchData(() => transactPay.payWithCard(payload));
  }

  Future<String> getBanks() {
    Map<String, dynamic> payload = {};
    return fetchData(() => transactPay.banks());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Transact Pay API Demo'),
      ),
      body: ListView(
        children: [
          buildApiResultTile('Create Order', createOrderFuture),
          buildApiResultTile('Pay with Card', payWithCardFuture),
          buildApiResultTile('Get Banks', getBanksFuture),
        ],
      ),
    );
  }

  Widget buildApiResultTile(String title, Future<String> apiFuture) {
    return FutureBuilder<String>(
      future: apiFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return ListTile(
            title: Text(title),
            subtitle: const Text('Loading...'),
            leading: const CircularProgressIndicator(),
          );
        } else if (snapshot.hasError) {
          return ListTile(
            title: Text(title),
            subtitle: Text('Error: ${snapshot.error}'),
            leading: const Icon(Icons.error, color: Colors.red),
          );
        } else {
          return ListTile(
            title: Text(title),
            subtitle: Text(snapshot.data ?? 'No data'),
            leading: const Icon(Icons.check_circle, color: Colors.green),
          );
        }
      },
    );
  }
}


📝 Documentation

📝 TransactPay Instantiation and encryption

 // Example API Key and Encryption Key
String apiKey = "PGW-PUBLICKEY-TEST-5D9411AB210740019FF1374C896D86D0";
String encryptionKey =
    "NDA5NiE8UlNBS2V5VmFsdWU+PE1vZHVsdXM+cW5rdlhOWHT0xTNFBqYzZKcmN1eDg4bmJsd2Fyd0h4dnlrUy9STk92eFltU2ZPTlEzbW9vM1hhaWpXd2IwbnVVOTJ4anBmSzByb0FYaFo0emdHVUdlS081emY4enlncExTYzFqS05MMFNXZHZWYndMeTN3WHJiRTBrSjZJRWVvSThLRSs0anRndzY1R084Z3hJeGpibjhNemI5YVNreFdaSnVMRFRLNzJHcGcxYkwrNDBLYnVNc2tVWlJVTGxhNC84Y1dYSlpId2JINjRWNkNHQlVMMGVQUmQ4dnB3aEhySzhZSlZaRGxuYTdNbmxQVjdoeGg1Q0dabkVsNy91WEJjaGYvTExLOFNyckdnRWN1anFKWEZxMm9nUlEwNzBxN2RmOXBNZ0Q5YXpTK3dya2dBck9wNnVFcXBFQ1NnbXlvb1VMZFV2MTBhQk4xRUN5YTY2UnhuV3dEck5QZktSWjU4ZmFlNnJkelpMaExlajNId2VJRjZYcHpwL280VTlmVDVwOFNWTStHK1FZalFFV0RieldhYzMyMUIxRVhWc2xkMXFFTDJzZEk0UEFWNy9DWUcwS2hvR256NVdyZnNBQ1lRRUFkQm16MXM1NktYZnczV3dYVDJoUE1xWWtTZ2c4ejFiR1AxWTZJeDU3RHViUjdVcDlwc2taV0ptUzdNdkM1NnRHN1F6OUdiNzBjVTRiNXYvYkdBZnNMNUlRanBrc2QyRENsU2U0Vm5oNEcyWE0xeTEzS0gyZWVvNnViMUczdVBUMGtzZ2RxSXRtdjFKcmN3SThWaXJOWG9oeW1xL2xpbWg1VUhDTWhzMUhlUTQwMXIvNWt0S200bDJISFMvdXhNcmZlUmVEVTRWMXVBZTNQRU1jUDg9PC9Nb2R1bHVzPjxFeHBvbmVudD5BUUFCPC9FeHBvbmVudD48L1JTQUtleVZhbHVlPg==";

// Create an instance of TransactPay
TransactPay transactPay = TransactPay(
  apiKey: apiKey,
  encryptionKey: encryptionKey,
);

📝 Simple Usage

 // Simple order fee example
//----------------------------------------------------------------------------

// Order fee payload
Map<String, dynamic> orderFeePayload = {
    "amount": 100,
    "currency": "USD",
    "paymentoption": "C"
};
// Call the order fee method
try {
    http.Response orderFeeResponse =
    await transactPay.orderFee(orderFeePayload);
    print('Order Status Response: ${orderFeeResponse.statusCode}');
    print('Response Body: ${orderFeeResponse.body}');
} catch (e) {
    print('Error fetching order fee: $e');
}

Other example can be found in the example tab

Issues

Please file any issues, bugs or feature request as an issue on our GitHub page.

Want to contribute

If you would like to contribute to the plugin (e.g. by improving the documentation, solving a bug or adding a cool new feature), please carefully review our contribution guide and send us your pull request.

Credits

Credits goes to ChidiebereEdeh as most of this package comes from his implementation.