requestPayment static method

Future<ApiResponse> requestPayment({
  1. required String amount,
  2. required String accountNo,
  3. required String email,
})

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;
}