mqttThenLaunch method
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);
}