flutter_eps 0.0.1
flutter_eps: ^0.0.1 copied to clipboard
A complete and elegant Flutter SDK for the Easy Payment System (EPS) gateway. Supports Sandbox/Live modes and integrated WebView.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_eps/flutter_eps.dart';
void main() => 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...";
// 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(0xFF1A237E);
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,
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)),
),
),
),
);
}
}