[{"data":1,"prerenderedAt":2566},["ShallowReactive",2],{"blog-article-/blog/smart-cloud-otp-architecture":3,"blog-posts":256},{"id":4,"title":5,"author":6,"body":7,"category":242,"date":243,"description":244,"extension":245,"image":246,"meta":247,"navigation":248,"path":249,"readingTime":250,"seo":251,"stem":252,"tags":253,"updatedAt":6,"__hash__":255},"blog/blog/smart-cloud-otp-architecture.md","معماری هوشمند OTP: چطور SMS و Call را یکپارچه استفاده کنیم",null,{"type":8,"value":9,"toc":220},"minimark",[10,15,19,23,58,62,81,84,88,93,96,100,103,107,110,121,125,128,132,152,156,160,163,167,170,174,177,181,205,209],[11,12,14],"h2",{"id":13},"هدف-معماری-هوشمند-otp-چیست","هدف معماری هوشمند OTP چیست؟",[16,17,18],"p",{},"هدف این است که کاربر در کمترین زمان کد ورود را بگیرد، حتی اگر یک کانال ارسال دچار اختلال شود. برای این کار باید منطق تصمیم‌گیری، صف پشتیبان و گزارش‌گیری درست طراحی شود.",[11,20,22],{"id":21},"معماری-پیشنهادی-۵-لایه","معماری پیشنهادی ۵ لایه",[24,25,26,34,40,46,52],"ol",{},[27,28,29,33],"li",{},[30,31,32],"strong",{},"لایه درخواست",": اپلیکیشن شما درخواست OTP را ثبت می‌کند.",[27,35,36,39],{},[30,37,38],{},"لایه تصمیم‌گیری",": مشخص می‌کند ابتدا SMS برود یا Call.",[27,41,42,45],{},[30,43,44],{},"لایه ارسال",": درخواست به سرویس‌دهنده فعال ارسال می‌شود.",[27,47,48,51],{},[30,49,50],{},"لایه پشتیبان",": در خطا، مسیر بعدی فعال می‌شود.",[27,53,54,57],{},[30,55,56],{},"لایه گزارش",": تمام رخدادها برای تحلیل ثبت می‌شوند.",[11,59,61],{"id":60},"منطق-تصمیمگیری-پیشنهادی","منطق تصمیم‌گیری پیشنهادی",[63,64,65,72,78],"ul",{},[27,66,67,68],{},"حالت عادی: ",[69,70,71],"code",{},"SMS OTP",[27,73,74,75],{},"اگر ارسال ناموفق بود یا تاخیر داشت: ",[69,76,77],{},"Call OTP",[27,79,80],{},"اگر تماس هم خطا خورد: تلاش از سرویس‌دهنده پشتیبان همان کانال",[16,82,83],{},"این منطق باید شفاف و قابل تنظیم باشد تا بعداً بتوانید بدون تغییر کد، رفتار سیستم را اصلاح کنید.",[11,85,87],{"id":86},"چطور-در-رسانکس-پیاده-کنیم","چطور در رسانکس پیاده کنیم؟",[89,90,92],"h3",{"id":91},"گام-۱-تنظیم-سرویسدهندهها","گام ۱: تنظیم سرویس‌دهنده‌ها",[16,94,95],{},"برای هر کانال (SMS و Call) حداقل یک سرویس‌دهنده اصلی و یک پشتیبان تنظیم کنید.",[89,97,99],{"id":98},"گام-۲-تعریف-مسیر-پشتیبان","گام ۲: تعریف مسیر پشتیبان",[16,101,102],{},"برای هر کانال صف پشتیبان بسازید و ترتیب را بر اساس کیفیت واقعی سرویس‌دهنده‌ها بچینید.",[89,104,106],{"id":105},"گام-۳-استانداردسازی-درخواست","گام ۳: استانداردسازی درخواست",[16,108,109],{},"در سمت سرویس شما فقط این داده‌ها ارسال شود:",[63,111,112,115,118],{},[27,113,114],{},"شماره مقصد",[27,116,117],{},"کد OTP",[27,119,120],{},"(اختیاری) شناسه یکتا برای کنترل ارسال تکراری",[89,122,124],{"id":123},"گام-۴-پایش-مداوم","گام ۴: پایش مداوم",[16,126,127],{},"گزارش‌ها را روزانه بررسی کنید و اگر نرخ خطا بالا رفت، ترتیب صف را اصلاح کنید.",[11,129,131],{"id":130},"مثال-جریان-واقعی","مثال جریان واقعی",[24,133,134,137,140,143,146,149],{},[27,135,136],{},"کاربر شماره را وارد می‌کند.",[27,138,139],{},"سیستم OTP می‌سازد.",[27,141,142],{},"ارسال پیامکی انجام می‌شود.",[27,144,145],{},"اگر وضعیت ناموفق شد، تماس صوتی فعال می‌شود.",[27,147,148],{},"نتیجه نهایی با شناسه رهگیری ذخیره می‌شود.",[27,150,151],{},"در داشبورد، گزارش کامل برای تیم پشتیبانی قابل مشاهده است.",[11,153,155],{"id":154},"خطاهای-رایج-و-راهحل","خطاهای رایج و راه‌حل",[89,157,159],{"id":158},"خطا-ارسال-تکراری","خطا: ارسال تکراری",[16,161,162],{},"راه‌حل: شناسه یکتا در درخواست ثبت کنید و در بازه زمانی کوتاه، درخواست تکراری را رد کنید.",[89,164,166],{"id":165},"خطا-دیر-رسیدن-کد","خطا: دیر رسیدن کد",[16,168,169],{},"راه‌حل: زمان انتظار پیامک را کوتاه‌تر کنید و زودتر مسیر تماس را فعال کنید.",[89,171,173],{"id":172},"خطا-افت-کیفیت-یک-سرویسدهنده","خطا: افت کیفیت یک سرویس‌دهنده",[16,175,176],{},"راه‌حل: ترتیب صف پشتیبان را بر اساس داده واقعی بازچینید.",[11,178,180],{"id":179},"نکات-امنیتی-ضروری","نکات امنیتی ضروری",[24,182,183,189,192,199,202],{},[27,184,185,188],{},[69,186,187],{},"API Key"," را فقط در بک‌اند نگه دارید.",[27,190,191],{},"برای هر کلاینت، دسترسی محدود تعریف کنید.",[27,193,194,195,198],{},"نرخ درخواست را کنترل کنید (",[69,196,197],{},"rate limit",").",[27,200,201],{},"زمان انقضای OTP کوتاه باشد.",[27,203,204],{},"گزارش‌های حساس را با سطح دسترسی نمایش دهید.",[11,206,208],{"id":207},"جمعبندی","جمع‌بندی",[16,210,211,212,215,216,219],{},"اگر ",[69,213,214],{},"Cloud SMS OTP"," و ",[69,217,218],{},"Cloud Call OTP"," را با منطق هوشمند و صف پشتیبان ترکیب کنید، هم پایداری ارسال بهتر می‌شود و هم تجربه کاربری. این معماری برای رشد کسب‌وکارهای SaaS کاملاً مناسب است چون مقیاس‌پذیر، قابل کنترل و قابل گزارش است.",{"title":221,"searchDepth":222,"depth":222,"links":223},"",2,[224,225,226,227,234,235,240,241],{"id":13,"depth":222,"text":14},{"id":21,"depth":222,"text":22},{"id":60,"depth":222,"text":61},{"id":86,"depth":222,"text":87,"children":228},[229,231,232,233],{"id":91,"depth":230,"text":92},3,{"id":98,"depth":230,"text":99},{"id":105,"depth":230,"text":106},{"id":123,"depth":230,"text":124},{"id":130,"depth":222,"text":131},{"id":154,"depth":222,"text":155,"children":236},[237,238,239],{"id":158,"depth":230,"text":159},{"id":165,"depth":230,"text":166},{"id":172,"depth":230,"text":173},{"id":179,"depth":222,"text":180},{"id":207,"depth":222,"text":208},"معماری و پیاده‌سازی","2026-04-09","در این راهنمای عملی یاد می‌گیرید چطور یک معماری هوشمند برای OTP بسازید که بین پیامک و تماس صوتی جابه‌جا شود، خطا را کم کند و تجربه کاربر را بهتر کند.","md","/images/blog/smart-cloud-otp-architecture.svg",{},true,"/blog/smart-cloud-otp-architecture",11,{"title":5,"description":244},"blog/smart-cloud-otp-architecture",[254,214,218],"OTP هوشمند","5liXUNmzvwx74NPw1UIfhh36knzrGAzaWQxEHNlaOy0",[257,1337,2415],{"id":258,"title":259,"author":6,"body":260,"category":1325,"date":1326,"description":1327,"extension":245,"image":1328,"meta":1329,"navigation":248,"path":1330,"readingTime":911,"seo":1331,"stem":1332,"tags":1333,"updatedAt":6,"__hash__":1336},"blog/blog/cloud-call-otp-guide.md","مستندات Cloud Call OTP رسانکس",{"type":8,"value":261,"toc":1304},[262,266,269,273,276,308,312,332,336,363,367,389,393,396,427,535,539,591,595,599,631,638,642,712,720,724,802,810,814,818,923,927,1024,1028,1163,1167,1259,1263,1297,1300],[11,263,265],{"id":264},"این-مستندات-برای-چیست","این مستندات برای چیست؟",[16,267,268],{},"این صفحه راهنمای دقیق استفاده از Cloud Call OTP است تا کد OTP را از طریق تماس صوتی و با مسیر پشتیبان استاندارد ارسال کنید.",[11,270,272],{"id":271},"مسیرهای-دقیق-داخل-پنل","مسیرهای دقیق داخل پنل",[16,274,275],{},"مسیرها را به این ترتیب انجام دهید:",[24,277,278,284,290,296,302],{},[27,279,280,281],{},"تنظیم سرویس‌دهنده تماس: ",[69,282,283],{},"/app/call-otp/providers",[27,285,286,287],{},"تنظیم صف پشتیبان تماس: ",[69,288,289],{},"/app/call-otp/routing",[27,291,292,293],{},"دریافت API Key وب‌سرویس: ",[69,294,295],{},"/app/webservice",[27,297,298,299],{},"مشاهده مستندات ماژول در پنل: ",[69,300,301],{},"/app/webservice/call_otp",[27,303,304,305],{},"بررسی گزارش تماس‌ها: ",[69,306,307],{},"/app/call-otp/logs",[11,309,311],{"id":310},"پیشنیازهای-الزامی","پیش‌نیازهای الزامی",[24,313,314,321,326,329],{},[27,315,316,317,320],{},"ماژول ",[69,318,319],{},"call_otp"," برای کسب‌وکار فعال باشد.",[27,322,316,323,320],{},[69,324,325],{},"webservice",[27,327,328],{},"حداقل یک سرویس‌دهنده تماس صوتی تنظیم و فعال شده باشد.",[27,330,331],{},"API Key معتبر از بخش وب‌سرویس دریافت شده باشد.",[11,333,335],{"id":334},"endpoint-رسمی-ارسال","Endpoint رسمی ارسال",[63,337,338,347,355],{},[27,339,340,343,344],{},[69,341,342],{},"Method",": ",[69,345,346],{},"POST",[27,348,349,343,352],{},[69,350,351],{},"Path",[69,353,354],{},"/v1/call-otp/send",[27,356,357,343,360],{},[69,358,359],{},"Full URL (مثال)",[69,361,362],{},"https://api.rasanex.com/v1/call-otp/send",[11,364,366],{"id":365},"headerهای-لازم","Headerهای لازم",[368,369,374],"pre",{"className":370,"code":371,"filename":372,"language":373,"meta":221,"style":221},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Authorization: Bearer YOUR_API_KEY\nContent-Type: application/json\n","headers.http","http",[69,375,376,384],{"__ignoreMap":221},[377,378,381],"span",{"class":379,"line":380},"line",1,[377,382,383],{},"Authorization: Bearer YOUR_API_KEY\n",[377,385,386],{"class":379,"line":222},[377,387,388],{},"Content-Type: application/json\n",[11,390,392],{"id":391},"بدنه-درخواست","بدنه درخواست",[16,394,395],{},"فیلدها:",[63,397,398,404,409,415,421],{},[27,399,400,403],{},[69,401,402],{},"phone"," اجباری: شماره مقصد تماس",[27,405,406,408],{},[69,407,69],{}," اجباری: کد OTP",[27,410,411,414],{},[69,412,413],{},"params"," اختیاری: پارامترهای تکمیلی",[27,416,417,420],{},[69,418,419],{},"options.idempotency_key"," اختیاری: جلوگیری از تماس تکراری در retry",[27,422,423,426],{},[69,424,425],{},"tenant_id"," اختیاری: فقط در سناریوی توکن چندکسب‌وکاری",[368,428,433],{"className":429,"code":430,"filename":431,"language":432,"meta":221,"style":221},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"phone\": \"09120000000\",\n  \"code\": \"4821\",\n  \"options\": {\n    \"idempotency_key\": \"call-otp-login-20260411-01\"\n  }\n}\n","request.json","json",[69,434,435,441,467,486,501,523,529],{"__ignoreMap":221},[377,436,437],{"class":379,"line":380},[377,438,440],{"class":439},"sMK4o","{\n",[377,442,443,446,449,452,455,458,462,464],{"class":379,"line":222},[377,444,445],{"class":439},"  \"",[377,447,402],{"class":448},"spNyl",[377,450,451],{"class":439},"\"",[377,453,454],{"class":439},":",[377,456,457],{"class":439}," \"",[377,459,461],{"class":460},"sfazB","09120000000",[377,463,451],{"class":439},[377,465,466],{"class":439},",\n",[377,468,469,471,473,475,477,479,482,484],{"class":379,"line":230},[377,470,445],{"class":439},[377,472,69],{"class":448},[377,474,451],{"class":439},[377,476,454],{"class":439},[377,478,457],{"class":439},[377,480,481],{"class":460},"4821",[377,483,451],{"class":439},[377,485,466],{"class":439},[377,487,489,491,494,496,498],{"class":379,"line":488},4,[377,490,445],{"class":439},[377,492,493],{"class":448},"options",[377,495,451],{"class":439},[377,497,454],{"class":439},[377,499,500],{"class":439}," {\n",[377,502,504,507,511,513,515,517,520],{"class":379,"line":503},5,[377,505,506],{"class":439},"    \"",[377,508,510],{"class":509},"sBMFI","idempotency_key",[377,512,451],{"class":439},[377,514,454],{"class":439},[377,516,457],{"class":439},[377,518,519],{"class":460},"call-otp-login-20260411-01",[377,521,522],{"class":439},"\"\n",[377,524,526],{"class":379,"line":525},6,[377,527,528],{"class":439},"  }\n",[377,530,532],{"class":379,"line":531},7,[377,533,534],{"class":439},"}\n",[11,536,538],{"id":537},"پاسخ-موفق","پاسخ موفق",[368,540,543],{"className":429,"code":541,"filename":542,"language":432,"meta":221,"style":221},"{\n  \"tracking_id\": \"f0e9c32b62e24b78a3e0a9c3f2d14e88\",\n  \"status\": \"accepted\"\n}\n","202-accepted.json",[69,544,545,549,569,587],{"__ignoreMap":221},[377,546,547],{"class":379,"line":380},[377,548,440],{"class":439},[377,550,551,553,556,558,560,562,565,567],{"class":379,"line":222},[377,552,445],{"class":439},[377,554,555],{"class":448},"tracking_id",[377,557,451],{"class":439},[377,559,454],{"class":439},[377,561,457],{"class":439},[377,563,564],{"class":460},"f0e9c32b62e24b78a3e0a9c3f2d14e88",[377,566,451],{"class":439},[377,568,466],{"class":439},[377,570,571,573,576,578,580,582,585],{"class":379,"line":230},[377,572,445],{"class":439},[377,574,575],{"class":448},"status",[377,577,451],{"class":439},[377,579,454],{"class":439},[377,581,457],{"class":439},[377,583,584],{"class":460},"accepted",[377,586,522],{"class":439},[377,588,589],{"class":379,"line":488},[377,590,534],{"class":439},[11,592,594],{"id":593},"خطاهای-رایج-و-اقدام-اصلاحی","خطاهای رایج و اقدام اصلاحی",[89,596,598],{"id":597},"_401-توکن-نامعتبر","401 - توکن نامعتبر",[368,600,603],{"className":429,"code":601,"filename":602,"language":432,"meta":221,"style":221},"{\n  \"message\": \"Unauthorized. Invalid bearer token.\"\n}\n","401.json",[69,604,605,609,627],{"__ignoreMap":221},[377,606,607],{"class":379,"line":380},[377,608,440],{"class":439},[377,610,611,613,616,618,620,622,625],{"class":379,"line":222},[377,612,445],{"class":439},[377,614,615],{"class":448},"message",[377,617,451],{"class":439},[377,619,454],{"class":439},[377,621,457],{"class":439},[377,623,624],{"class":460},"Unauthorized. Invalid bearer token.",[377,626,522],{"class":439},[377,628,629],{"class":379,"line":230},[377,630,534],{"class":439},[16,632,633,634,637],{},"اقدام: API Key را بررسی کنید و هدر ",[69,635,636],{},"Authorization"," را صحیح بفرستید.",[89,639,641],{"id":640},"_403-ماژول-غیرفعال-یا-دسترسی-ناکافی","403 - ماژول غیرفعال یا دسترسی ناکافی",[368,643,646],{"className":429,"code":644,"filename":645,"language":432,"meta":221,"style":221},"{\n  \"error\": \"Webservice module must be enabled to use call_otp webservice APIs.\",\n  \"module_id\": \"webservice\",\n  \"code\": \"module_disabled\"\n}\n","403.json",[69,647,648,652,672,691,708],{"__ignoreMap":221},[377,649,650],{"class":379,"line":380},[377,651,440],{"class":439},[377,653,654,656,659,661,663,665,668,670],{"class":379,"line":222},[377,655,445],{"class":439},[377,657,658],{"class":448},"error",[377,660,451],{"class":439},[377,662,454],{"class":439},[377,664,457],{"class":439},[377,666,667],{"class":460},"Webservice module must be enabled to use call_otp webservice APIs.",[377,669,451],{"class":439},[377,671,466],{"class":439},[377,673,674,676,679,681,683,685,687,689],{"class":379,"line":230},[377,675,445],{"class":439},[377,677,678],{"class":448},"module_id",[377,680,451],{"class":439},[377,682,454],{"class":439},[377,684,457],{"class":439},[377,686,325],{"class":460},[377,688,451],{"class":439},[377,690,466],{"class":439},[377,692,693,695,697,699,701,703,706],{"class":379,"line":488},[377,694,445],{"class":439},[377,696,69],{"class":448},[377,698,451],{"class":439},[377,700,454],{"class":439},[377,702,457],{"class":439},[377,704,705],{"class":460},"module_disabled",[377,707,522],{"class":439},[377,709,710],{"class":379,"line":503},[377,711,534],{"class":439},[16,713,714,715,215,717,719],{},"اقدام: فعال بودن ماژول‌های ",[69,716,319],{},[69,718,325],{}," را بررسی کنید.",[89,721,723],{"id":722},"_422-بدنه-نامعتبر","422 - بدنه نامعتبر",[368,725,728],{"className":429,"code":726,"filename":727,"language":432,"meta":221,"style":221},"{\n  \"message\": \"The code field is required.\",\n  \"errors\": {\n    \"code\": [\n      \"The code field is required.\"\n    ]\n  }\n}\n","422-validation.json",[69,729,730,734,753,766,779,788,793,797],{"__ignoreMap":221},[377,731,732],{"class":379,"line":380},[377,733,440],{"class":439},[377,735,736,738,740,742,744,746,749,751],{"class":379,"line":222},[377,737,445],{"class":439},[377,739,615],{"class":448},[377,741,451],{"class":439},[377,743,454],{"class":439},[377,745,457],{"class":439},[377,747,748],{"class":460},"The code field is required.",[377,750,451],{"class":439},[377,752,466],{"class":439},[377,754,755,757,760,762,764],{"class":379,"line":230},[377,756,445],{"class":439},[377,758,759],{"class":448},"errors",[377,761,451],{"class":439},[377,763,454],{"class":439},[377,765,500],{"class":439},[377,767,768,770,772,774,776],{"class":379,"line":488},[377,769,506],{"class":439},[377,771,69],{"class":509},[377,773,451],{"class":439},[377,775,454],{"class":439},[377,777,778],{"class":439}," [\n",[377,780,781,784,786],{"class":379,"line":503},[377,782,783],{"class":439},"      \"",[377,785,748],{"class":460},[377,787,522],{"class":439},[377,789,790],{"class":379,"line":525},[377,791,792],{"class":439},"    ]\n",[377,794,795],{"class":379,"line":531},[377,796,528],{"class":439},[377,798,800],{"class":379,"line":799},8,[377,801,534],{"class":439},[16,803,804,805,215,807,809],{},"اقدام: هر دو فیلد ",[69,806,402],{},[69,808,69],{}," را همیشه ارسال کنید.",[11,811,813],{"id":812},"نمونه-کدهای-آماده","نمونه کدهای آماده",[89,815,817],{"id":816},"curl","cURL",[368,819,824],{"className":820,"code":821,"filename":822,"language":823,"meta":221,"style":221},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl --request POST \\\n  --url https://api.rasanex.com/v1/call-otp/send \\\n  --header 'Authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"phone\": \"09120000000\",\n    \"code\": \"4821\",\n    \"options\": {\n      \"idempotency_key\": \"call-otp-login-20260411-01\"\n    }\n  }'\n","send-call-otp.sh","bash",[69,825,826,840,850,866,879,888,893,898,903,909,915],{"__ignoreMap":221},[377,827,828,830,833,836],{"class":379,"line":380},[377,829,816],{"class":509},[377,831,832],{"class":460}," --request",[377,834,835],{"class":460}," POST",[377,837,839],{"class":838},"sTEyZ"," \\\n",[377,841,842,845,848],{"class":379,"line":222},[377,843,844],{"class":460},"  --url",[377,846,847],{"class":460}," https://api.rasanex.com/v1/call-otp/send",[377,849,839],{"class":838},[377,851,852,855,858,861,864],{"class":379,"line":230},[377,853,854],{"class":460},"  --header",[377,856,857],{"class":439}," '",[377,859,860],{"class":460},"Authorization: Bearer YOUR_API_KEY",[377,862,863],{"class":439},"'",[377,865,839],{"class":838},[377,867,868,870,872,875,877],{"class":379,"line":488},[377,869,854],{"class":460},[377,871,857],{"class":439},[377,873,874],{"class":460},"Content-Type: application/json",[377,876,863],{"class":439},[377,878,839],{"class":838},[377,880,881,884,886],{"class":379,"line":503},[377,882,883],{"class":460},"  --data",[377,885,857],{"class":439},[377,887,440],{"class":460},[377,889,890],{"class":379,"line":525},[377,891,892],{"class":460},"    \"phone\": \"09120000000\",\n",[377,894,895],{"class":379,"line":531},[377,896,897],{"class":460},"    \"code\": \"4821\",\n",[377,899,900],{"class":379,"line":799},[377,901,902],{"class":460},"    \"options\": {\n",[377,904,906],{"class":379,"line":905},9,[377,907,908],{"class":460},"      \"idempotency_key\": \"call-otp-login-20260411-01\"\n",[377,910,912],{"class":379,"line":911},10,[377,913,914],{"class":460},"    }\n",[377,916,917,920],{"class":379,"line":250},[377,918,919],{"class":460},"  }",[377,921,922],{"class":439},"'\n",[89,924,926],{"id":925},"javascript","JavaScript",[368,928,932],{"className":929,"code":930,"filename":931,"language":925,"meta":221,"style":221},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const response = await fetch('https://api.rasanex.com/v1/call-otp/send', {\n  method: 'POST',\n  headers: {\n    Authorization: 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    phone: '09120000000',\n    code: '4821',\n    options: {\n      idempotency_key: 'call-otp-login-20260411-01'\n    }\n  })\n})\n\nconst data = await response.json()\nconsole.log(data)\n","sendCallOtp.js",[69,933,934,939,944,949,954,959,964,969,974,979,984,989,994,1000,1006,1012,1018],{"__ignoreMap":221},[377,935,936],{"class":379,"line":380},[377,937,938],{},"const response = await fetch('https://api.rasanex.com/v1/call-otp/send', {\n",[377,940,941],{"class":379,"line":222},[377,942,943],{},"  method: 'POST',\n",[377,945,946],{"class":379,"line":230},[377,947,948],{},"  headers: {\n",[377,950,951],{"class":379,"line":488},[377,952,953],{},"    Authorization: 'Bearer YOUR_API_KEY',\n",[377,955,956],{"class":379,"line":503},[377,957,958],{},"    'Content-Type': 'application/json'\n",[377,960,961],{"class":379,"line":525},[377,962,963],{},"  },\n",[377,965,966],{"class":379,"line":531},[377,967,968],{},"  body: JSON.stringify({\n",[377,970,971],{"class":379,"line":799},[377,972,973],{},"    phone: '09120000000',\n",[377,975,976],{"class":379,"line":905},[377,977,978],{},"    code: '4821',\n",[377,980,981],{"class":379,"line":911},[377,982,983],{},"    options: {\n",[377,985,986],{"class":379,"line":250},[377,987,988],{},"      idempotency_key: 'call-otp-login-20260411-01'\n",[377,990,992],{"class":379,"line":991},12,[377,993,914],{},[377,995,997],{"class":379,"line":996},13,[377,998,999],{},"  })\n",[377,1001,1003],{"class":379,"line":1002},14,[377,1004,1005],{},"})\n",[377,1007,1009],{"class":379,"line":1008},15,[377,1010,1011],{"emptyLinePlaceholder":248},"\n",[377,1013,1015],{"class":379,"line":1014},16,[377,1016,1017],{},"const data = await response.json()\n",[377,1019,1021],{"class":379,"line":1020},17,[377,1022,1023],{},"console.log(data)\n",[89,1025,1027],{"id":1026},"php","PHP",[368,1029,1033],{"className":1030,"code":1031,"filename":1032,"language":1026,"meta":221,"style":221},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?php\n\n$payload = [\n    'phone' => '09120000000',\n    'code' => '4821',\n    'options' => [\n        'idempotency_key' => 'call-otp-login-20260411-01',\n    ],\n];\n\n$ch = curl_init('https://api.rasanex.com/v1/call-otp/send');\ncurl_setopt_array($ch, [\n    CURLOPT_RETURNTRANSFER => true,\n    CURLOPT_POST => true,\n    CURLOPT_HTTPHEADER => [\n        'Authorization: Bearer YOUR_API_KEY',\n        'Content-Type: application/json',\n    ],\n    CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),\n]);\n\n$result = curl_exec($ch);\ncurl_close($ch);\n\necho $result;\n","send_call_otp.php",[69,1034,1035,1040,1044,1049,1054,1059,1064,1069,1074,1079,1083,1088,1093,1098,1103,1108,1113,1118,1123,1129,1135,1140,1146,1152,1157],{"__ignoreMap":221},[377,1036,1037],{"class":379,"line":380},[377,1038,1039],{},"\u003C?php\n",[377,1041,1042],{"class":379,"line":222},[377,1043,1011],{"emptyLinePlaceholder":248},[377,1045,1046],{"class":379,"line":230},[377,1047,1048],{},"$payload = [\n",[377,1050,1051],{"class":379,"line":488},[377,1052,1053],{},"    'phone' => '09120000000',\n",[377,1055,1056],{"class":379,"line":503},[377,1057,1058],{},"    'code' => '4821',\n",[377,1060,1061],{"class":379,"line":525},[377,1062,1063],{},"    'options' => [\n",[377,1065,1066],{"class":379,"line":531},[377,1067,1068],{},"        'idempotency_key' => 'call-otp-login-20260411-01',\n",[377,1070,1071],{"class":379,"line":799},[377,1072,1073],{},"    ],\n",[377,1075,1076],{"class":379,"line":905},[377,1077,1078],{},"];\n",[377,1080,1081],{"class":379,"line":911},[377,1082,1011],{"emptyLinePlaceholder":248},[377,1084,1085],{"class":379,"line":250},[377,1086,1087],{},"$ch = curl_init('https://api.rasanex.com/v1/call-otp/send');\n",[377,1089,1090],{"class":379,"line":991},[377,1091,1092],{},"curl_setopt_array($ch, [\n",[377,1094,1095],{"class":379,"line":996},[377,1096,1097],{},"    CURLOPT_RETURNTRANSFER => true,\n",[377,1099,1100],{"class":379,"line":1002},[377,1101,1102],{},"    CURLOPT_POST => true,\n",[377,1104,1105],{"class":379,"line":1008},[377,1106,1107],{},"    CURLOPT_HTTPHEADER => [\n",[377,1109,1110],{"class":379,"line":1014},[377,1111,1112],{},"        'Authorization: Bearer YOUR_API_KEY',\n",[377,1114,1115],{"class":379,"line":1020},[377,1116,1117],{},"        'Content-Type: application/json',\n",[377,1119,1121],{"class":379,"line":1120},18,[377,1122,1073],{},[377,1124,1126],{"class":379,"line":1125},19,[377,1127,1128],{},"    CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),\n",[377,1130,1132],{"class":379,"line":1131},20,[377,1133,1134],{},"]);\n",[377,1136,1138],{"class":379,"line":1137},21,[377,1139,1011],{"emptyLinePlaceholder":248},[377,1141,1143],{"class":379,"line":1142},22,[377,1144,1145],{},"$result = curl_exec($ch);\n",[377,1147,1149],{"class":379,"line":1148},23,[377,1150,1151],{},"curl_close($ch);\n",[377,1153,1155],{"class":379,"line":1154},24,[377,1156,1011],{"emptyLinePlaceholder":248},[377,1158,1160],{"class":379,"line":1159},25,[377,1161,1162],{},"echo $result;\n",[89,1164,1166],{"id":1165},"python","Python",[368,1168,1172],{"className":1169,"code":1170,"filename":1171,"language":1165,"meta":221,"style":221},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import requests\n\nurl = 'https://api.rasanex.com/v1/call-otp/send'\nheaders = {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json',\n}\npayload = {\n    'phone': '09120000000',\n    'code': '4821',\n    'options': {\n        'idempotency_key': 'call-otp-login-20260411-01'\n    }\n}\n\nresponse = requests.post(url, json=payload, headers=headers, timeout=20)\nprint(response.status_code)\nprint(response.json())\n","send_call_otp.py",[69,1173,1174,1179,1183,1188,1193,1198,1203,1207,1212,1217,1222,1227,1232,1236,1240,1244,1249,1254],{"__ignoreMap":221},[377,1175,1176],{"class":379,"line":380},[377,1177,1178],{},"import requests\n",[377,1180,1181],{"class":379,"line":222},[377,1182,1011],{"emptyLinePlaceholder":248},[377,1184,1185],{"class":379,"line":230},[377,1186,1187],{},"url = 'https://api.rasanex.com/v1/call-otp/send'\n",[377,1189,1190],{"class":379,"line":488},[377,1191,1192],{},"headers = {\n",[377,1194,1195],{"class":379,"line":503},[377,1196,1197],{},"    'Authorization': 'Bearer YOUR_API_KEY',\n",[377,1199,1200],{"class":379,"line":525},[377,1201,1202],{},"    'Content-Type': 'application/json',\n",[377,1204,1205],{"class":379,"line":531},[377,1206,534],{},[377,1208,1209],{"class":379,"line":799},[377,1210,1211],{},"payload = {\n",[377,1213,1214],{"class":379,"line":905},[377,1215,1216],{},"    'phone': '09120000000',\n",[377,1218,1219],{"class":379,"line":911},[377,1220,1221],{},"    'code': '4821',\n",[377,1223,1224],{"class":379,"line":250},[377,1225,1226],{},"    'options': {\n",[377,1228,1229],{"class":379,"line":991},[377,1230,1231],{},"        'idempotency_key': 'call-otp-login-20260411-01'\n",[377,1233,1234],{"class":379,"line":996},[377,1235,914],{},[377,1237,1238],{"class":379,"line":1002},[377,1239,534],{},[377,1241,1242],{"class":379,"line":1008},[377,1243,1011],{"emptyLinePlaceholder":248},[377,1245,1246],{"class":379,"line":1014},[377,1247,1248],{},"response = requests.post(url, json=payload, headers=headers, timeout=20)\n",[377,1250,1251],{"class":379,"line":1020},[377,1252,1253],{},"print(response.status_code)\n",[377,1255,1256],{"class":379,"line":1120},[377,1257,1258],{},"print(response.json())\n",[11,1260,1262],{"id":1261},"روال-پیشنهادی-برای-اجرای-صحیح","روال پیشنهادی برای اجرای صحیح",[24,1264,1265,1271,1276,1282,1288],{},[27,1266,1267,1268,1270],{},"در ",[69,1269,283],{}," سرویس‌دهنده تماس را تنظیم و فعال کنید.",[27,1272,1267,1273,1275],{},[69,1274,289],{}," ترتیب سرویس‌دهنده اصلی و پشتیبان را ذخیره کنید.",[27,1277,1278,1279,1281],{},"API Key را از ",[69,1280,295],{}," دریافت کنید.",[27,1283,1284,1285,1287],{},"برای هر عملیات تماس، ",[69,1286,510],{}," یکتا بسازید.",[27,1289,1290,1291,1293,1294,1296],{},"وضعیت نهایی ارسال را با ",[69,1292,555],{}," در ",[69,1295,307],{}," ردیابی کنید.",[16,1298,1299],{},"با این ترتیب، هم پایداری ارسال بهتر می‌شود و هم خطاهای تکراری کنترل می‌شود.",[1301,1302,1303],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":221,"searchDepth":222,"depth":222,"links":1305},[1306,1307,1308,1309,1310,1311,1312,1313,1318,1324],{"id":264,"depth":222,"text":265},{"id":271,"depth":222,"text":272},{"id":310,"depth":222,"text":311},{"id":334,"depth":222,"text":335},{"id":365,"depth":222,"text":366},{"id":391,"depth":222,"text":392},{"id":537,"depth":222,"text":538},{"id":593,"depth":222,"text":594,"children":1314},[1315,1316,1317],{"id":597,"depth":230,"text":598},{"id":640,"depth":230,"text":641},{"id":722,"depth":230,"text":723},{"id":812,"depth":222,"text":813,"children":1319},[1320,1321,1322,1323],{"id":816,"depth":230,"text":817},{"id":925,"depth":230,"text":926},{"id":1026,"depth":230,"text":1027},{"id":1165,"depth":230,"text":1166},{"id":1261,"depth":222,"text":1262},"مستندات فنی","2026-04-10","راهنمای رسمی راه‌اندازی و استفاده از Cloud Call OTP در رسانکس با مسیرهای دقیق پنل، Endpoint واقعی، نمونه درخواست و مدیریت خطا.","/images/blog/cloud-call-otp-guide.svg",{},"/blog/cloud-call-otp-guide",{"title":259,"description":1327},"blog/cloud-call-otp-guide",[218,1334,1335],"مستندات API","رسانکس","J3kiFbRPYs9flwg4pSXKXM6mRZvwPMhQODXzVsFrsuE",{"id":1338,"title":1339,"author":6,"body":1340,"category":1325,"date":2406,"description":2407,"extension":245,"image":2408,"meta":2409,"navigation":248,"path":2410,"readingTime":911,"seo":2411,"stem":2412,"tags":2413,"updatedAt":6,"__hash__":2414},"blog/blog/cloud-sms-otp-guide.md","مستندات Cloud SMS OTP رسانکس",{"type":8,"value":1341,"toc":2380},[1342,1344,1347,1349,1352,1381,1383,1402,1404,1426,1428,1440,1442,1444,1470,1483,1487,1569,1575,1691,1693,1739,1741,1743,1771,1781,1783,1849,1856,1860,1932,1936,1967,1978,1980,1982,2066,2068,2144,2146,2254,2256,2336,2340,2375,2378],[11,1343,265],{"id":264},[16,1345,1346],{},"این صفحه دقیقا نشان می‌دهد Cloud SMS OTP را چگونه در رسانکس تنظیم کنید و از سیستم خودتان به Endpoint رسمی درخواست بزنید.",[11,1348,272],{"id":271},[16,1350,1351],{},"مسیرها را به همین ترتیب انجام دهید:",[24,1353,1354,1360,1366,1370,1375],{},[27,1355,1356,1357],{},"تنظیم سرویس‌دهنده پیامکی: ",[69,1358,1359],{},"/app/sms-otp/providers",[27,1361,1362,1363],{},"تنظیم صف پشتیبان: ",[69,1364,1365],{},"/app/sms-otp/routing",[27,1367,292,1368],{},[69,1369,295],{},[27,1371,298,1372],{},[69,1373,1374],{},"/app/webservice/sms_otp",[27,1376,1377,1378],{},"بررسی گزارش ارسال: ",[69,1379,1380],{},"/app/sms-otp/logs",[11,1382,311],{"id":310},[24,1384,1385,1390,1394,1397,1400],{},[27,1386,316,1387,320],{},[69,1388,1389],{},"sms_otp",[27,1391,316,1392,320],{},[69,1393,325],{},[27,1395,1396],{},"حداقل یک سرویس‌دهنده پیامکی تنظیم و فعال شده باشد.",[27,1398,1399],{},"برای سرویس‌دهنده فعال، نام الگوی OTP ثبت شده باشد.",[27,1401,331],{},[11,1403,335],{"id":334},[63,1405,1406,1412,1419],{},[27,1407,1408,343,1410],{},[69,1409,342],{},[69,1411,346],{},[27,1413,1414,343,1416],{},[69,1415,351],{},[69,1417,1418],{},"/v1/sms-otp/send",[27,1420,1421,343,1423],{},[69,1422,359],{},[69,1424,1425],{},"https://api.rasanex.com/v1/sms-otp/send",[11,1427,366],{"id":365},[368,1429,1430],{"className":370,"code":371,"filename":372,"language":373,"meta":221,"style":221},[69,1431,1432,1436],{"__ignoreMap":221},[377,1433,1434],{"class":379,"line":380},[377,1435,383],{},[377,1437,1438],{"class":379,"line":222},[377,1439,388],{},[11,1441,392],{"id":391},[16,1443,395],{},[63,1445,1446,1451,1456,1461,1466],{},[27,1447,1448,1450],{},[69,1449,402],{}," اجباری: شماره مقصد",[27,1452,1453,1455],{},[69,1454,69],{}," اختیاری: کد OTP",[27,1457,1458,1460],{},[69,1459,413],{}," اختیاری: پارامترهای پویا",[27,1462,1463,1465],{},[69,1464,419],{}," اختیاری: جلوگیری از ارسال تکراری",[27,1467,1468,426],{},[69,1469,425],{},[16,1471,1472,1473,1475,1476,1478,1479,1482],{},"نکته مهم: در این API باید حداقل یکی از ",[69,1474,69],{}," یا ",[69,1477,413],{}," را بفرستید. اگر هیچ‌کدام ارسال نشود، خطای ",[69,1480,1481],{},"422"," می‌گیرید.",[89,1484,1486],{"id":1485},"نمونه-استاندارد-پیشنهادی","نمونه استاندارد (پیشنهادی)",[368,1488,1490],{"className":429,"code":1489,"filename":431,"language":432,"meta":221,"style":221},"{\n  \"phone\": \"09120000000\",\n  \"code\": \"4821\",\n  \"options\": {\n    \"idempotency_key\": \"sms-otp-login-20260411-01\"\n  }\n}\n",[69,1491,1492,1496,1514,1532,1544,1561,1565],{"__ignoreMap":221},[377,1493,1494],{"class":379,"line":380},[377,1495,440],{"class":439},[377,1497,1498,1500,1502,1504,1506,1508,1510,1512],{"class":379,"line":222},[377,1499,445],{"class":439},[377,1501,402],{"class":448},[377,1503,451],{"class":439},[377,1505,454],{"class":439},[377,1507,457],{"class":439},[377,1509,461],{"class":460},[377,1511,451],{"class":439},[377,1513,466],{"class":439},[377,1515,1516,1518,1520,1522,1524,1526,1528,1530],{"class":379,"line":230},[377,1517,445],{"class":439},[377,1519,69],{"class":448},[377,1521,451],{"class":439},[377,1523,454],{"class":439},[377,1525,457],{"class":439},[377,1527,481],{"class":460},[377,1529,451],{"class":439},[377,1531,466],{"class":439},[377,1533,1534,1536,1538,1540,1542],{"class":379,"line":488},[377,1535,445],{"class":439},[377,1537,493],{"class":448},[377,1539,451],{"class":439},[377,1541,454],{"class":439},[377,1543,500],{"class":439},[377,1545,1546,1548,1550,1552,1554,1556,1559],{"class":379,"line":503},[377,1547,506],{"class":439},[377,1549,510],{"class":509},[377,1551,451],{"class":439},[377,1553,454],{"class":439},[377,1555,457],{"class":439},[377,1557,1558],{"class":460},"sms-otp-login-20260411-01",[377,1560,522],{"class":439},[377,1562,1563],{"class":379,"line":525},[377,1564,528],{"class":439},[377,1566,1567],{"class":379,"line":531},[377,1568,534],{"class":439},[89,1570,1572,1573],{"id":1571},"نمونه-با-params","نمونه با ",[69,1574,413],{},[368,1576,1579],{"className":429,"code":1577,"filename":1578,"language":432,"meta":221,"style":221},"{\n  \"phone\": \"09120000000\",\n  \"params\": {\n    \"token\": \"4821\",\n    \"code\": \"4821\"\n  },\n  \"options\": {\n    \"idempotency_key\": \"sms-otp-login-20260411-02\"\n  }\n}\n","request-with-params.json",[69,1580,1581,1585,1603,1615,1634,1650,1654,1666,1683,1687],{"__ignoreMap":221},[377,1582,1583],{"class":379,"line":380},[377,1584,440],{"class":439},[377,1586,1587,1589,1591,1593,1595,1597,1599,1601],{"class":379,"line":222},[377,1588,445],{"class":439},[377,1590,402],{"class":448},[377,1592,451],{"class":439},[377,1594,454],{"class":439},[377,1596,457],{"class":439},[377,1598,461],{"class":460},[377,1600,451],{"class":439},[377,1602,466],{"class":439},[377,1604,1605,1607,1609,1611,1613],{"class":379,"line":230},[377,1606,445],{"class":439},[377,1608,413],{"class":448},[377,1610,451],{"class":439},[377,1612,454],{"class":439},[377,1614,500],{"class":439},[377,1616,1617,1619,1622,1624,1626,1628,1630,1632],{"class":379,"line":488},[377,1618,506],{"class":439},[377,1620,1621],{"class":509},"token",[377,1623,451],{"class":439},[377,1625,454],{"class":439},[377,1627,457],{"class":439},[377,1629,481],{"class":460},[377,1631,451],{"class":439},[377,1633,466],{"class":439},[377,1635,1636,1638,1640,1642,1644,1646,1648],{"class":379,"line":503},[377,1637,506],{"class":439},[377,1639,69],{"class":509},[377,1641,451],{"class":439},[377,1643,454],{"class":439},[377,1645,457],{"class":439},[377,1647,481],{"class":460},[377,1649,522],{"class":439},[377,1651,1652],{"class":379,"line":525},[377,1653,963],{"class":439},[377,1655,1656,1658,1660,1662,1664],{"class":379,"line":531},[377,1657,445],{"class":439},[377,1659,493],{"class":448},[377,1661,451],{"class":439},[377,1663,454],{"class":439},[377,1665,500],{"class":439},[377,1667,1668,1670,1672,1674,1676,1678,1681],{"class":379,"line":799},[377,1669,506],{"class":439},[377,1671,510],{"class":509},[377,1673,451],{"class":439},[377,1675,454],{"class":439},[377,1677,457],{"class":439},[377,1679,1680],{"class":460},"sms-otp-login-20260411-02",[377,1682,522],{"class":439},[377,1684,1685],{"class":379,"line":905},[377,1686,528],{"class":439},[377,1688,1689],{"class":379,"line":911},[377,1690,534],{"class":439},[11,1692,538],{"id":537},[368,1694,1695],{"className":429,"code":541,"filename":542,"language":432,"meta":221,"style":221},[69,1696,1697,1701,1719,1735],{"__ignoreMap":221},[377,1698,1699],{"class":379,"line":380},[377,1700,440],{"class":439},[377,1702,1703,1705,1707,1709,1711,1713,1715,1717],{"class":379,"line":222},[377,1704,445],{"class":439},[377,1706,555],{"class":448},[377,1708,451],{"class":439},[377,1710,454],{"class":439},[377,1712,457],{"class":439},[377,1714,564],{"class":460},[377,1716,451],{"class":439},[377,1718,466],{"class":439},[377,1720,1721,1723,1725,1727,1729,1731,1733],{"class":379,"line":230},[377,1722,445],{"class":439},[377,1724,575],{"class":448},[377,1726,451],{"class":439},[377,1728,454],{"class":439},[377,1730,457],{"class":439},[377,1732,584],{"class":460},[377,1734,522],{"class":439},[377,1736,1737],{"class":379,"line":488},[377,1738,534],{"class":439},[11,1740,594],{"id":593},[89,1742,598],{"id":597},[368,1744,1745],{"className":429,"code":601,"filename":602,"language":432,"meta":221,"style":221},[69,1746,1747,1751,1767],{"__ignoreMap":221},[377,1748,1749],{"class":379,"line":380},[377,1750,440],{"class":439},[377,1752,1753,1755,1757,1759,1761,1763,1765],{"class":379,"line":222},[377,1754,445],{"class":439},[377,1756,615],{"class":448},[377,1758,451],{"class":439},[377,1760,454],{"class":439},[377,1762,457],{"class":439},[377,1764,624],{"class":460},[377,1766,522],{"class":439},[377,1768,1769],{"class":379,"line":230},[377,1770,534],{"class":439},[16,1772,1773,1774,1776,1777,1780],{},"اقدام: ",[69,1775,636],{}," را با ",[69,1778,1779],{},"Bearer"," و API Key معتبر دوباره ارسال کنید.",[89,1782,641],{"id":640},[368,1784,1786],{"className":429,"code":1785,"filename":645,"language":432,"meta":221,"style":221},"{\n  \"error\": \"Webservice module must be enabled to use sms_otp webservice APIs.\",\n  \"module_id\": \"webservice\",\n  \"code\": \"module_disabled\"\n}\n",[69,1787,1788,1792,1811,1829,1845],{"__ignoreMap":221},[377,1789,1790],{"class":379,"line":380},[377,1791,440],{"class":439},[377,1793,1794,1796,1798,1800,1802,1804,1807,1809],{"class":379,"line":222},[377,1795,445],{"class":439},[377,1797,658],{"class":448},[377,1799,451],{"class":439},[377,1801,454],{"class":439},[377,1803,457],{"class":439},[377,1805,1806],{"class":460},"Webservice module must be enabled to use sms_otp webservice APIs.",[377,1808,451],{"class":439},[377,1810,466],{"class":439},[377,1812,1813,1815,1817,1819,1821,1823,1825,1827],{"class":379,"line":230},[377,1814,445],{"class":439},[377,1816,678],{"class":448},[377,1818,451],{"class":439},[377,1820,454],{"class":439},[377,1822,457],{"class":439},[377,1824,325],{"class":460},[377,1826,451],{"class":439},[377,1828,466],{"class":439},[377,1830,1831,1833,1835,1837,1839,1841,1843],{"class":379,"line":488},[377,1832,445],{"class":439},[377,1834,69],{"class":448},[377,1836,451],{"class":439},[377,1838,454],{"class":439},[377,1840,457],{"class":439},[377,1842,705],{"class":460},[377,1844,522],{"class":439},[377,1846,1847],{"class":379,"line":503},[377,1848,534],{"class":439},[16,1850,1851,1852,215,1854,719],{},"اقدام: در پنل، فعال بودن ",[69,1853,1389],{},[69,1855,325],{},[89,1857,1859],{"id":1858},"_422-بدنه-نامعتبر-نمونه-۱-خطای-ولیدیشن","422 - بدنه نامعتبر (نمونه ۱: خطای ولیدیشن)",[368,1861,1863],{"className":429,"code":1862,"filename":727,"language":432,"meta":221,"style":221},"{\n  \"message\": \"The phone field is required.\",\n  \"errors\": {\n    \"phone\": [\n      \"The phone field is required.\"\n    ]\n  }\n}\n",[69,1864,1865,1869,1888,1900,1912,1920,1924,1928],{"__ignoreMap":221},[377,1866,1867],{"class":379,"line":380},[377,1868,440],{"class":439},[377,1870,1871,1873,1875,1877,1879,1881,1884,1886],{"class":379,"line":222},[377,1872,445],{"class":439},[377,1874,615],{"class":448},[377,1876,451],{"class":439},[377,1878,454],{"class":439},[377,1880,457],{"class":439},[377,1882,1883],{"class":460},"The phone field is required.",[377,1885,451],{"class":439},[377,1887,466],{"class":439},[377,1889,1890,1892,1894,1896,1898],{"class":379,"line":230},[377,1891,445],{"class":439},[377,1893,759],{"class":448},[377,1895,451],{"class":439},[377,1897,454],{"class":439},[377,1899,500],{"class":439},[377,1901,1902,1904,1906,1908,1910],{"class":379,"line":488},[377,1903,506],{"class":439},[377,1905,402],{"class":509},[377,1907,451],{"class":439},[377,1909,454],{"class":439},[377,1911,778],{"class":439},[377,1913,1914,1916,1918],{"class":379,"line":503},[377,1915,783],{"class":439},[377,1917,1883],{"class":460},[377,1919,522],{"class":439},[377,1921,1922],{"class":379,"line":525},[377,1923,792],{"class":439},[377,1925,1926],{"class":379,"line":531},[377,1927,528],{"class":439},[377,1929,1930],{"class":379,"line":799},[377,1931,534],{"class":439},[89,1933,1935],{"id":1934},"_422-بدنه-نامعتبر-نمونه-۲-خطای-قواعد-ماژول","422 - بدنه نامعتبر (نمونه ۲: خطای قواعد ماژول)",[368,1937,1940],{"className":429,"code":1938,"filename":1939,"language":432,"meta":221,"style":221},"{\n  \"message\": \"Either code or params is required.\"\n}\n","422-business-rule.json",[69,1941,1942,1946,1963],{"__ignoreMap":221},[377,1943,1944],{"class":379,"line":380},[377,1945,440],{"class":439},[377,1947,1948,1950,1952,1954,1956,1958,1961],{"class":379,"line":222},[377,1949,445],{"class":439},[377,1951,615],{"class":448},[377,1953,451],{"class":439},[377,1955,454],{"class":439},[377,1957,457],{"class":439},[377,1959,1960],{"class":460},"Either code or params is required.",[377,1962,522],{"class":439},[377,1964,1965],{"class":379,"line":230},[377,1966,534],{"class":439},[16,1968,1969,1970,1972,1973,1475,1975,1977],{},"اقدام: فیلد ",[69,1971,402],{}," را همیشه بفرستید و علاوه بر آن حداقل یکی از ",[69,1974,69],{},[69,1976,413],{}," را ارسال کنید.",[11,1979,813],{"id":812},[89,1981,817],{"id":816},[368,1983,1986],{"className":820,"code":1984,"filename":1985,"language":823,"meta":221,"style":221},"curl --request POST \\\n  --url https://api.rasanex.com/v1/sms-otp/send \\\n  --header 'Authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"phone\": \"09120000000\",\n    \"code\": \"4821\",\n    \"options\": {\n      \"idempotency_key\": \"sms-otp-login-20260411-01\"\n    }\n  }'\n","send-sms-otp.sh",[69,1987,1988,1998,2007,2019,2031,2039,2043,2047,2051,2056,2060],{"__ignoreMap":221},[377,1989,1990,1992,1994,1996],{"class":379,"line":380},[377,1991,816],{"class":509},[377,1993,832],{"class":460},[377,1995,835],{"class":460},[377,1997,839],{"class":838},[377,1999,2000,2002,2005],{"class":379,"line":222},[377,2001,844],{"class":460},[377,2003,2004],{"class":460}," https://api.rasanex.com/v1/sms-otp/send",[377,2006,839],{"class":838},[377,2008,2009,2011,2013,2015,2017],{"class":379,"line":230},[377,2010,854],{"class":460},[377,2012,857],{"class":439},[377,2014,860],{"class":460},[377,2016,863],{"class":439},[377,2018,839],{"class":838},[377,2020,2021,2023,2025,2027,2029],{"class":379,"line":488},[377,2022,854],{"class":460},[377,2024,857],{"class":439},[377,2026,874],{"class":460},[377,2028,863],{"class":439},[377,2030,839],{"class":838},[377,2032,2033,2035,2037],{"class":379,"line":503},[377,2034,883],{"class":460},[377,2036,857],{"class":439},[377,2038,440],{"class":460},[377,2040,2041],{"class":379,"line":525},[377,2042,892],{"class":460},[377,2044,2045],{"class":379,"line":531},[377,2046,897],{"class":460},[377,2048,2049],{"class":379,"line":799},[377,2050,902],{"class":460},[377,2052,2053],{"class":379,"line":905},[377,2054,2055],{"class":460},"      \"idempotency_key\": \"sms-otp-login-20260411-01\"\n",[377,2057,2058],{"class":379,"line":911},[377,2059,914],{"class":460},[377,2061,2062,2064],{"class":379,"line":250},[377,2063,919],{"class":460},[377,2065,922],{"class":439},[89,2067,926],{"id":925},[368,2069,2072],{"className":929,"code":2070,"filename":2071,"language":925,"meta":221,"style":221},"const response = await fetch('https://api.rasanex.com/v1/sms-otp/send', {\n  method: 'POST',\n  headers: {\n    Authorization: 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    phone: '09120000000',\n    code: '4821',\n    options: {\n      idempotency_key: 'sms-otp-login-20260411-01'\n    }\n  })\n})\n\nconst data = await response.json()\nconsole.log(data)\n","sendSmsOtp.js",[69,2073,2074,2079,2083,2087,2091,2095,2099,2103,2107,2111,2115,2120,2124,2128,2132,2136,2140],{"__ignoreMap":221},[377,2075,2076],{"class":379,"line":380},[377,2077,2078],{},"const response = await fetch('https://api.rasanex.com/v1/sms-otp/send', {\n",[377,2080,2081],{"class":379,"line":222},[377,2082,943],{},[377,2084,2085],{"class":379,"line":230},[377,2086,948],{},[377,2088,2089],{"class":379,"line":488},[377,2090,953],{},[377,2092,2093],{"class":379,"line":503},[377,2094,958],{},[377,2096,2097],{"class":379,"line":525},[377,2098,963],{},[377,2100,2101],{"class":379,"line":531},[377,2102,968],{},[377,2104,2105],{"class":379,"line":799},[377,2106,973],{},[377,2108,2109],{"class":379,"line":905},[377,2110,978],{},[377,2112,2113],{"class":379,"line":911},[377,2114,983],{},[377,2116,2117],{"class":379,"line":250},[377,2118,2119],{},"      idempotency_key: 'sms-otp-login-20260411-01'\n",[377,2121,2122],{"class":379,"line":991},[377,2123,914],{},[377,2125,2126],{"class":379,"line":996},[377,2127,999],{},[377,2129,2130],{"class":379,"line":1002},[377,2131,1005],{},[377,2133,2134],{"class":379,"line":1008},[377,2135,1011],{"emptyLinePlaceholder":248},[377,2137,2138],{"class":379,"line":1014},[377,2139,1017],{},[377,2141,2142],{"class":379,"line":1020},[377,2143,1023],{},[89,2145,1027],{"id":1026},[368,2147,2150],{"className":1030,"code":2148,"filename":2149,"language":1026,"meta":221,"style":221},"\u003C?php\n\n$payload = [\n    'phone' => '09120000000',\n    'code' => '4821',\n    'options' => [\n        'idempotency_key' => 'sms-otp-login-20260411-01',\n    ],\n];\n\n$ch = curl_init('https://api.rasanex.com/v1/sms-otp/send');\ncurl_setopt_array($ch, [\n    CURLOPT_RETURNTRANSFER => true,\n    CURLOPT_POST => true,\n    CURLOPT_HTTPHEADER => [\n        'Authorization: Bearer YOUR_API_KEY',\n        'Content-Type: application/json',\n    ],\n    CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),\n]);\n\n$result = curl_exec($ch);\ncurl_close($ch);\n\necho $result;\n","send_sms_otp.php",[69,2151,2152,2156,2160,2164,2168,2172,2176,2181,2185,2189,2193,2198,2202,2206,2210,2214,2218,2222,2226,2230,2234,2238,2242,2246,2250],{"__ignoreMap":221},[377,2153,2154],{"class":379,"line":380},[377,2155,1039],{},[377,2157,2158],{"class":379,"line":222},[377,2159,1011],{"emptyLinePlaceholder":248},[377,2161,2162],{"class":379,"line":230},[377,2163,1048],{},[377,2165,2166],{"class":379,"line":488},[377,2167,1053],{},[377,2169,2170],{"class":379,"line":503},[377,2171,1058],{},[377,2173,2174],{"class":379,"line":525},[377,2175,1063],{},[377,2177,2178],{"class":379,"line":531},[377,2179,2180],{},"        'idempotency_key' => 'sms-otp-login-20260411-01',\n",[377,2182,2183],{"class":379,"line":799},[377,2184,1073],{},[377,2186,2187],{"class":379,"line":905},[377,2188,1078],{},[377,2190,2191],{"class":379,"line":911},[377,2192,1011],{"emptyLinePlaceholder":248},[377,2194,2195],{"class":379,"line":250},[377,2196,2197],{},"$ch = curl_init('https://api.rasanex.com/v1/sms-otp/send');\n",[377,2199,2200],{"class":379,"line":991},[377,2201,1092],{},[377,2203,2204],{"class":379,"line":996},[377,2205,1097],{},[377,2207,2208],{"class":379,"line":1002},[377,2209,1102],{},[377,2211,2212],{"class":379,"line":1008},[377,2213,1107],{},[377,2215,2216],{"class":379,"line":1014},[377,2217,1112],{},[377,2219,2220],{"class":379,"line":1020},[377,2221,1117],{},[377,2223,2224],{"class":379,"line":1120},[377,2225,1073],{},[377,2227,2228],{"class":379,"line":1125},[377,2229,1128],{},[377,2231,2232],{"class":379,"line":1131},[377,2233,1134],{},[377,2235,2236],{"class":379,"line":1137},[377,2237,1011],{"emptyLinePlaceholder":248},[377,2239,2240],{"class":379,"line":1142},[377,2241,1145],{},[377,2243,2244],{"class":379,"line":1148},[377,2245,1151],{},[377,2247,2248],{"class":379,"line":1154},[377,2249,1011],{"emptyLinePlaceholder":248},[377,2251,2252],{"class":379,"line":1159},[377,2253,1162],{},[89,2255,1166],{"id":1165},[368,2257,2260],{"className":1169,"code":2258,"filename":2259,"language":1165,"meta":221,"style":221},"import requests\n\nurl = 'https://api.rasanex.com/v1/sms-otp/send'\nheaders = {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json',\n}\npayload = {\n    'phone': '09120000000',\n    'code': '4821',\n    'options': {\n        'idempotency_key': 'sms-otp-login-20260411-01'\n    }\n}\n\nresponse = requests.post(url, json=payload, headers=headers, timeout=20)\nprint(response.status_code)\nprint(response.json())\n","send_sms_otp.py",[69,2261,2262,2266,2270,2275,2279,2283,2287,2291,2295,2299,2303,2307,2312,2316,2320,2324,2328,2332],{"__ignoreMap":221},[377,2263,2264],{"class":379,"line":380},[377,2265,1178],{},[377,2267,2268],{"class":379,"line":222},[377,2269,1011],{"emptyLinePlaceholder":248},[377,2271,2272],{"class":379,"line":230},[377,2273,2274],{},"url = 'https://api.rasanex.com/v1/sms-otp/send'\n",[377,2276,2277],{"class":379,"line":488},[377,2278,1192],{},[377,2280,2281],{"class":379,"line":503},[377,2282,1197],{},[377,2284,2285],{"class":379,"line":525},[377,2286,1202],{},[377,2288,2289],{"class":379,"line":531},[377,2290,534],{},[377,2292,2293],{"class":379,"line":799},[377,2294,1211],{},[377,2296,2297],{"class":379,"line":905},[377,2298,1216],{},[377,2300,2301],{"class":379,"line":911},[377,2302,1221],{},[377,2304,2305],{"class":379,"line":250},[377,2306,1226],{},[377,2308,2309],{"class":379,"line":991},[377,2310,2311],{},"        'idempotency_key': 'sms-otp-login-20260411-01'\n",[377,2313,2314],{"class":379,"line":996},[377,2315,914],{},[377,2317,2318],{"class":379,"line":1002},[377,2319,534],{},[377,2321,2322],{"class":379,"line":1008},[377,2323,1011],{"emptyLinePlaceholder":248},[377,2325,2326],{"class":379,"line":1014},[377,2327,1248],{},[377,2329,2330],{"class":379,"line":1020},[377,2331,1253],{},[377,2333,2334],{"class":379,"line":1120},[377,2335,1258],{},[11,2337,2339],{"id":2338},"روال-پیشنهادی-برای-جلوگیری-از-خطا","روال پیشنهادی برای جلوگیری از خطا",[24,2341,2342,2345,2351,2357,2367],{},[27,2343,2344],{},"ابتدا در پنل، سرویس‌دهنده و نام الگو را کامل تنظیم کنید.",[27,2346,2347,2348,2350],{},"سپس در ",[69,2349,1365],{}," صف پشتیبان را ذخیره کنید.",[27,2352,2353,2354,2356],{},"بعد API Key را از ",[69,2355,295],{}," بگیرید.",[27,2358,2359,2360,2363,2364,2366],{},"در سیستم خودتان هنگام ",[69,2361,2362],{},"retry"," همان ",[69,2365,510],{}," را تکرار کنید.",[27,2368,2369,2370,1293,2372,2374],{},"نتیجه ارسال را با ",[69,2371,555],{},[69,2373,1380],{}," بررسی کنید.",[16,2376,2377],{},"اگر این ترتیب رعایت شود، خطاهای عملیاتی به‌صورت محسوسی کمتر می‌شود.",[1301,2379,1303],{},{"title":221,"searchDepth":222,"depth":222,"links":2381},[2382,2383,2384,2385,2386,2387,2392,2393,2399,2405],{"id":264,"depth":222,"text":265},{"id":271,"depth":222,"text":272},{"id":310,"depth":222,"text":311},{"id":334,"depth":222,"text":335},{"id":365,"depth":222,"text":366},{"id":391,"depth":222,"text":392,"children":2388},[2389,2390],{"id":1485,"depth":230,"text":1486},{"id":1571,"depth":230,"text":2391},"نمونه با params",{"id":537,"depth":222,"text":538},{"id":593,"depth":222,"text":594,"children":2394},[2395,2396,2397,2398],{"id":597,"depth":230,"text":598},{"id":640,"depth":230,"text":641},{"id":1858,"depth":230,"text":1859},{"id":1934,"depth":230,"text":1935},{"id":812,"depth":222,"text":813,"children":2400},[2401,2402,2403,2404],{"id":816,"depth":230,"text":817},{"id":925,"depth":230,"text":926},{"id":1026,"depth":230,"text":1027},{"id":1165,"depth":230,"text":1166},{"id":2338,"depth":222,"text":2339},"2026-04-11","راهنمای رسمی راه‌اندازی و استفاده از Cloud SMS OTP در رسانکس با مسیرهای دقیق پنل، Endpoint واقعی، نمونه درخواست و مدیریت خطا.","/images/blog/cloud-sms-otp-guide.svg",{},"/blog/cloud-sms-otp-guide",{"title":1339,"description":2407},"blog/cloud-sms-otp-guide",[214,1334,1335],"BVXkxGjNcbQA-7a9Kh6KvaZlsvGodbZf_3ukRner6Pc",{"id":4,"title":5,"author":6,"body":2416,"category":242,"date":243,"description":244,"extension":245,"image":246,"meta":2563,"navigation":248,"path":249,"readingTime":250,"seo":2564,"stem":252,"tags":2565,"updatedAt":6,"__hash__":255},{"type":8,"value":2417,"toc":2544},[2418,2420,2422,2424,2446,2448,2460,2462,2464,2466,2468,2470,2472,2474,2476,2484,2486,2488,2490,2504,2506,2508,2510,2512,2514,2516,2518,2520,2536,2538],[11,2419,14],{"id":13},[16,2421,18],{},[11,2423,22],{"id":21},[24,2425,2426,2430,2434,2438,2442],{},[27,2427,2428,33],{},[30,2429,32],{},[27,2431,2432,39],{},[30,2433,38],{},[27,2435,2436,45],{},[30,2437,44],{},[27,2439,2440,51],{},[30,2441,50],{},[27,2443,2444,57],{},[30,2445,56],{},[11,2447,61],{"id":60},[63,2449,2450,2454,2458],{},[27,2451,67,2452],{},[69,2453,71],{},[27,2455,74,2456],{},[69,2457,77],{},[27,2459,80],{},[16,2461,83],{},[11,2463,87],{"id":86},[89,2465,92],{"id":91},[16,2467,95],{},[89,2469,99],{"id":98},[16,2471,102],{},[89,2473,106],{"id":105},[16,2475,109],{},[63,2477,2478,2480,2482],{},[27,2479,114],{},[27,2481,117],{},[27,2483,120],{},[89,2485,124],{"id":123},[16,2487,127],{},[11,2489,131],{"id":130},[24,2491,2492,2494,2496,2498,2500,2502],{},[27,2493,136],{},[27,2495,139],{},[27,2497,142],{},[27,2499,145],{},[27,2501,148],{},[27,2503,151],{},[11,2505,155],{"id":154},[89,2507,159],{"id":158},[16,2509,162],{},[89,2511,166],{"id":165},[16,2513,169],{},[89,2515,173],{"id":172},[16,2517,176],{},[11,2519,180],{"id":179},[24,2521,2522,2526,2528,2532,2534],{},[27,2523,2524,188],{},[69,2525,187],{},[27,2527,191],{},[27,2529,194,2530,198],{},[69,2531,197],{},[27,2533,201],{},[27,2535,204],{},[11,2537,208],{"id":207},[16,2539,211,2540,215,2542,219],{},[69,2541,214],{},[69,2543,218],{},{"title":221,"searchDepth":222,"depth":222,"links":2545},[2546,2547,2548,2549,2555,2556,2561,2562],{"id":13,"depth":222,"text":14},{"id":21,"depth":222,"text":22},{"id":60,"depth":222,"text":61},{"id":86,"depth":222,"text":87,"children":2550},[2551,2552,2553,2554],{"id":91,"depth":230,"text":92},{"id":98,"depth":230,"text":99},{"id":105,"depth":230,"text":106},{"id":123,"depth":230,"text":124},{"id":130,"depth":222,"text":131},{"id":154,"depth":222,"text":155,"children":2557},[2558,2559,2560],{"id":158,"depth":230,"text":159},{"id":165,"depth":230,"text":166},{"id":172,"depth":230,"text":173},{"id":179,"depth":222,"text":180},{"id":207,"depth":222,"text":208},{},{"title":5,"description":244},[254,214,218],1793454558048]