#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT broker
const char* mqtt_server = "test.mosquitto.org";
WiFiClient espClient;
PubSubClient client(espClient);
// JSON Database
StaticJsonDocument<300> db;
void setupDatabase() {
db["users"][0]["name"] = "Deepak";
db["users"][0]["debit_card"] = "1234567890123456";
db["users"][0]["credit_card"] = "9876543210987654";
db["users"][0]["upi"] = "deepak@upi";
db["users"][0]["balance"] = 5000;
}
// Callback when message received
void callback(char* topic, byte* payload, unsigned int length) {
StaticJsonDocument<200> doc;
deserializeJson(doc, payload);
const char* name = doc["name"];
const char* method = doc["method"];
int amount = doc["amount"];
Serial.println("\n--- Payment Request Received ---");
Serial.print("Name: "); Serial.println(name);
Serial.print("Method: "); Serial.println(method);
Serial.print("Amount: "); Serial.println(amount);
const char* db_name = db["users"][0]["name"];
int balance = db["users"][0]["balance"];
// Validation
if (strcmp(name, db_name) == 0 && amount <= balance) {
Serial.println("Payment SUCCESS ✅");
// Deduct balance
db["users"][0]["balance"] = balance - amount;
Serial.print("Remaining Balance: ");
Serial.println((int)db["users"][0]["balance"]);
} else {
Serial.println("Payment FAILED ❌");
}
}
// MQTT reconnect
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Subscriber")) {
Serial.println("Connected!");
client.subscribe("payment/request");
} else {
Serial.println("Retrying...");
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
delay(2000); // important for serial
Serial.println("Starting Subscriber...");
// WiFi connection
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
setupDatabase();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}