startAuthorization method

Future<void> startAuthorization({
  1. required String customerId,
  2. required dynamic onLinkingSuccessful(
    1. Map data
    ),
  3. required dynamic onLinkingFailed(
    1. Map error
    ),
})

Initiates the Amazon Pay account linking flow.

customerId — Razorpay customer ID (e.g. 'cust_xxx') onLinkingSuccessful — called when linking succeeds onLinkingFailed — called when linking fails

Implementation

Future<void> startAuthorization({
  required String customerId,
  required Function(Map<dynamic, dynamic> data) onLinkingSuccessful,
  required Function(Map<dynamic, dynamic> error) onLinkingFailed,
}) async {
  try {
    final result = await _channel.invokeMethod(
      'amazonPayStartAuthorization',
      {'customerId': customerId},
    );

    if (result != null && result is Map) {
      final resultMap = Map<dynamic, dynamic>.from(result);
      if (resultMap['type'] == 'success') {
        final data = resultMap['data'] != null
            ? Map<dynamic, dynamic>.from(resultMap['data'] as Map)
            : <dynamic, dynamic>{};
        onLinkingSuccessful(data);
        _eventEmitter.emit(EVENT_LINKING_SUCCESS, null, data);
      } else {
        final error = resultMap['data'] != null
            ? Map<dynamic, dynamic>.from(resultMap['data'] as Map)
            : <dynamic, dynamic>{'message': 'Unknown error'};
        onLinkingFailed(error);
        _eventEmitter.emit(EVENT_LINKING_ERROR, null, error);
      }
    } else {
      // Native returned null or an unexpected type — always fire onLinkingFailed
      // so the merchant is never left waiting with no feedback.
      final error = <dynamic, dynamic>{
        'code': -1,
        'message': 'Unexpected response from native layer: $result',
      };
      onLinkingFailed(error);
      _eventEmitter.emit(EVENT_LINKING_ERROR, null, error);
    }
  } on PlatformException catch (e) {
    final error = <dynamic, dynamic>{
      'code': e.code,
      'message': e.message ?? 'Platform error during Amazon Pay linking',
    };
    onLinkingFailed(error);
    _eventEmitter.emit(EVENT_LINKING_ERROR, null, error);
  }
}