import 'package:flutter/material.dart';
import 'package:hubtel_merchant_checkout_sdk/hubtel_merchant_checkout_sdk.dart';
import 'package:uuid/uuid.dart';
class PaymentPage extends StatelessWidget {
const PaymentPage({Key? key}) : super(key: key);
Future<void> initiateCheckout(BuildContext context) async {
// Create configuration
final hubtelConfig = HubtelCheckoutConfiguration(
merchantApiKey: "YOUR_BASE64_ENCODED_API_KEY",
merchantID: "YOUR_MERCHANT_ID",
callbackUrl: "https://your-callback-url.com",
);
// Create purchase info
final purchaseInfo = PurchaseInfo(
amount: 50.0,
customerPhoneNumber: '0541234567',
clientReference: const Uuid().v4(),
purchaseDescription: 'Product Purchase',
);
// Navigate to checkout and await result
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CheckoutScreen(
purchaseInfo: purchaseInfo,
configuration: hubtelConfig,
themeConfig: ThemeConfig(primaryColor: Colors.teal),
),
),
);
// Handle the result
if (result is CheckoutCompletionStatus) {
handleCheckoutCompletion(context, result);
}
}
void handleCheckoutCompletion(
BuildContext context,
CheckoutCompletionStatus status,
) {
switch (status.status) {
case UnifiedCheckoutPaymentStatus.paymentSuccess:
showSuccessDialog(
context,
transactionId: status.transactionId,
channel: status.paymentChannel,
);
break;
case UnifiedCheckoutPaymentStatus.paymentFailed:
showFailureDialog(
context,
transactionId: status.transactionId,
);
break;
case UnifiedCheckoutPaymentStatus.pending:
showPendingDialog(
context,
transactionId: status.transactionId,
);
break;
case UnifiedCheckoutPaymentStatus.userCancelledPayment:
showCancelledDialog(context);
break;
case UnifiedCheckoutPaymentStatus.unknown:
showUnknownStatusDialog(
context,
transactionId: status.transactionId,
);
break;
}
}
void showSuccessDialog(
BuildContext context, {
required String transactionId,
String? channel,
}) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Payment Successful'),
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Transaction ID: $transactionId'),
if (channel != null) Text('Payment Channel: $channel'),
],
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('OK'),
),
],
),
);
}
void showFailureDialog(BuildContext context, {required String transactionId}) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Payment Failed'),
content: Text(
'Your payment could not be completed. '
'Transaction ID: $transactionId',
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('OK'),
),
],
),
);
}
void showPendingDialog(BuildContext context, {required String transactionId}) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Payment Pending'),
content: Text(
'Your payment is being processed. '
'Transaction ID: $transactionId',
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('OK'),
),
],
),
);
}
void showCancelledDialog(BuildContext context) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Payment Cancelled'),
content: const Text('You cancelled the payment.'),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('OK'),
),
],
),
);
}
void showUnknownStatusDialog(
BuildContext context,
{required String transactionId},
) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Status Unknown'),
content: Text(
'Payment status could not be determined. '
'Please verify with transaction ID: $transactionId',
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('OK'),
),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Payment')),
body: Center(
child: ElevatedButton(
onPressed: () => initiateCheckout(context),
child: const Text('Pay Now'),
),
),
);
}
}