cardDataForSdkPayment method

CardData cardDataForSdkPayment()

Builds CardData for POST .../sdk/payment from paymentToken and any card-like keys in parameters / customData maps (e.g. payment_token, m_payment_token, card_number, cvv, expiry).

Implementation

CardData cardDataForSdkPayment() {
  final slots = <String, String>{};
  void ingestMap(Map<dynamic, dynamic> m) {
    for (final e in m.entries) {
      final key = e.key.toString().trim().toLowerCase();
      final val = e.value?.toString().trim() ?? '';
      if (key.isNotEmpty && val.isNotEmpty) {
        slots[key] = val;
      }
    }
  }

  for (final p in parameters) {
    if (p is Map) ingestMap(Map<dynamic, dynamic>.from(p));
  }
  for (final p in customData) {
    ingestMap(Map<dynamic, dynamic>.from(p));
  }

  String? pick(List<String> keys) {
    for (final k in keys) {
      final v = slots[k];
      if (v != null && v.isNotEmpty) return v;
    }
    return null;
  }

  final c = customerDetails;
  final reqTok = paymentToken?.trim() ?? '';
  final token =
      pick([
        'payment_token',
        'm_payment_token',
        'pay_token',
        'token',
        'card_token',
      ]) ??
          (reqTok.isNotEmpty ? reqTok : null);

  final cardNumber = pick(['card_number', 'cardnumber', 'pan', 'number']);
  final cvv = pick(['cvv', 'cvc']) ?? '';
  var month = pick(['expiry_month', 'exp_month', 'month']) ?? '';
  var year = pick(['expiry_year', 'exp_year', 'year']) ?? '';
  final expCombined = pick([
    'expiry',
    'expiry_date',
    'card_expiry',
    'expiry_date_iso',
  ]);
  if (month.isEmpty && year.isEmpty && expCombined != null) {
    final parts = expCombined.split(RegExp(r'[/\s.\-]+'));
    if (parts.isNotEmpty) month = parts[0].trim();
    if (parts.length > 1) year = parts[1].trim();
  }

  final holder = pick(['card_holder_name', 'cardholder_name', 'card_holder']);
  final name = (holder != null && holder.isNotEmpty) ? holder : c.name.trim();

  final email = pick(['email', 'card_email']);
  final mobile = pick(['mobile', 'card_mobile']);
  final code = pick(['code', 'country_code', 'dial_code']);
  final brand = pick(['brand', 'card_brand', 'card_network', 'scheme']);
  final lastFour = pick([
    'last_four',
    'last_4',
    'last4',
    'display_last_four',
    'last_four_digits',
  ]);

  return CardData(
    cardNumber: cardNumber,
    cardholderName: name.isEmpty ? '-' : name,
    expiryMonth: month,
    expiryYear: year,
    cvv: cvv,
    email: email ?? (c.email.trim().isEmpty ? null : c.email.trim()),
    mobile: mobile ?? (c.mobile.trim().isEmpty ? null : c.mobile.trim()),
    countryCode: code ?? (c.code.trim().isEmpty ? null : c.code.trim()),
    paymentToken: token,
    brand: brand,
    displayLastFour: lastFour,
  );
}