payWithCard method

Executes the full two-step card payment flow.

Steps:

  1. CheckoutsService.createCheckout — creates deposit request in the back-end
  2. Validates that CheckoutResponse.depositRequestId is present
  3. GatewayService.fetchPublicKey — fetches RSA public key from the gateway
  4. GatewayService.payWithEncryptedCard — encrypts card data and submits payment

Returns ValueResult.failure with a contextual message if any step fails.

Implementation

Future<ValueResult<PaymentStatusResponse>> payWithCard(
  CheckoutRequest request,
  CardPaymentData cardData,
) async {
  // Step 1: create checkout
  final checkoutResult = await _checkoutService.createCheckout(request);
  if (checkoutResult.isError) {
    return ValueResult.failure(
      '[checkout] ${checkoutResult.error}',
      title: checkoutResult.title,
    );
  }

  final checkoutResponse = checkoutResult.value!;

  // Step 2: validate depositRequestId
  if (checkoutResponse.depositRequestId == null ||
      checkoutResponse.depositRequestId!.isEmpty) {
    return ValueResult.failure('Cart payment not available');
  }

  // Step 3: fetch public key
  final keyResult = await _gatewayService.fetchPublicKey();
  if (keyResult.isError) {
    return ValueResult.failure(
      '[fetchPublicKey] ${keyResult.error}',
      title: keyResult.title,
    );
  }

  final publicKey = keyResult.value!;

  // Step 4: encrypt and pay
  final payResult = await _gatewayService.payWithEncryptedCard(
    checkoutResponse.depositRequestId!,
    cardData,
    publicKey.pemPublicKey,
    publicKey.keyId,
  );
  if (payResult.isError) {
    return ValueResult.failure(
      '[payWithEncryptedCard] ${payResult.error}',
      title: payResult.title,
    );
  }

  return payResult;
}