mansuriamaan803/SANJEEVFFSTORE_botPublic · Bot Template

AIThis bot is a commerce platform for selling digital products, primarily focused on FreeFire accounts and related services. It provides admin tools for managing products, categories, stock, reseller roles, and a balance system for user payments. Users can browse products, apply coupons, and check their balance through an interactive interface with premium emojis and inline keyboards.

Commercecommercestoreproductsresellerbalancecoupon
ProfileTelegram
102 commands0 envUpdated 12d agoCreated Aug 26, 2026
Back to folder

commands/_onBuyCheck.js

javascript · 397 lines

Raw
1/**#command2name: /onBuyCheck3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12try {13  var userId = user.telegramid;14 15  // ✅ CRITICAL FIX: Proper atomic duplicate-payment prevention16  var utrFromContent = null;17  18  // Parse content to get UTR early19  if (content) {20    var res = (typeof content === "object") ? content : JSON.parse(content);21    if (res && res.data && res.data.utr) {22      utrFromContent = res.data.utr;23    }24  }25 26  // 🛑 STEP 1: Check if payment already processed using UTR (most reliable identifier)27  if (utrFromContent && Bot.getProperty("paid_" + utrFromContent)) {28    // ✅ FIX: Vanish the QR completely instead of leaving a stale "already used" caption behind29    try {30      Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message.message_id });31    } catch (e) {}32 33    try {34      Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");35      User.setProperty("buy_qr_msg_id_" + userId, null, "string");36    } catch (e) {}37 38    if (request && request.id) {39      try {40        Api.answerCallbackQuery({41          callback_query_id: String(request.id),42          text: "✅ ALREADY CLAIMED ✅\nYe order pehle hi deliver ho chuka hai.",43          show_alert: true44        });45      } catch (e) {}46    }47 48    Api.sendMessage({49      chat_id: chat.chatid,50      text: "<blockquote><tg-emoji emoji-id='5330237710655306682'>✅</tg-emoji> <b>ORDER ALREADY CLAIMED</b>\n<i>Ye payment pehle hi verify ho kar item deliver ho chuka hai. Apni keys 'All History' me check karein.</i></blockquote>",51      parse_mode: "HTML",52      reply_markup: JSON.stringify({53        inline_keyboard: [[54          { text: "📜 My Keys", callback_data: "/mykey", style: "primary" },55          { text: "🛒 Shop Menu", callback_data: "/buy_hack", style: "success" }56        ]]57      })58    });59    return;60  }61 62  // 🛑 STEP 2: Duplicate-click lock check63  var isChecking = User.getProperty("buy_verifying_lock_" + userId);64  if (isChecking) {65    if (request && request.id) {66      Api.answerCallbackQuery({67        callback_query_id: String(request.id),68        text: "⏳ ALREADY CHECKING — PLEASE WAIT...",69        show_alert: true70      });71    }72    return;73  }74  75  // 🛑 STEP 3: SET LOCK IMMEDIATELY before any async operations76  User.setProperty("buy_verifying_lock_" + userId, true, "boolean");77 78  if (!content) {79    Api.editMessageCaption({80      chat_id: chat.chatid, message_id: request.message.message_id,81      caption: "<blockquote>⚠️ <b>Server didn't respond.</b>\nClick 'I have paid' again.</blockquote>", parse_mode: "HTML"82    });83    User.setProperty("buy_verifying_lock_" + userId, false, "boolean");84    return;85  }86 87  var res = (typeof content === "object") ? content : JSON.parse(content);88 89  if (res.status === "success" && res.data) {90    var utr = res.data.utr;91    var isPaid = Bot.getProperty("paid_" + utr);92 93    if (isPaid) {94      // ✅ FIX: Vanish the QR completely instead of leaving a stale "already used" caption behind95      try {96        Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message.message_id });97      } catch (e) {}98 99      try {100        Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");101        User.setProperty("buy_qr_msg_id_" + userId, null, "string");102      } catch (e) {}103 104      if (request && request.id) {105        try {106          Api.answerCallbackQuery({107            callback_query_id: String(request.id),108            text: "✅ ALREADY CLAIMED ✅\nYe order pehle hi deliver ho chuka hai.",109            show_alert: true110          });111        } catch (e) {}112      }113 114      Api.sendMessage({115        chat_id: chat.chatid,116        text: "<blockquote><tg-emoji emoji-id='5330237710655306682'>✅</tg-emoji> <b>ORDER ALREADY CLAIMED</b>\n<i>Ye payment pehle hi verify ho kar item deliver ho chuka hai. Apni keys 'All History' me check karein.</i></blockquote>",117        parse_mode: "HTML",118        reply_markup: JSON.stringify({119          inline_keyboard: [[120            { text: "📜 My Keys", callback_data: "/mykey", style: "primary" },121            { text: "🛒 Shop Menu", callback_data: "/buy_hack", style: "success" }122          ]]123        })124      });125      User.setProperty("buy_verifying_lock_" + userId, false, "boolean");126      return;127    }128    129    // ✅ IMMEDIATELY mark as paid BEFORE any async API calls to prevent race condition130    Bot.setProperty("paid_" + utr, true, "boolean");131 132    Api.editMessageCaption({133      chat_id: chat.chatid, message_id: request.message.message_id,134      caption: "<tg-emoji emoji-id='6192822213486321961'>🔄</tg-emoji> <b>Payment verified! Delivering your key...</b>",135      parse_mode: "HTML"136    });137 138    // ✅ FIX: Detect which purchase pipeline this QR payment belongs to.139    // "ffid" = local stock-based FF ID item (set by /execute_id_buy on low balance)140    // default/"plan" = original plan-based product via external xyzcheats API141    var flowType = User.getProperty("buy_flow_type") || "plan";142 143    if (flowType === "ffid") {144      // =========================================================145      // 🎮 FF ID STOCK DELIVERY (after successful QR payment)146      // =========================================================147      try {148        var rawType = User.getProperty("buy_ffid_rawtype") || "";149        var isResellerFlow = User.getProperty("buy_ffid_is_reseller") === true;150        var finalCost = Number(User.getProperty("buy_price") || 0);151        var displayTypeName = User.getProperty("buy_prod_name") || rawType;152 153        var stockData = [];154        var isDynamicCategory = false;155        var isGeneralCategory = false;156        var selectedCat = null;157 158        var fbCategories = Bot.getProperty("fb_categories") || [];159        if (!Array.isArray(fbCategories)) { fbCategories = []; }160 161        if (rawType.indexOf("fb_") === 0) {162          isDynamicCategory = true;163          var targetCatId = rawType.replace("fb_", "").trim();164          for (var i = 0; i < fbCategories.length; i++) {165            if (fbCategories[i].id === targetCatId) { selectedCat = fbCategories[i]; break; }166          }167          if (selectedCat) { stockData = selectedCat.stock_list || []; }168        } else if (rawType === "fb" || rawType === "google") {169          stockData = Bot.getProperty("ff_stock_" + rawType) || [];170        } else {171          isGeneralCategory = true;172          var categoriesFF = Bot.getProperty("ff_categories") || {};173          selectedCat = categoriesFF[rawType];174          if (selectedCat) {175            var fallbackStock = Bot.getProperty("ff_stock_" + rawType) || [];176            stockData = (selectedCat.stock_list && selectedCat.stock_list.length > 0) ? selectedCat.stock_list : fallbackStock;177          }178        }179 180        if (!stockData || stockData.length === 0) {181          Api.editMessageCaption({182            chat_id: chat.chatid, message_id: request.message.message_id,183            caption: "⚠️ Payment received but item went out of stock. Contact admin with UTR: " + utr,184            parse_mode: "HTML"185          });186          User.setProperty("buy_verifying_lock_" + userId, false, "boolean");187          return;188        }189 190        var accountExtracted = stockData.shift();191 192        if (isDynamicCategory && selectedCat) {193          selectedCat.stock_list = stockData;194          Bot.setProperty("fb_categories", fbCategories, "json");195        } else if (isGeneralCategory && selectedCat) {196          selectedCat.stock_list = stockData;197          var categoriesFF2 = Bot.getProperty("ff_categories") || {};198          categoriesFF2[rawType] = selectedCat;199          Bot.setProperty("ff_categories", categoriesFF2, "json");200          Bot.setProperty("ff_stock_" + rawType, stockData, "json");201        } else {202          Bot.setProperty("ff_stock_" + rawType, stockData, "json");203        }204 205        var fullRawString = String(accountExtracted || "").trim();206        var emailData = fullRawString;207        var passwordData = "No Password Found";208 209        if (fullRawString.indexOf("|") !== -1) {210          var lastPipeIndex = fullRawString.lastIndexOf("|");211          var firstPart = fullRawString.substring(0, lastPipeIndex).trim();212          var secondPart = fullRawString.substring(lastPipeIndex + 1).trim();213 214          if (firstPart.indexOf(" ") !== -1) {215            var spaceParts = firstPart.split(" ");216            emailData = spaceParts[spaceParts.length - 1].trim();217          } else {218            emailData = firstPart;219          }220          passwordData = secondPart;221        }222 223        var purchasedKeys = User.getProperty("my_purchased_keys") || [];224        if (!Array.isArray(purchasedKeys)) { purchasedKeys = []; }225        var currentDate = new Date().toLocaleDateString('en-IN', { timeZone: "Asia/Kolkata" });226        purchasedKeys.push({227          productName: displayTypeName,228          cost: finalCost.toString(),229          key: emailData + (passwordData !== "No Password Found" ? " | " + passwordData : ""),230          days: "Permanent",231          date: currentDate232        });233        User.setProperty("my_purchased_keys", purchasedKeys, "json");234 235        var deliveryText =236          "┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n" +237          "┃ ❤️‍🔥 <b>PURCHASE SUCCESSFUL!</b> ❤️‍🔥 ┃\n" +238          "┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n" +239          "📦 <b>Item:</b> <code>" + displayTypeName + "</code>\n" +240          "💰 <b>Paid:</b> <code>₹" + finalCost + "</code> " + (isResellerFlow ? "<b>(Reseller)</b>" : "") + "\n" +241          "━━━━━━━━━━━━━━━━━━━━━━━━━━\n" +242          "👤 <b>ACCOUNT DETAILS:</b>\n\n" +243          "🚀 <b>Email:</b> <code>" + emailData + "</code>\n" +244          "🔒 <b>Password:</b> <code>" + passwordData + "</code>\n" +245          "━━━━━━━━━━━━━━━━━━━━━━━━━━\n" +246          "⚠️ <i>Copy details instantly.</i>";247 248        Api.sendMessage({249          chat_id: chat.chatid,250          text: deliveryText,251          parse_mode: "HTML"252        });253 254        var adminLogChannel = "8963001413";255        var adminNotificationMsg =256          "<blockquote>⚠️ <b>NEW ORDER ALERT (QR)</b>" + (isResellerFlow ? " [RESELLER]" : "") + "</blockquote>\n" +257          "👤 <b>User:</b> <a href='tg://user?id=" + userId + "'>" + user.first_name + "</a> (<code>" + userId + "</code>)\n" +258          "📦 <b>Item:</b> <code>" + displayTypeName + "</code>\n" +259          "💰 <b>Revenue:</b> <code>₹" + finalCost + "</code>\n" +260          "⚡ <b>Stock Left:</b> <code>" + stockData.length + " units</code>\n\n" +261          "🖥 <b>ACCOUNT DETAILS:</b>\n" +262          "➔ <b>Email:</b> <code>" + emailData + "</code>\n" +263          "➔ <b>Password:</b> <code>" + passwordData + "</code>";264 265        Api.sendMessage({266          chat_id: adminLogChannel,267          text: adminNotificationMsg,268          parse_mode: "HTML"269        });270 271        // Cleanup all buy_ state for this order272        User.setProperty("buy_flow_type", null, "string");273        User.setProperty("buy_ffid_rawtype", null, "string");274        User.setProperty("buy_ffid_is_reseller", null, "boolean");275        User.setProperty("buy_price", null, "number");276        User.setProperty("buy_needpay", null, "number");277        User.setProperty("buy_prod_name", null, "string");278        User.setProperty("buy_pending_order_id", null);279        Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");280        User.setProperty("buy_qr_msg_id_" + userId, null, "string");281        Bot.setProperty("buy_qr_caption_" + userId, null, "string");282        User.setProperty("buy_qr_caption_" + userId, null, "string");283        Bot.setProperty("buy_qr_buttons_" + userId, null, "string");284        User.setProperty("buy_qr_buttons_" + userId, null, "string");285 286      } catch (ffErr) {287        Api.editMessageCaption({288          chat_id: chat.chatid, message_id: request.message.message_id,289          caption: "⚠️ Delivery error. Contact admin with UTR: " + utr + " | Error: " + ffErr.message,290          parse_mode: "HTML"291        });292      }293      User.setProperty("buy_verifying_lock_" + userId, false, "boolean");294      return;295    }296 297    // =========================================================298    // 📦 ORIGINAL PLAN-BASED DELIVERY (external xyzcheats API)299    // =========================================================300    var prodIdx = User.getProperty("buy_prod_idx");301    var planIdx = User.getProperty("buy_plan_idx");302    var productList = Bot.getProperty("stored_products") || [];303    var product = productList[prodIdx];304    var plan = product && product.plans ? product.plans[planIdx] : null;305 306    if (!product || !plan) {307      Api.editMessageCaption({308        chat_id: chat.chatid, message_id: request.message.message_id,309        caption: "⚠️ Payment received but product data missing. Contact admin with UTR: " + utr,310        parse_mode: "HTML"311      });312      User.setProperty("buy_verifying_lock_" + userId, false, "boolean");313      return;314    }315 316    var webProductId = String(product.id || "PID_ID").trim();317    var cleanPlanDays = User.getProperty("buy_plan_days") || String(plan.days);318    var prodNameLower = String(product.name).toLowerCase();319    var durationParam = cleanPlanDays + " Days";320 321    var rawPlanName = plan.name || plan.title || plan.name_on_website || "";322    if (rawPlanName.trim() !== "" && isNaN(rawPlanName)) {323      durationParam = rawPlanName.trim();324    } else if (prodNameLower.indexOf("pato") > -1 || prodNameLower.indexOf("all android") > -1 || prodNameLower.indexOf("mix") > -1) {325      durationParam = cleanPlanDays + " DaYs All Colours Mix";326    } else if (prodNameLower.indexOf("prime") > -1 || prodNameLower.indexOf("hook") > -1) {327      durationParam = (cleanPlanDays === "7") ? "7 Days NonRoot" : cleanPlanDays + " Days Nonroot";328    } else if (prodNameLower.indexOf("nonroot") > -1) {329      durationParam = cleanPlanDays + " DaYs NONROOT";330    }331 332    var postFieldsString = "api_key=" + encodeURIComponent("96203a3a010dc1e626d9962ce30921f5") +333      "&action=" + encodeURIComponent("buy") +334      "&product_id=" + encodeURIComponent(webProductId) +335      "&duration=" + encodeURIComponent(durationParam);336 337    User.setProperty("last_pending_price", User.getProperty("buy_price"), "number");338    User.setProperty("last_pending_prod_id", webProductId, "string");339    User.setProperty("last_pending_prod_name", String(product.name).trim(), "string");340    User.setProperty("last_pending_plan_days", cleanPlanDays, "string");341 342    HTTP.post({343      url: "https://adminpanels.shop/api/reseller_v1.php",344      body: postFieldsString,345      headers: {346        "Content-Type": "application/x-www-form-urlencoded",347        "x-master-key": "a7f3e8b2c9d1f4a6b8c2d5e9f1a3b6c8"348      },349      success: "/onWebKeyReceive",350      error: "/onWebKeyError"351    });352 353    User.setProperty("buy_pending_order_id", null);354    User.setProperty("buy_prod_idx", null);355    User.setProperty("buy_plan_idx", null);356    Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");357    User.setProperty("buy_qr_msg_id_" + userId, null, "string");358    Bot.setProperty("buy_qr_caption_" + userId, null, "string");359    User.setProperty("buy_qr_caption_" + userId, null, "string");360    Bot.setProperty("buy_qr_buttons_" + userId, null, "string");361    User.setProperty("buy_qr_buttons_" + userId, null, "string");362    363    User.setProperty("buy_verifying_lock_" + userId, false, "boolean");364 365  } else {366    // ❌ Payment not found — restore original QR caption/buttons, then show dismissible notice367    try {368      var origCaption = Bot.getProperty("buy_qr_caption_" + userId) || User.getProperty("buy_qr_caption_" + userId);369      var origButtons = Bot.getProperty("buy_qr_buttons_" + userId) || User.getProperty("buy_qr_buttons_" + userId);370 371      if (origCaption) {372        Api.editMessageCaption({373          chat_id: chat.chatid,374          message_id: request.message.message_id,375          caption: origCaption,376          parse_mode: "HTML",377          reply_markup: origButtons ? origButtons : undefined378        });379      }380    } catch (e) {}381 382    if (request && request.id) {383      Api.answerCallbackQuery({384        callback_query_id: String(request.id),385        text: "❌ PAYMENT NOT FOUND ❌\nPlease complete the payment first, then tap again.",386        show_alert: true387      });388    }389    User.setProperty("buy_verifying_lock_" + userId, false, "boolean");390  }391 392} catch (err) {393  try {394    User.setProperty("buy_verifying_lock_" + user.telegramid, false, "boolean");395  } catch (e) {}396  Bot.sendMessage("⚠️ <b>Verification Exception:</b> " + err.message, { parse_mode: "HTML" });397}