buildApplePayConfigurationJson function

String? buildApplePayConfigurationJson({
  1. required CheckoutCustomizationData? customization,
  2. required String currencyCode,
  3. String countryCode = 'AE',
  4. String displayNameFallback = 'Pay',
})

Builds a JSON string for the pay package's Apple Pay PaymentConfiguration.

Uses the checkout customization entry with type: "APPLE_PAY" (normalized), show != 0, and non-empty identifier or merchant_id as merchantIdentifier.

Implementation

String? buildApplePayConfigurationJson({
  required CheckoutCustomizationData? customization,
  required String currencyCode,
  String countryCode = 'AE',
  String displayNameFallback = 'Pay',
}) {
  if (customization == null) return null;

  AvailablePaymentMethod? method;
  const appleKey = 'APPLE_PAY';
  for (final m in customization.availableMethods) {
    if (normalizeCheckoutPaymentMethodType(m.type) !=
        normalizeCheckoutPaymentMethodType(appleKey)) {
      continue;
    }
    if (m.show == 0) continue;
    final merchantIdentifier = m.identifier.trim().isNotEmpty
        ? m.identifier.trim()
        : m.merchantId.trim();
    if (merchantIdentifier.isEmpty) continue;
    method = m;
    break;
  }
  if (method == null) return null;

  final md = customization.merchantDetails;
  final merchantLabel = _nonEmpty(md?.merchantName);
  final companyLabel = _nonEmpty(md?.companyName);
  final displayName = merchantLabel.isNotEmpty
      ? merchantLabel
      : (companyLabel.isNotEmpty ? companyLabel : displayNameFallback);

  final schemeSources = method.schemes.isNotEmpty
      ? method.schemes
      : (md?.supportedCardSchemes ?? const <String>[]);
  final networks = _mapSchemesToAppleNetworks(schemeSources);
  final supportedNetworks = networks.isNotEmpty
      ? networks
      : const ['visa', 'masterCard', 'amex'];

  final cc = currencyCode.trim().toUpperCase();
  final co = countryCode.trim().toUpperCase();
  if (cc.isEmpty || co.isEmpty) return null;

  final json = jsonEncode({
    'provider': 'apple_pay',
    'data': {
      'merchantIdentifier': method.identifier.trim().isNotEmpty
          ? method.identifier.trim()
          : method.merchantId.trim(),
      'displayName': displayName,
      'merchantCapabilities': ['3DS', 'debit', 'credit'],
      'supportedNetworks': supportedNetworks,
      'countryCode': co,
      'currencyCode': cc,
    },
  });

  _logApplePayConfiguration(json);
  return json;
}