שיתוף | קוד PHP לאימות זיהוי ספיישל
-
כתבתי קוד PHP שדרכו ניתן להוספת זיהוי למערכת
ההגדרות לשלוחה שתוסיף את המספר שתקישו
type=api api_link=לינק לקוד שלכם api_hangup_send=no api_phone_send=no title=אימות טלפון api_add_0=token=טוקן המערכת שלכםהגדרות לשלוחה שתוסיף את המספר שנכנס לשלוחה
type=api api_link=לינק api_hangup_send=no title=אימות טלפון api_add_0=token=טוקןהקוד מצורף בספויילר
<?php header('Content-Type: text/plain; charset=utf-8'); // הגדרת נתיבים לקבצים באותה התיקייה $jsonFilePath = __DIR__ . '/requests.json'; $logFilePath = __DIR__ . '/system.log'; // פונקציה לייעודית לכתיבת לוגים function writeToLog($message, $logFilePath) { $timestamp = date('Y-m-d H:i:s'); $logMessage = "[{$timestamp}] {$message}\n" . str_repeat('-', 40) . "\n"; @file_put_contents($logFilePath, $logMessage, FILE_APPEND); } // 1. קבלת הפרמטרים מהקריאה $token = isset($_GET['token']) ? $_GET['token'] : ''; $code = isset($_GET['code']) ? $_GET['code'] : ''; // 2. קביעת מספר הטלפון (תמיכה ב-Phone וב-ApiPhone) $phone = ''; if (!empty($_GET['Phone'])) { $phone = $_GET['Phone']; } elseif (!empty($_GET['ApiPhone'])) { $phone = $_GET['ApiPhone']; } // ניקוי מספר הטלפון מתווים שאינם ספרות $phoneKey = preg_replace('/[^0-9]/', '', $phone); // תיעוד כניסת פרמטרים ללוג $incomingParams = json_encode($_GET, JSON_UNESCAPED_UNICODE); writeToLog("בקשה נכנסת לשרת.\nפרמטרים שהתקבלו: {$incomingParams}", $logFilePath); // בדיקת חובה: האם קיים טוקן? if (empty($token)) { $err = "שגיאה: פרמטר token חסר בבקשה."; echo $err; writeToLog($err, $logFilePath); exit; } // טעינת קובץ ה-JSON הקיים $jsonData = []; if (file_exists($jsonFilePath)) { $fileContent = file_get_contents($jsonFilePath); $jsonData = json_decode($fileContent, true) ?: []; } // ========================================== // ניתוב לפי שלבי הפעולה // ========================================== if (empty($code)) { // ========================================== // שלב א': שליחת קוד אימות לטלפון // ========================================== if (empty($phoneKey)) { echo "read=m-1125=Phone,,10,9,,Phone,,,,,,,,,"; writeToLog("שלב א': חסר מספר טלפון, הוחזרה הוראת הקשה למערכת.", $logFilePath); exit; } // בניית הפרמטרים לשליחה (כאן בתגובה החוזרת מהם זה מגיע כ-reqId) $apiParams = [ 'token' => $token, 'action' => 'send', 'callerId' => $phoneKey, 'validType' => 'CALL' ]; $url = "https://www.call2all.co.il/ym/api/ValidationCallerId?" . http_build_query($apiParams); writeToLog("שלב א': פנייה ל-API.\nכתובת: {$url}", $logFilePath); $response = @file_get_contents($url); if ($response === false) { $err = "שגיאה בשלב א': file_get_contents נכשל."; echo $err; writeToLog($err, $logFilePath); exit; } writeToLog("שלב א': תשובה גולמית מה-API:\n{$response}", $logFilePath); $data = json_decode($response, true); if (!$data) { $err = "שגיאה בשלב א': תגובה אינה JSON תקין."; echo $err; writeToLog($err, $logFilePath); exit; } if (isset($data['responseStatus']) && $data['responseStatus'] === 'OK' && isset($data['reqId'])) { // דריסת זיהוי ישן אם קיים if (isset($jsonData[$phoneKey])) { unset($jsonData[$phoneKey]); writeToLog("זיהוי ישן עבור מספר {$phoneKey} נמחק מהקובץ.", $logFilePath); } // שמירת ה-reqId $jsonData[$phoneKey] = $data['reqId']; file_put_contents($jsonFilePath, json_encode($jsonData, JSON_PRETTY_PRINT)); echo "read=f-A000=code,,6,4,12,Digits,yes,,,,,,,,"; writeToLog("שלב א' הסתיים בהצלחה. המזהה נשמר ב-JSON.", $logFilePath); } else { $msg = isset($data['message']) ? $data['message'] : 'לא צוינה סיבה'; echo "שגיאה מה-API בשלב השליחה: " . $msg; writeToLog("שגיאה מה-API בשלב השליחה: " . $msg, $logFilePath); } } else { // ========================================== // שלב ב': אימות הקוד שהוקש על ידי המשתמש // ========================================== if (empty($phoneKey)) { $err = "שגיאה בשלב ב': נשלח קוד אך מספר הטלפון חסר בקריאה."; echo $err; writeToLog($err, $logFilePath); exit; } if (!isset($jsonData[$phoneKey])) { $err = "שגיאה בשלב ב': לא נמצא מזהה בקשה שמור עבור הטלפון " . $phoneKey . " ב-JSON."; echo $err; writeToLog($err, $logFilePath); exit; } // שליפת המזהה השמור $savedId = $jsonData[$phoneKey]; // תיקון ה-URL: שימוש בפרמטר reId במקום reqId והסרת משתנים מיותרים $apiParams = [ 'token' => $token, 'action' => 'valid', 'reId' => $savedId, // התיקון המדויק שלך! 'code' => $code ]; $url = "https://www.call2all.co.il/ym/api/ValidationCallerId?" . http_build_query($apiParams); writeToLog("שלב ב': פנייה ל-API לצורך אימות.\nכתובת שנשלחה: {$url}", $logFilePath); $response = @file_get_contents($url); if ($response === false) { $err = "שגיאה בשלב ב': נכשלה ההתקשרות לשרת לצורך אימות."; echo $err; writeToLog($err, $logFilePath); exit; } writeToLog("שלב ב': תשובה גולמית מה-API:\n{$response}", $logFilePath); $data = json_decode($response, true); if (!$data) { $err = "שגיאה בשלב ב': תגובת השרת אינה JSON תקין."; echo $err; writeToLog($err, $logFilePath); exit; } if (isset($data['responseStatus']) && $data['responseStatus'] === 'OK') { // הסרת הרשומה לאחר הצלחה unset($jsonData[$phoneKey]); file_put_contents($jsonFilePath, json_encode($jsonData, JSON_PRETTY_PRINT)); echo "OK"; writeToLog("שלב ב' הסתיים בהצלחה מוחלטת! הקוד אומת, הרשומה נמחקה.", $logFilePath); } else { $msg = isset($data['message']) ? $data['message'] : 'הקוד שגוי או פג תוקף'; echo "אימות הקוד נכשל מול ימות המשיח. סיבה: " . $msg; writeToLog("אימות נכשל. סיבה: {$msg}. קוד: {$code}, מזהה שנשלח (reId): {$savedId}", $logFilePath); } }שימו לב בתקייה של הקוד יווצר קובץ ששומר את הפרטים שמתקבלים בין הקריאות
בנוסף יווצר קובץ לוג שבו מתועד כל בקשה וכל לשיחה לימות המשיח ומה בדיוק היתה התשובה
שימו לב! יש להעלות בשלוחה קובץ בשםA000שבו אומרים כעת נשלחה שיחת אימות "אנא הקישו את הקוד שקיבלתם בשיחה" -
@איל-משולש
אשמח אם תוכל לפרט, האם זה בעלות כל שהיא?
ומה יש לעשות כדי שזה יעבוד?
רק להגדיר בשלוחות ולעלות לשרת? -
@אA כאשר שולחים את השיחה זה עולה יחידה לדקה (שיחה לא אמורה לעבור את הדקה)
צריך להתקין את הקוד בשרת, ואז את הקישור לקוד לשים בלינק יחד עם ההגדרות בשלוחה, כאשר יכנסו לשלוחה הוא יבקש להקיש טלפון (או בהגדרות השניות יקח אוטו' את הטלפון שלך) ואז יבקש להקיש קוד וישלח מבזק שבו ישמיע קוד אימות שיש להקיש בטלפון, צריך להקיש אותו וזה עובדזה כמו להוסיף זיהוי דרך האתר, עשית את זה פעם?, זה שולח את אותה הודעה רק שצריך להקיש את הקוד בטלפון ולא במחשב
-
@איל-משולש
אני יודע מה זה אימות, ולכן לא הבנתי איך זה עובד עם הגדרות שלוחה.
אז זה בעצם הזיהוי ספיישל שעולה כסף.אין לך איזה פיתרון חינמי?!
-
@אA כמה זה כבר יחידה אחת
-
@איל-משולש
אתה צודק.
אבל זה קו גדול, אז זה כבר לא יחידה אחת... -
@אA אתה מתכוון להוסיף הרבה מספרים? כי זה לא קשור לקו גדול!, בד"כ לא צריך להוסיף כזה הרבה זיהויים
-
@איל-משולש
אבל כל שיחת אימו תעולה יחידה.
וגם צריך כמה וכמה מספרים -
@אA אין לי איך לעשות את זה בחינם, ימות המשיח נותנהים להוסיף זיהוי דרך האתר או דרך API, אז בניתי קוד שמשתמש ב API לעשות את מהטלפון, אבל אין לי איך לשלוט על המחיר
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות