requestPayment static method
Initiates a payment request with the provided details.
amount: The transaction amount as a string (e.g., "100.00").accountNo: The mobile account number associated with the payment.email: The email address of the customer initiating the payment.
Throws an exception if required credentials or keys are not initialized, or if the API request fails or the response signature is invalid.
Returns an ApiResponse object containing the API response data.
Implementation
static Future<ApiResponse> requestPayment({
required String amount,
required String accountNo,
required String email,
}) async {
_validateCredentialsAndKeys();
// Create a PaymentRequest object
final requestBody = PaymentRequest(
orderId: DateTime.now().millisecondsSinceEpoch.toString(),
storeId: EasypaisaWithRSA.storeId!,
transactionAmount: amount,
transactionType: 'MA', // MA stands for Mobile Account
mobileAccountNo: accountNo,
emailAddress: email,
);
// Prepare the API request
final url =
'${EasypaisaWithRSA.isSandbox ? _sandboxUrl : _liveUrl}/initiate-ma-transaction';
final requestJson = jsonEncode(requestBody.toJson());
final signature =
RSAUtils.signData(requestJson, EasypaisaWithRSA.privateKeyPem!);
final jsonPayload = {
'request': requestBody.toJson(),
'signature': signature,
};
// Send the API request
final response = await http.post(
Uri.parse(url),
headers: _buildHeaders(),
body: jsonEncode(jsonPayload),
);
_validateResponse(response);
// Parse and verify the API response
final apiResponseJson = jsonDecode(response.body);
final isSignatureValid = RSAUtils.verifySignature(
jsonEncode(apiResponseJson['response']),
apiResponseJson['signature'],
EasypaisaWithRSA.publicKeyPem!,
);
final apiResponse = ApiResponse.fromJson(apiResponseJson, isSignatureValid);
if (!apiResponse.isSignatureValid) {
throw Exception('Invalid response signature.');
}
return apiResponse;
}