payWithAgreement method

Future<BkashPaymentResponse> payWithAgreement({
  1. required BuildContext context,
  2. required double amount,
  3. required String agreementId,
  4. required String marchentInvoiceNumber,
})

Call this Fucntion to Pay with AgreementId

Throws BkashFailure for error with a user-friendly message

Implementation

Future<BkashPaymentResponse> payWithAgreement({
  required BuildContext context,
  required double amount,
  required String agreementId,
  required String marchentInvoiceNumber,
}) async {
  await _validateToken();

  final paymentResponse = await _token?.fold<Future<BkashPaymentResponse>>(
    (l) async => throw l,
    (tokenRes) async {
      final apiResponse = await _bkashApi.payWithAgreement(
        idToken: tokenRes.idToken,
        agreementId: agreementId,
        amount: amount.toString(),
        merchantInvoiceNumber: marchentInvoiceNumber,
      );

      return await apiResponse.fold<Future<BkashPaymentResponse>>(
        (l) async => throw l,
        (apiRes) async {
          if (apiRes.statusCode != "0000") {
            throw BkashFailure(message: apiRes.statusMessage);
          }

          final bkashPaymentStatus = await Navigator.push<BkashPaymentStatus>(
                context,
                MaterialPageRoute(
                  builder: (context) => FlutterBkashView(
                    bkashURL: apiRes.bkashURL,
                    failureCallbackURL: apiRes.failureCallbackURL,
                    successCallbackURL: apiRes.successCallbackURL,
                    cancelledCallbackURL: apiRes.cancelledCallbackURL,
                  ),
                ),
              ) ??
              BkashPaymentStatus.canceled;

          if (bkashPaymentStatus == BkashPaymentStatus.successed) {
            final result = await _bkashApi.executePayWithAgreement(
              paymentId: apiRes.paymentID,
              idToken: tokenRes.idToken,
            );

            return result.fold<BkashPaymentResponse>(
              (l) => throw l,
              (r) {
                // failed to execute
                if (r.statusCode != "0000") {
                  throw BkashFailure(message: r.statusMessage);
                }
                return BkashPaymentResponse(
                  r.paymentExecuteTime,
                  trxId: r.trxID,
                  payerReference: r.payerReference,
                  paymentId: r.paymentID,
                  customerMsisdn: r.customerMsisdn,
                  merchantInvoiceNumber: r.merchantInvoiceNumber,
                );
              },
            );
          }
          if (bkashPaymentStatus == BkashPaymentStatus.canceled) {
            throw BkashFailure(message: "Payment Cancelled");
          }
          throw BkashFailure();
        },
      );
    },
  );

  if (paymentResponse == null) {
    throw BkashFailure();
  }
  return paymentResponse;
}