payWithCard method
Future<ValueResult<PaymentStatusResponse> >
payWithCard(
- CheckoutRequest request,
- CardPaymentData cardData
Executes the full two-step card payment flow.
Steps:
- CheckoutsService.createCheckout — creates deposit request in the back-end
- Validates that CheckoutResponse.depositRequestId is present
- GatewayService.fetchPublicKey — fetches RSA public key from the gateway
- 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;
}