mqttThenLaunch method

Future<void> mqttThenLaunch(
  1. Merchant merchant,
  2. Payment payment,
  3. Urls urls,
  4. String checkoutUrl,
)

Implementation

Future<void> mqttThenLaunch(
    Merchant merchant, Payment payment, Urls urls, String checkoutUrl) async {

  // ✅ WSS only — no TCP
  final wsUrl = 'wss://${urls.mqttBaseUrl}';
  final client = MqttServerClient.withPort(wsUrl, '', urls.mqttPort);
  client.useWebSocket = true;
  client.websocketProtocols = MqttClientConstants.protocolsSingleDefault;
  client.secure = false;
  client.onBadCertificate = (dynamic certificate) => true;

  client.keepAlivePeriod = 10;
  client.logging(on: true);
  client.onDisconnected = _onDisconnected;
  client.onSubscribed = _onSubscribed;

  final connMess = MqttConnectMessage()
      .withClientIdentifier(
      DateTime.now().millisecondsSinceEpoch.toString())
      .startClean()
      .withWillTopic('willTopic')
      .withWillMessage('client disconnected')
      .withWillQos(MqttQos.exactlyOnce);
  client.connectionMessage = connMess;

  try {
    await client.connect();
    print('MQTT::CONNECTED');
  } on Exception catch (e) {
    print('MQTT::client exception - $e');
    client.disconnect();
    throw e;
  }

  if (client.connectionStatus!.state != MqttConnectionState.connected) {
    print('MQTT::ERROR connection failed, state is ${client.connectionStatus!.state}');
    client.disconnect();
    throw 'Could not connect to mqtt client';
  }

  final transactionTopic =
      'merchant_portal/${merchant.merchantId}/${payment.transactionReference}';
  client.subscribe(transactionTopic, MqttQos.atMostOnce);

  client.updates!.listen((List<MqttReceivedMessage<MqttMessage>> msgs) {
    print('MQTT: MESSAGE RECEIVED');
    final MqttPublishMessage receivedMsg =
    msgs[0].payload as MqttPublishMessage;
    final String payload =
    MqttPublishPayload.bytesToStringAsString(receivedMsg.payload.message);

    print('MQTT PAYLOAD:: $payload');

    Map<String, dynamic> mqttPayload = json.decode(payload);

    Future.microtask(() => client.disconnect());

    if (mqttPayload['responseCode'] == '00' ||
        mqttPayload['responseCode'] == '0') {
      transactionSuccessfullCallback(mqttPayload);
    } else {
      transactionFailureCallback(mqttPayload);
    }
  });

  await launchWebView(checkoutUrl, context);
}