Control Center Management Panel
Manage, toggle, and approve client subscriptions across multiple host domains
Complete record of admin actions, payment approvals, status toggles, and security logs.
List of subscription payment receipts submitted by clients. Verify transaction ID and approve requests.
| Client Name | Plan Type | Amount | Transaction ID | Receipt Screenshot | Status | Actions |
|---|
You can upload multiple QR profiles. The QR code marked as Active will be displayed along with its UPI ID on the client suspension screen.
તમારા ક્લાયન્ટ પેનલના AI ડેવલપરને આ પેજ અને કોડ સેમ્પલ્સ આપીને ઓટોમેટિક ઇન્ટિગ્રેશન કરાવો.
સુપર એડમિન પેનલ જ્યારે સ્ટેટસ ઓન/ઓફ કરે છે, ત્યારે ક્લાયન્ટના રજીસ્ટર્ડ વેબહૂક URL પર HMAC-SHA256 થી સુરક્ષિત POST રિક્વેસ્ટ મોકલે છે. ક્લાયન્ટ પેનલે સિગ્નેચર વેરીફાઈ કરીને પોતાના સ્ટેટસને અપડેટ કરવાનું રહેશે.
ક્લાયન્ટ સર્વરમાં નીચે મુજબનો વેરીએબલ સેટ કરો:
SUPERADMIN_SHARED_SECRET=your_client_webhook_secret_key_here
ક્લાયન્ટ સર્વરમાં વેબહૂક મેળવીને સિગ્નેચર ચકાસવા માટેનો એન્ડપોઇન્ટ કોડ:
const crypto = require('crypto');
app.post('/api/superadmin/status', (req, res) => {
const incomingSignature = req.headers['x-superadmin-signature'];
const payloadString = JSON.stringify(req.body);
const secretKey = process.env.SUPERADMIN_SHARED_SECRET;
if (!incomingSignature) {
return res.status(401).json({ error: 'Missing signature' });
}
// HMAC-SHA256 સિગ્નેચર ગણતરી કરો
const computedSignature = crypto
.createHmac('sha256', secretKey)
.update(payloadString)
.digest('hex');
// સિગ્નેચર સરખાવો
if (incomingSignature !== computedSignature) {
return res.status(401).json({ error: 'Signature verification failed' });
}
// લોકલ ડેટાબેઝ/કન્ફીગમાં સ્ટેટસ સેવ કરો
const { is_active } = req.body;
updateLocalSystemStatus(is_active);
res.json({ success: true, message: `Local status set to: ${is_active}` });
});
જ્યારે સિસ્ટમ સસ્પેન્ડ (inactive) હોય, ત્યારે યુઝરની તમામ એપીઆઈ રિક્વેસ્ટો બ્લોક કરવા માટેનું મિડલવેર:
function systemGuardMiddleware(req, res, next) {
const isSystemActive = checkLocalStatusFromDB(); // DB કેશમાંથી વાંચો
if (req.path.startsWith('/api/superadmin')) {
return next(); // વેબહૂક બાયપાસ કરો
}
if (!isSystemActive) {
if (req.xhr || req.headers.accept.includes('json')) {
return res.status(403).json({
error: 'system_suspended',
message: 'This application panel is suspended by Admin.'
});
}
return res.redirect('/suspended.html');
}
next();
}
જો ફ્રન્ટએન્ડમાં Flutter નો ઉપયોગ થતો હોય, તો Dio HTTP client માં Interceptor સેટ કરો જેથી 403 (system_suspended) રિસ્પોન્સ મળતાં જ યુઝર લૉગઆઉટ થઈ સસ્પેન્ડ સ્ક્રીન પર પહોંચી જાય:
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
class SystemStatusInterceptor extends Interceptor {
final GlobalKey navigatorKey;
SystemStatusInterceptor(this.navigatorKey);
@override
void onError(DioException err, ErrorInterceptorHandler handler) {
if (err.response?.statusCode == 403) {
final errorBody = err.response?.data;
if (errorBody != null && errorBody['error'] == 'system_suspended') {
// ૧. લોકલ યુઝર સેશન ક્લિયર કરો (Tokens, Preferences)
logoutUserLocally();
// ૨. સસ્પેન્ડ સ્ક્રીન પર મોકલી આપો
navigatorKey.currentState?.pushNamedAndRemoveUntil('/suspended', (route) => false);
}
}
super.onError(err, handler);
}
}
જ્યારે ક્લાયન્ટ યુઝર સસ્પેન્ડ પેજ પર હોય ત્યારે કસ્ટમ ક્યૂઆર કોડ જનરેટ કરવા માટેની રીત અને પેમેન્ટ રિક્વેસ્ટ મોકલવા માટેનો એપીઆઈ કોડ:
// ૧. સુપર એડમિન એપીઆઈ (my-status) માંથી એક્ટિવ ક્યૂઆર અને UPI ડેટા મેળવો
const method = statusResponse.active_payment_method;
if (method && method.qr_image_data) {
// એડમિને સુપર એડમિન પેનલ પર જે ક્યૂઆર ઈમેજ (Base64) એક્ટિવ રાખ્યો હોય તેને ડાયરેક્ટ શો કરો
document.getElementById('payment-qr-img').src = method.qr_image_data;
document.getElementById('payment-upi-text').textContent = `UPI ID: ${method.upi_id}`;
} else {
// જો કોઈ ક્યૂઆર એક્ટિવ ન સેટ કરેલો હોય
document.getElementById('payment-qr-img').style.display = 'none';
document.getElementById('payment-upi-text').textContent = 'પેમેન્ટ QR સેટ કરેલ નથી. કૃપા કરીને એડમિનનો સંપર્ક કરો.';
}
// યુઝરે પેમેન્ટ કર્યા બાદ આ પેલોડ સુપર એડમિન સર્વરને POST કરો:
// Endpoint: http://192.168.29.14:5000/api/fund-requests
const payload = {
client_id: "your_registered_client_uuid", // સુપર એડમિન તરફથી મળેલો ક્લાયન્ટ ID
amount: 1500, // ભરેલી રકમ
transaction_id: "TXN129381029", // યુનિક ટ્રાન્ઝેક્શન નંબર (UTR)
receipt_url: "https://example.com/receipt.jpg", // અપલોડ કરેલો સ્ક્રીનશોટ ફોટો
plan_type: "monthly" // 'monthly', 'half_yearly' અથવા 'yearly'
};
fetch('http://192.168.29.14:5000/api/fund-requests', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
})
.then(res => res.json())
.then(data => console.log('Fund request submitted:', data))
.catch(err => console.error('Failed to submit request:', err));
ક્લાયન્ટ પેનલે પોતાના સર્વર અથવા ફ્રન્ટએન્ડ પરથી સુપર એડમિન પેનલના આ એન્ડપોઇન્ટ દ્વારા સિસ્ટમ સ્ટેટસ અને એક્ટિવ ક્યૂઆર કોડની માહિતી મેળવવાની રહેશે:
// Endpoint: http://192.168.29.14:5000/api/clients/my-status
// Headers required: X-Client-Identifier (તમારો Client UUID) અથવા X-Client-Domain (ક્લાયન્ટ ડોમેન)
fetch('http://192.168.29.14:5000/api/clients/my-status', {
method: 'GET',
headers: {
'X-Client-Identifier': 'your_registered_client_uuid'
}
})
.then(res => res.json())
.then(data => {
console.log("Client Status info:", data);
/*
Response Output Format:
{
"client_id": "294f29f9-8dfb-4b38-a452-ab2478593ad2",
"name": "Payverse",
"domain": "http://192.168.29.112:3000/",
"is_active": false,
"expires_at": "2026-10-25T14:07:21.962Z",
"grace_days": 3,
"monthly_fee": 5,
"half_yearly_fee": 25,
"yearly_fee": 50,
"active_payment_method": {
"name": "GPay Business QR",
"upi_id": "jigs.vanani-2@okhdfcbank",
"qr_image_data": "data:image/png;base64,iVBORw0KGgoAAA..."
}
}
*/
})
.catch(err => console.error("Error fetching client status:", err));
જો ક્લાયન્ટ ફ્રન્ટએન્ડ React/TypeScript માં હોય, તો ઓટોમેટિક સ્ટેટસ વેરીફીકેશન અને સસ્પેન્ડ પેજ રીડાયરેક્શન માટે આ કસ્ટમ હૂકનો ઉપયોગ કરો:
import { useEffect, useState } from 'react';
export function useSystemStatus(clientId: string) {
const [isActive, setIsActive] = useState(true);
const [paymentMethod, setPaymentMethod] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function checkStatus() {
try {
const response = await fetch('http://192.168.29.14:5000/api/clients/my-status', {
headers: { 'X-Client-Identifier': clientId }
});
const data = await response.json();
if (response.ok) {
setIsActive(data.is_active);
setPaymentMethod(data.active_payment_method);
}
} catch (err) {
console.error("System check failed", err);
} finally {
setLoading(false);
}
}
checkStatus();
// 5 મિનિટે ઓટોમેટિક ક્રોન પોલિંગ
const interval = setInterval(checkStatus, 5 * 60 * 1000);
return () => clearInterval(interval);
}, [clientId]);
return { isActive, paymentMethod, loading };
}
ફ્લટર એપમાં સસ્પેન્ડ સ્ટેટસ અને પેમેન્ટ વિગતો ચેક કરવા માટેની ડાર્ટ સર્વિસ ક્લાસ સેમ્પલ:
import 'package:dio/dio.dart';
class SuperAdminService {
final Dio _dio = Dio();
final String superAdminUrl = "http://192.168.29.14:5000/api/clients/my-status";
final String clientId = "your_registered_client_uuid";
Future
જો ક્લાયન્ટનું સર્વર ક્યારેક ડાઉન હોય અને સુપર એડમિન પરથી તેને ઓન/ઓફ કરવામાં આવ્યું હોય, તો ડેટા મિસ ન થાય તે માટે ક્લાયન્ટ બેકએન્ડે દરેક બૂટઅપ (Startup) સમયે અથવા ક્રોન જોબ દ્વારા સુપર એડમિનના ડેટા સાથે સિંક રહેવું.
Monthly verified payment collections
Revenue by subscription tier
Schedule of client subscription expirations and upcoming renewal fee collections.
100% Free self-hosted linking using your mobile number
Your WhatsApp is successfully connected. Client reminders and payment notifications will be automatically sent from this number.
Send a test message to any mobile number to verify that the automated connection is working.
WhatsApp alerts will be dispatched to all these admin numbers whenever a client submits a payment request. Separate with commas.