Skip to main content

flutter_eps 0.0.2 copy "flutter_eps: ^0.0.2" to clipboard
flutter_eps: ^0.0.2 copied to clipboard

Cross-platform EPS payment integration for Flutter (Android, iOS, Desktop, Web coming soon)

example/lib/main.dart

import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_eps/flutter_eps.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    const MaterialApp(debugShowCheckedModeBanner: false, home: EpsExampleApp()),
  );
}

class EpsExampleApp extends StatefulWidget {
  const EpsExampleApp({super.key});
  @override
  State<EpsExampleApp> createState() => _EpsExampleAppState();
}

class _EpsExampleAppState extends State<EpsExampleApp> {
  EpsEnvironment _selectedEnv = EpsEnvironment.testBox;
  String _statusLog = "Ready to pay...";

  int transactionPlatformsTypeId = 0;

  @override
  void initState() {
    super.initState();

    if (kIsWeb) {
      transactionPlatformsTypeId = 1; // Web
    } else if (Platform.isAndroid) {
      transactionPlatformsTypeId = 2; // Android
    } else if (Platform.isIOS) {
      transactionPlatformsTypeId = 3; // iOS
    } else if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
      transactionPlatformsTypeId = 1; // Desktop treated as Web
    }
  }

  // 1. Text Controllers for Live Credentials
  final _userEmailController = TextEditingController();
  final _passwordController = TextEditingController();
  final _hashKeyController = TextEditingController();
  final _merchantIdController = TextEditingController();
  final _storeIdController = TextEditingController();

  // Elegant Colors
  static const Color colorLive = Color(0xFF00802B);
  static const Color colorTest = Color(0xFF455A64);

  Future<void> _initiatePayment() async {
    final String txnId = DateTime.now().millisecondsSinceEpoch.toString();

    // 2. Initialize Config (Uses Controllers for Live, Defaults for Test)
    final initializer = EpsInitialization(
      environment: _selectedEnv,
      userName: _selectedEnv == EpsEnvironment.live
          ? _userEmailController.text
          : 'Epsdemo@gmail.com',
      password: _selectedEnv == EpsEnvironment.live
          ? _passwordController.text
          : 'Epsdemo258@',
      hashKey: _selectedEnv == EpsEnvironment.live
          ? _hashKeyController.text
          : 'FHZxyzeps56789gfhg678ygu876o=',
      merchantId: _selectedEnv == EpsEnvironment.live
          ? _merchantIdController.text
          : "29e86e70-0ac6-45eb-ba04-9fcb0aaed12a",
      storeId: _selectedEnv == EpsEnvironment.live
          ? _storeIdController.text
          : "d44e705f-9e3a-41de-98b1-1674631637da",
    );

    final eps = EpsController(initializer: initializer);
    final request = EpsPaymentRequest(
      merchantId: initializer.merchantId,
      transactionTypeId: transactionPlatformsTypeId,
      storeId: initializer.storeId,
      customerOrderId: "ORD-$txnId",
      merchantTransactionId: txnId,
      totalAmount: 5.0,
      successUrl: "https://example.com/success",
      failUrl: "https://example.com/fail",
      cancelUrl: "https://example.com/cancel",
      customerName: "Roman Hossen",
      customerEmail: "example@gmail.com",
      customerAddress: "Dhaka",
      customerCity: "Dhaka",
      customerPostcode: "1212",
      customerCountry: "BD",
      customerPhone: "01777777777",
      productName: "Demo Product",
    );

    setState(() => _statusLog = "Initializing...");
    final response = await eps.initializePayment(request);

    if (response['RedirectURL'] != null) {
      if (!mounted) return;
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (_) => EpsWebView(
            url: response['RedirectURL'],
            onPaymentFinished: (status) async {
              if (status == 'SUCCESS') {
                final verifyRes = await eps.verifyTransaction(txnId);
                setState(
                  () =>
                      _statusLog = "SUCCESS: ${verifyRes['EpsTransactionId']}",
                );
              } else {
                setState(() => _statusLog = "Payment $status");
              }
            },
          ),
        ),
      );
    } else {
      setState(() => _statusLog = "Error: ${response['ErrorMessage']}");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("EPS Gateway Configuration"),
        centerTitle: true,
      ),
      body: SingleChildScrollView(
        // Allow scrolling when keyboard appears
        padding: const EdgeInsets.all(24.0),
        child: Column(
          children: [
            Container(
              padding: const EdgeInsets.all(4),
              decoration: BoxDecoration(
                color: Colors.grey.shade200,
                borderRadius: BorderRadius.circular(12),
              ),
              child: Row(
                children: [
                  _buildEnvButton("Test Mode", EpsEnvironment.testBox),
                  _buildEnvButton("Live Mode", EpsEnvironment.live),
                ],
              ),
            ),
            const SizedBox(height: 20),

            // 3. Conditional Input Fields for Live Mode
            if (_selectedEnv == EpsEnvironment.live ) ...[
              const Text(
                "Edit Live Credentials",
                style: TextStyle(fontWeight: FontWeight.bold, color: colorLive),
              ),
              const SizedBox(height: 15),
              _buildTextField(_userEmailController, "User Email / Name"),
              _buildTextField(_passwordController, "Password", isObscure: true),
              _buildTextField(_hashKeyController, "Hash Key"),
              _buildTextField(_merchantIdController, "Merchant ID"),
              _buildTextField(_storeIdController, "Store ID"),
            ] else ...[
              const SizedBox(height: 40),
              const Icon(Icons.science_outlined, size: 60, color: colorTest),
              const Text("Running on Sandbox Environment"),
              const Text(
                "Using Epsdemo@gmail.com",
                style: TextStyle(color: Colors.grey),
              ),
            ],

            const SizedBox(height: 30),
            Text(
              _statusLog,
              style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
            ),
            const SizedBox(height: 30),

            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                onPressed: _initiatePayment,
                style: ElevatedButton.styleFrom(
                  backgroundColor: _selectedEnv == EpsEnvironment.live
                      ? colorLive
                      : colorTest,
                  padding: const EdgeInsets.symmetric(vertical: 16),
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(8),
                  ),
                ),
                child: Text(
                  "PAY WITH ${_selectedEnv.name}",
                  style: const TextStyle(color: Colors.white),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  // 4. Helper Widget for TextFields
  Widget _buildTextField(
    TextEditingController controller,
    String label, {
    bool isObscure = false,
  }) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 12),
      child: TextField(
        controller: controller,
        obscureText: isObscure,
        decoration: InputDecoration(
          labelText: label,
          border: const OutlineInputBorder(),
          contentPadding: const EdgeInsets.symmetric(
            horizontal: 12,
            vertical: 8,
          ),
        ),
      ),
    );
  }

  Widget _buildEnvButton(String label, EpsEnvironment env) {
    bool isSelected = _selectedEnv == env;
    return Expanded(
      child: GestureDetector(
        onTap: () => setState(() => _selectedEnv = env),
        child: AnimatedContainer(
          duration: const Duration(milliseconds: 200),
          padding: const EdgeInsets.symmetric(vertical: 12),
          decoration: BoxDecoration(
            color: isSelected
                ? (env == EpsEnvironment.live  ? colorLive : colorTest)
                : Colors.transparent,
            borderRadius: BorderRadius.circular(10),
          ),
          child: Center(
            child: Text(
              label,
              style: TextStyle(
                color: isSelected ? Colors.white : Colors.black54,
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        ),
      ),
    );
  }
}
1
likes
130
points
39
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Cross-platform EPS payment integration for Flutter (Android, iOS, Desktop, Web coming soon)

License

unknown (license)

Dependencies

crypto, flutter, http, webview_flutter, webview_win_floating

More

Packages that depend on flutter_eps