خانه / لیست مقالات /

دستورالعمل فنی صدور صورتحساب الکترونیکی آبان 1403



دستورالعمل فنی صدور صورتحساب الکترونیکی آبان 1403-عکس
دستورالعمل فنی صدور صورتحساب الکترونیکی آبان 1403
pre{ max-width: 90%; text-wrap: unset; word-break: break-all; } table{ max-width: 90%; } pre code { font-size: inherit; color: inherit; word-break: …
تاریخ نگارش : 1402/11/27 توسط : تیم سامانه لیمو

دستورالعمل فنی نحوه اتصال به سامانه مودیان


مقدمه

در این سند نحوه اتصال به سامانه مودیان، دریافت اطلاعات مورد نیاز جهت پیکربندی پایانه فروشگاهی- حافظه مالیاتی، ارسال اطلاعات صورتحساب الکترونیکی و استعلام وضعیت صورتحساب های ارسالی شرح داده شده است. برای ارسال اطلاعات صورتحساب الکترونیکی از مکانیزم غیر همگام و برای دریافت و استعلام اطلاعات از مکانیزم همگام استفاده شده است. برای هر کدام از این مکانیزم ها، API مستقلی در نظر گرفته شده است. برای مکانیزم غیرهمگام از صف استفاده میشود. در کلیه مراحل استفاده از API، اصول امنیت اطلاعات شامل احراز هویت و سطح دسترسی ارسال کننده،محرمانگی، انکارناپذیری و یکپارچگی رعایت شده است.

هدف

این سند با هدف تشریح نحوه اتصال به سامانه مودیان ارائه شده است. در این سند مراحل اتصال به سامانه مودیان شامل دریافت اطلاعات مورد نیاز جهت پیکربندی پایانه فروشگاهی-حافظه مالیاتی، ارسال اطلاعات صورتحساب الکترونیکی و استعلام وضعیت صورتحسابهای ارسالی به صورت گام به گام و همراه با جزئیات فنی مورد نیاز برای پیادهسازی آن توسط کلیه ذینفعان ارائه شده است.

دامنه كاربرد

ذینفعان این سند شامل:

  • اشخاص مشمول (مودیان.)
  • شرکت های معتمد ارائه کننده خدمات مالیاتی نوع اول
  • شناسه یکتای حافظه مالیاتیشناسه ای است یکتا دارای مقداری ثابت و منحصر به فرد که به هر حافظه مالیاتی در سطح کشور اختصاص داده می شود، این شناسه از مولفه های تشکیل دهنده شماره منحصر به فرد مالیاتی است که پس از درخواست مودی در کارپوشه تولید و در اختیار وی قرار خواهد گرفت.
  • شماره منحصربه فردمالیاتیشماره ای است یکتا در سامانه مودیان که به ازای هر صورتحساب تولید شده و به صورت منحصر به فرد به آن صورتحساب تخصیص داده می شود. این شماره دارای بخش های اطلاعاتی خاص بوده که جزئیات آن در سند «قالب شناسه یکتای حافظه مالیاتی و شماره منحصر به فرد مالیاتی» ذکر شده است.
  • صورتحساب الکترونیکی: صورتحسابی است دارای شماره منحصر به فرد مالیاتی که اطلاعات مندرج در آن، در حافظه مالیاتی فروشنده ذخیره می شود. مشخصات و اقلام اطلاعاتی صورتحساب الکترونیکی، متناسب با نوع کسب و کار توسط سازمان تعیین و اعلام شده است. در مواردی که از دستگاه کارتخوان بانکی یا درگاه پرداخت الکترونیکی به عنوان پایانه فروشگاهی استفاده شود، رسید یا گزارش الکترونیکی پرداخت خرید صادره در حکم صورتحساب الکترونیکی است.
  • حافظه مالیاتینوعی حافظه الکترونیکی است که برای ثبت و نگهداری اطلاعات مندرج در صورتحساب های الکترونیکی و انتقال آن به سامانه مودیان مورد استفاده قرار می گیرد. حافظه مالیاتی می تواند به شکل سخت افزاری یا نرم افزاری باشد. حافظه مالیاتی، توسط مودی برای ثبت صورتحساب الکترونیکی مورد استفاده قرار می گیرد. هر حافظه مالیاتی باید دارای شماره شناسه یکتا باشد. شناسه یکتای حافظه مالیاتی توسط سازمان اختصاص داده می شود.
  • پایانه فروشگاهی: رایانه، دستگاه کارتخوان بانکی، درگاه پرداخت الکترونیکی یا هر وسیله دیگری که امکان اتصال به شبکه های الکترونیکی پرداخت رسمی کشور و سامانه مودیان را داشته و از قابلیت صدور صورتحساب الکترونیکی برخوردار باشد)بند ب ماده 1 قانون.)
  • شرکت های معتمدارائه کننده خدمات مالیاتیاشخاص حقوقی دارای پروانه هستند که حسب ضوابط و دستورالعمل های ابلاغی سازمان، نسبت به ارائه مشاوره و آموزش ٰهای لازم به مودیان، نصب و پشتیبانی تجهیزات مورد نیاز برای ارائه خدمات مالیاتی از قبیل خدمات مربوط به صدور صورتحساب و سایر امور غیرحاکمیتی با سازمان همکاری می کند (بند چ ماده 1).
  • زیرسامانه جمع آوری و پردازش اطلاعات صورتحساب: زیرسامانه ای است که داده های ارسالی از پایانه های فروشگاهی-حافظه مالیاتی یا شرکت های معتمد ارائه کننده خدمات مالیاتی نوع اول را از طریق واسط های نرم افزاری دریافت می کند.
  • حد مجاز فروشجمع صورتحساب های الکترونیکی صادره توسط هر مودی در هر دوره مالیاتی نمی تواند بیشتر از سه برابر فروش اظهار شده وی در دوره مشابه سال قبل، که مالیات آن به سازمان پرداخت شده یا ترتیب پرداخت آن داده شده است، باشد. جمع صورتحساب های الکترونیکی صادر شده در هر دوره مالیاتی برای واحدهای جدیدالتاسیس یا واحدهای فاقد سابقه مالیاتی نمی تواند بیش از سه برابر معافیت سالانه موضوع ماده 101 قانون مالیات های مستقیم باشد (ماده 6 قانون پایانه های فروشگاهی و سامانه مودیان.)
  • شناسه یکتای ارسال صورتحسابشناسه ای یکتا که هنگام ارسال صورتحساب توسط ارسال کننده به صورتحساب جهت رهگیری آن اختصاص داده میشود. این شناسه با فرمت uuid3به صورت رمز نشده ارسال میگردد.
  • رسید یکتای دریاف تصورتحساب4 هنگام دریافت صورتحساب در زیرسامانه جمع آوری و پردازش اطلاعات، یک شناسه رسید یکتا با فرمت uuid به هر صورتحساب توسط این زیرسامانه اختصاص داده میشود.
  • لیست صورتحساب هامجموع های از صورتحسابهای صادر شده توسط پایانه فروشگاهی-حافظه مالیاتی که در قالب یک مجموعه به سامانه مودیان ارسال می شود.
  • کلاینتارسال کننده درخواست به API زیرسامانه جمع آوری و پردازش اطلاعات که می تواند مودی یا شرکت معتمد ارائه کننده خدمات مالیاتی باشد.
  • سرورسرور سامانه مودیان
  • زوج کلیدعمومی و خصوصیدر این سند هرگاه برای انکارناپذیری از کلید عمومی یا خصوصی استفاده می شود منظور کلیدی است که توسط یک مرکز میانی معتبر برای هر یک از ذینفعان سامانهمودیان گواهی شده باشد.
  • مرکز میانی معتبرهر مرکز میانی که از شورای سیاست گذاری گواهی الکترونیکی کشور مجوز گرفته باشد (موضوع ماده 32 قانون تجارت الکترونیکی.) لیست این مراکز از طریق سایت www.rca.gov.ir بخش مراکز میانی، قابل دسترسی است.

بیشتر بخوانید : صفر تا صد صدور و ارسال صورتحساب الکترونیکی

تعاریف

پیکربندی پایانه فروشگاهی-حافظه مالیاتی

دریافت شناسه یکتای حافظه مالیاتی

  • مودی جهت صدور و ارسال صورتحساب الکترونیکی نیاز به دریافت شناسه یکتا حافظه مالیاتی دارد. بنابراین می بایست به بخش عضویت و ثبت نام کارپوشه خود مراجعه نموده و مراحل زیر را طی نماید:

۱. به ازای هر شناسه یکتا حافظه مالیاتی، یکی از سه حالت ارسال اطلاعات صورتحساب را به شرحذیل انتخاب کند:

  • توسط خود مودی (به روش مستقیم)
  • ارسال اطلاعات صورتحساب توسط شرکت معتمد ارائه کننده خدمات مالیاتی (به روش غیرمستقیم)
  • ارسال اطلاعات صورتحساب توسط شرکت معتمد ارائه کننده خدمات مالیاتی (به روش غیرمستقیم و با استفاده از زیرساخت های اختصاصی)

۲. کلید عمومی RSA دریافتی از مراکز میانی معتبر با طول کلید 2048 بیت را بارگذاری نماید.

نکته: در صورتی که ارسال غیرمستقیم باشد و شرکت معتمد ارائه کننده خدمات مالیاتی صدور، رمزگذاری و ارسال صورتحساب را به عهده داشته باشد، بارگذاری کلید عمومی توسط مودی ضرورتی ندارد. در این حالت شرکت معتمد ارائه کننده خدمات مالیاتی باید از طریق کارپوشه خود، کلید عمومی مربوط را به سازمان معرفی نماید.

۳. ارتباط شناسه یکتای حافظه مالیاتی درخواستی با کدپستی(های) محل فعالیت تعیین گردد.

پیکربندی و ثبت مشخصات

مودی برای راه اندازی پایانه فروشگاهی-حافظه مالیاتی خود باید از طریق فراخوانی متدهای “دریافت اطلاعات سرور” و “دریافت اطلاعات حافظه مالیاتی”، شماره اقتصادی، نام تجاری، ساعت و تاریخ، کلید عمومی سازمان و شناسه یکتای حافظه مالیاتی را از سرور دریافت کند. جزئیات اقالم اطلاعاتی الزم در جدول 10 توضیح داده شده است.

بیشتر بخوانید : آموزش بارگزاری کلید عمومی در کارپوشه سامانه مودیان مالیاتی

امنیت اطلاعات

مکانیزم های امنیتی جهت ارسال صورتحساب مطابق با نمودار ارائه شده در شکل 1 است.

مکانیزم‌های امنیتی

توکن

با هدف احراز هویت و تعیین سطح دسترسی ارسال کننده اطلاعات، از مکانیزم تخصیص توکن5JWT استفاده شده است. لازم است توکن تخصیص داده شده به مودی یا شرکت معتمد ارائه کننده خدمات مالیاتی نوع اول در Header تمامی درخواست های ارسال شده مودی به API های زیرسامانه جمع آوری و پردازش اطلاعات قرار گیرد.

امضا

با هدف حفظ قابلیت انکارناپذیری، یکپارچگی و احراز هویت، بر روی تمامی درخواست ها به API های زیرسامانه جمع آوری و پردازش اطلاعات مکانیزم امضا در نظر گرفته شده است.

نرمال سازی درخواست

برای یکسان کردن ساختار تمامی درخواست ها به API های زیرسامانه جمع آوری اطلاعات، برای تمامی بسته های ارسالی شامل همگام و غیرهمگام امضا بر روی درخواست صورت می پذیرد. برای امضا می بایست ابتدا Header و Body درخواست ادغام و JSON واحد تولید گردد. ضروری است JSON تولید شده مطابق شکل 2 به رشته تبدیل، سپس امضا و ارسال شود.

دریافت رایگان کلید خصوصی و عمومی و گواهی امضا سامانه مودیان در کمتر از 5 دقیقه

نرمال سازی درخواست

فرآیند تبدیل JSON به رشته، مطابق گام های جدول 1 است:

شی به فرمت کلید-مقدار تبدیل شده به طوری که کلید، عمق جایگاه مقدار را مشخص می نماید.

کلیدها بر اساس حروف الفبا مرتب شوند.

سپس مقدارها به ترتیب با هم ادغام شوند:

  • از کاراکتر# به عنوان جداکننده مقادیر(اقلام اطلاعاتی) استفاده شود.
  • در صورتی که کاراکتر# در متن وجود داشته باشد، با ## مشخص می گردد.
  • در صورتی که مقدار فیلدی در رشته، null یا “” باشد؛ با ### مشخص می گردد.

در آخر آرایه ای از روی این رشته ایجاد می شود.

 

 

گام1

{

"k2":"v1",

"k4": "v2", "k3": { "k1": "v4",

"k5":"v5"}

}

 

"k2":"v1"

"k4":"v2"

"k3.k1":"v4"

"k3.K5":"v5"

 

گام2

"k2":"v1"

"k3.k1":"v4"

"k3.K5":"v5"

"k4":"v2"

گام3

v1#v4#v5#v2

جدول ۱. روش نرمالسازی JSON

نکات:

  • در صورتی که داخل JSON آرایه وجود داشته باشد، ترتیب عناصر آرایه دستکاری نشده و با همان ترتیب در نظر گرفته می شود.
  • در صورتی که ریشه JSON آرایه باشد، داخل فیلد packets قرارگرفته و تبدیل به شی می شود.

روش پیاده سازی نرمال سازی JSON در پیوست های 1-1 و 2-1 ارائه شده است.

فرآیند امضای صورتحساب

برای امضا صورتحساب باید اطلاعات JSON صورتحساب به روشی که برای نرمالسازی بیان شد نرمال شوند. به عنوان مثال اطلاعات JSON صورتحساب زیر را در نظر بگیرید:


"header" :
{
"taxid": "AA56CD0E0620002F2B4E78", "indatim": "1655620821274",
"indati2m": "1655620821274",
"inty": 2,
"inno" : "0002F2B4E7",
"irtaxid" : null, "inp": 1,
"ins" : 1,
"tins" : "32652362589632",
"tob" : 1,
"bid" : null,
"tinb" : null,
"sbc" : null,
"bpc" : null,
"bbc" : null,
"ft" : null,
"bpn" : null,
"scln" : null,
"scc" : null,
"crn" : null, "billid" : null, "tprdis" : 1000000,
"tdis" : 0,
"tadis" : 1000000,
"tvam" : 90000,
"todam" : 0,
"tbill" : 1090000,
"setm" : 1,
"cap" : 90000,
"insp" : 0,
"tvop" : 90000,
"dpvb" : null, "tax17" : null
}
"body" : [
{
"sstid" : 2153265989636,
",پاستیل میوه ای شیبابا" : "sstt" 96, : "mu"
"am" : 1,
"fee" : 1000000,
"cfee" :null,
"cut" : null,
"exr" : null, "prdis" : 1000000,
"dis" : 0,
"adis" : 1000000,
"vra" : 0.09,
"vam" : 90000,
"odt" : null,
"odr" : null,
"odam" : null,

 تمام اطلاعات پر شده در JSON غیر واقعی و تستی است.

بعد از نرمال سازی JSON صورتحساب مورد نظر، رشته نرمال شده به صورت زیر بدست می آید:

1000000#1#########90000###0###1000000#96#############1000000###2153265

پاستیل میوه ای 989636#

1#1655620821274#######90000###############0.09#90000#90000#1090000###شیبابا

655620821274#0002F2B4E7#1#1#0.0#2#########1#1000000###AA56CD0E0620002F2 B4E78#1090000#0###32652362589632#1#0.0#1000000#90000#90000#5656565#5646556 #6037 – 9972 – 9856 – 9865#1655620821274#null#54554224#544542424

رشته تولید شده در مراحل باال به وسیله کلید خصوصی (مودی/شرکت معتمد) با الگوریتم RSA2048-SHA256 هش و امضا می شود و خروجی آن در فیلد dataSignature در شی packet قرار می گیرد.

کد روش امضا در پیوست شماره 3-1 ارائه شده است.

نحوه رمزگذاری صورتحساب

برای رمزگذاری صورتحساب می بایست یک کلید متقارن (به روش) AES/GCM/NoPADDING با طول 256 بیت تولید شود. برای رمزگذاری از طریق AES/GCM نیاز به یک کلید دیگر به نام IV به طول 128 بیت است که این کلید به صورت تصادفی تولید می گردد. بعد از تولید کلیدهای مورد نیاز، JSON صورتحساب را ابتدا با کلید متقارن XOR کرده و سپس به روش AES/GCM رمزگذاری می گردد.

جزئیات XOR به این شکل است که باید متنی که می خواهیم XOR کنیم (در اینجا JSON صورتحساب) باید به بالک های 256 بیتی تبدیل شود و هر بالک با کلید متقارن که 256 بیت است XOR شود. با این روش ممکن است که بالک آخر تعداد بیت کمتر از 256 داشته باشد که با همان تعداد از کلید متقارن XOR انجام می شود.

برای صورتحساب تستی بخش قبل کلید متقارن رمز شده و IV به صورت hex در زیر نمایش داده شده است:

AES key : 4fda3c622e966e0839441401bbd3b8f191d4267bf5f19b40812a34b212fd3ed9 IV : 4fda3c622e966e0839441401bbd3b8f191d4267bf5f19b40812a34b212fd3ed9

نمونه صورتحساب رمز شده به شکل زیر است :

rvd4iGRTya68VppDwli9cGf+d0Qfo6g9Eu4hsyqQe4vwY17F2dQvXgvK6KwDJR2 RQIdhXcx6SMe+UF/XE4CJxMgmjfFMvBBjM34ix2ZFIaR2v2rwZ6XLUPTHWK HlXROxnA10BagrgOm0Xr4J6Y359ZZpnaNChPabj7s4yE4ZGT+wBHoz+J/yj2xFW KWmmcuP1b6rWOdWYO2OD6eXI1+faxT2vZ7FSBYyDy+sjP5S6Zllp92baFHX7 Z78VVqVGv+P+iJ+CLljD6j75k19ykD7stVkvHsoMwWYndqNiBIRLBXOjczSkJ/y L89eiGKcAUvEAGSiXgaeKjEymLaOWXZEdg0IwxVUrgRyX+4kVbWeCUWHSb jafCdQNRUddFZLWs3bO6MA552gaAh9iXJGmnJNvCbWjpjTvx9NyDbvd3thZhFl dhX5dkVEi7mWv3iTywRCUN/6QkOxZ4JDG7u3i20vqztuqxq/Kj/51GMOGov2hhF jd+5c6QCkvO7COMX4XVO6azrWGa3VVyZz6dG9vCvVb/BZsVTxGBddQiQKd5aaQxxIvs+sM7/FIbQ4l5llSN+4ax8g420qO5E6hA+mMQ3oECnJtyKJmDK6oR6T5y//5dByFffMySmhdx+bhS0XxMFvk7ZPUcWFZwDGs6yNKa2AApt58xqGnbuf+N2 86UjPH9CgNogY/G5lvFlPX51qi6q6X/YX165WhD0MbVEL8EEyfk/60rjwLivhEkc ZWowhyOBnxtnHvVmpjocTS/404Oskepra/4jRKiqON3hqwpEJE8V0hanYwp9m32 HtYbiql9RqL3wHycbWtnueFNjptplKi4tczl4NsfD9ezD6TQVgcAT0o14OAnklJTO/ 0QnwfTgv8krEy7F/umNYWPswgWrjqSHtGiUHbXLunGP6fwZZOT0vECwXrz9X/aHGX/rm64/orJArZ9Vi2OIdzvGdQbcXsGAKKuAlCvssA4XnXMBvWW9+g4Y+q qsHBTomkvHYrXvLob02FUWL0XsTkap/BXfLIj4HBQUhh0gUk6aX8wetRknFiH HjblgjN7Tjc51Jt1GifTZHnG/uHIJB/6/GlwIbxAPXB4YfNiRAU0y0iCiU1Ow8Jl6Tu us3cgGkLvo5uOlF/0vLx9O2BSJHcpA0OBhIjaJ1bdgHSYOr3P3tDY+BVSe33/8oO 0DAVBjEDUQKx3F0Ncr6TwxlqewquIHL2zmktSMc2KbIFY12Jx7cG84hh4Ih98Vi Fg+Xad83Ed3G/JiU3uG+7qiaYi8DYI6Icw0rf870qQ/CkopVR44xRtePslZfZjKS0X5 39/4qymPDs3+KFYzGntIiwc6fRNSLhjoTidCHFRcF9tP2Ttkp6CTsnLsHtQugYZatn rMO+X+GNxihIF9Be9/UJMdJ9vzwLWUn+/0+ducZKJ3mpTw5T8DqYuhzOcpYoR obear9uzYb+2Ky8g==

کد روش رمزگذاری به روش متقارن AES/GCM در پیوست 4-1 ارائه شده است.

پس از رمزگذاری صورتحساب، از طریق الگوریتم AES/GCM، باید کلید متقارن رمز شده و IV در کنارصورتحساب رمزشده قرار گیرد. برای رمزگذاری کلید متقارن باید از روش نامتـــــــقارن RSA-OAEP-SHA256 استفاده شود که برای این منظور از کلید/های عمومی سازمان با طول 4096 بیت اخذ شده از یک مرکز میانی معتبر استفاده می شود. کلید عمومی سازمان با استفاده از متد GET_SERVER_INFORMATION به دست می آید.

کد روش رمزگذاری به روش نامتقارن RSA-OAEP-SHA256 در پیوست 5-1 ارائه شده است.

فراخوانی متدهای API جمع آوری اطلاعات سامانه مودیان

آدرس API ها

آدرس APIهای زیرسامانه جمع آوری و پردازش اطلاعات به صورت زیر است که پیشوند تمام آدرس ها قرار میگیرد.

https://tp.tax.gov.ir/req/

آدرس هایی که با tsp شروع می شوند برای شرکت های معتمد ارائه کننده خدمات مالیاتی در نظر گرفته شده و آدرس هایی که با self-tsp شروع می شوند برای مودیانی که قصد دارند خودشان صورتحساب ارسال کنند در نظر گرفته شده است.

دو مکانیزم برای درخواست های با اولویت عادی و درخواست های با اولویت بالا وجود دارد. آدرس normal-enqueue برای درخواست های معمولی و fast-enqueue برای درخواست های با اولویت بالا در نظر گرفته شده است.

متدها همراه با آدرس API در جدول 2 ارائه شده اند.

آدرس متد

اسم متد

ردیف

…/api/self-tsp/async/normal-enqueue/

…/api/self-tsp/async/fast-enqueue/

…/api/tsp/async/normal-enqueue/

…/api/tsp/async/fast-enqueue/

 

ارسال صورتحساب الکترونیکی

 

1

…/api/self-tsp/sync/ GET_TOKEN/

…/api/tsp/sync/ GET_TOKEN/

متد دریافت توکن

2

…/api/self-tsp/sync/ GET_FISCAL_INFORMATION/

…/api/tsp/sync/ GET_FISCAL_INFORMATION/

استعالم اطلاعات حافظه مالیاتی

مودی و حد مجاز فروش مودی

3

…/api/self-tsp/sync/ INQUIRY_BY_UID /

…/api/tsp/sync/ INQUIRY_BY_UID /

استعالم با شناسه یکتای ارسال

صورتحساب

4

…/api/self-tsp/sync/INQUIRY_BY_REFERENCE_NUMBER /

…/api/tsp/sync/INQUIRY_BY_REFERENCE_NUMBER /

استعالم با رسید یکتای دریافت

صورتحساب

5

…/api/self-tsp/sync/INQUIRY_BY_TIME/

…/api/tsp/sync/INQUIRY_BY_TIME /

دریافت خطاهای بستههای ارسالی

غیرهمگام با استفاده از زمان

6

…/api/self-tsp/sync/ INQUIRY_BY_TIME_RANGE /

…/api/tsp/sync/ INQUIRY_BY_TIME_RANGE /

دریافت خطاهای بستههای ارسالی

غیرهمگام با استفاده از بازه زمانی

7

…/api/self-tsp/sync/ GET_SERVER_INFORMATION /

…/api/tsp/sync/ GET_SERVER_INFORMATION /

دریافت اطلاعات سرور

8

…/api/self-tsp/sync/ GET_SERVICE_STUFF_LIST /

…/api/tsp/sync/ GET_SERVICE_STUFF_LIST /

دریافت لیست کامل شناسه

کاال/خدمات و نرخ مالیاتی

9

…/api/self-tsp/sync/GET_ECONOMIC_CODE_INFORMATION /

…/api/tsp/sync/GET_ECONOMIC_CODE_INFORMATION /

استعالم اطلاعات شماره اقتصادی

10

جدول ۲. متدهای همگام و غیرهمگام

ساختار درخواست ها

در این بخش ساختار درخواست ها به API شرح داده شده است. در جدول 3 ساختار کلی درخواست ارائه شده است.

ساختار کلی سرویس همگام مشابه با سرویس غیرهمگام بوده و تفاوت آن در فیلد packet است. بطوریکه در حالت همگام به جای آرایه ای از درخواست، فقط یک درخواست می توان ارسال نمود (packet). در درخواست غیرهمگام می توان مجموعه ای از بسته ها (packets) را ارسال نمود.

مقدار

عنوان

POST

HTTP متد

Authorization: "string"

requestTraceId: "string" timestamp: "Long"

 

فیلدهای Header

{

"packets": Packet[], "signature": "string", "signatureKeyId": "string"

}

 

فیلدهای Body

{

"timestamp": "Long", "result": AsyncResponse[], "signature" : "string", "signatureKeyId" : "string"

}

 

فیلدهای خروجی

{

"timestamp": "Long", "errors": ErrorResponse[], "signature" : "string", "signatureKeyId" : "string"

}

 

خروجی سرویس در صورت رخداد خطای کلی

جدول ۳. ساختار کلی درخواست ها

فیلد signatureKeyId اختیاری بوده و مقدار پیش فرض آن برابر با null خواهد بود.

اطلاعات تکمیلی فیلدها در جدول 4 آورده شده است:

توضیحات

نام فیلد

توکن با این سرآیند )Header( ارسال میشود، در صورتیکه فراخوانی یک متد نیاز به احراز هویت

نداشته باشد، این فیلد اختیاری خواهد شد. این سرآیند در های غیرهمگام و برخی از های همگام اجباری است.

 

Authorization

هر درخواستی باید دارای یک باشد که در سرآیند ارسال میشود. از این شناسه برای

تشخیص درخواستهای تکراری استفاده میشود.

 

requestTraceId

زمان ارسال بسته از کالینت که در سرآیند ارسال میشود. یکی از کاربردهای این فیلد، رد کردن

بستههای قدیمی است.

 

timestamp

لیست بستههای ارسالی.

packets

امضای روی درخواست.

signature

شناسه کلید عمومی ارسال کننده، برای بررسی امضا.

این فیلد اختیاری بوده و مقدار پیش فرض آن برابر با خواهد بود.

 

signatureKeyId

جدول ۴. توضیحات مربوط به فیلدهای درخواست

زمانی که کالینت پاسخ این سرویس را دریافت می کند، الزاماً رسیدگی به بسته های اطلاعاتی پایان نیافته است، بلکه تنها در صف رسیدگی قرار گرفته اند. تایید رسیدگی و نتیجه اعمال موفق یا ناموفق بسته های اطلاعاتی از طریق استعلام به اطلاع کالینت خواهد رسید.

در صورتی که کالینت نتیجه رسیدگی به یک بسته را failed دریافت نماید، لازم است پس از اطمینان از عدم وجود خطاها در بسته ارسالی، آن را مجدداً ارسال نماید. در ارسال مجدد باید مقدار فیلد retry برابر true باشد تا سرویس غیرهمگام در جریان ارسال مجدد درخواست باشد.

ساختار بسته های ارسالی به سرور و فیلدهای مربوط به ترتیب مطابق جداول 5 و 6 است.

Packet

اسم شی

{

"uid": "string", "packetType": "string", "retry": "Boolean",

"data": "string", "encryptionKeyId": "string", " symmetrickey ": "string", "iv": "string",

"fiscalId": "string", "dataSignature": “string”

}

 

 

 

 

نوع فیلدها

جدول ۵. ساختار بسته

توضیحات

نام فیلد

شناسه یکتای ارسال صورتحساب، کدی که در سمت کالینت هنگام ارسال تولید میشود.

uid

نوع بسته

packetType

نوع فیلد بولین است (مقدار )TRUE/FALSE، مشخص میکندکه بسته اولین بار است ارسال شده

است یا خیر.

 

retry

دادههای داخل درخواست.

در صورتی که دادهها رمز شده باشند، آرایه بایت به صورت رشته ارسال میشود.

در صورتی که دادهها کشف باشند، رشته سریال شده قرار داده میشود.

 

 

data

شناسه کلید عمومی سازمان، جهت باز کردن کلید متقارن.

در صورتی که دادهها رمز نشده باشند، این فیلد خالی ارسال میشود.

 

encryptionKeyId

کلید متقارن رمز شده با کلید رمزنگاری (کلید عمومی سازمان) جهت باز کردن دادههای رمز شده.

در صورتی که داده ها رمز نشده باشند، این فیلد خالی ارسال میشود.

 

symmetrickey

بردار مقدار اولیه کلید متقارن.

در صورتی که داده ها رمز نشده باشند، این فیلد خالی ارسال میشود.

 

iv

شناسه یکتای حافظه مالیاتی.

در صورتی که ارسال کننده شرکت ارائه کننده خدمات مالیاتی باشد، این فیلد اجباری خواهد بود.

 

fiscalId

امضای صورتحساب.

dataSignature

جدول ۶. توضیحات فیلدهای بسته

سرویس های جمع آوری و پردازش اطلاعات

درخواست همگام و غیرهمگام دو سرویس اصلی زیر سامانه جمع آوری و پردازش اطلاعات است:

متد غیرهمگام

سرویس درخواست غیرهمگام (ارسال صورتحساب)

ارسال صورتحساب به صورت غیرهمگام انجام می شود و جهت ارسال به احراز هویت و امضا دیجیتال صورتحساب و کل لیست ارسالی و همچنین رمزگذاری نیاز است.

برای اینکه ساختار مناسبی برای رهگیری تغییرات بسته ها وجود داشته باشد، نوع بسته (PacketType) درصورتحساب به دو بخش تقسیم بندی می شود:

بخ اول

بخ دوم

INVOICE

شماره نسخه + حرف V

INVOICE.V01

برای مثال اگر صورتحسابی با نسخه بسته 01 داشته باشیم، نوع بسته به صورت زیر خواهد بود:

INVOICE.V01

فرآیند ارسال صورتحساب مطابق شکل (3) و به شرح ذیل است:

۱. مودی یا TSP با ارسال درخواست توکن به سرور جمعآوری فرآیند ارسال صورتحساب را شروع می کند.

۲. توکن دریافت شده در سرآیند درخواست قرار میگیرد و صورتحساب ارسال می شود.

۳. مودی یا TSP رسید یکتای دریافت صورتحساب درخواست خود را از سامانه مودیان دریافت می کند.

۴. مودی یا TSP می تواند به وسیله فراخوانی متدهای استعلام از وضعیت ارسال صورتحساب خود با خبر شود.

نمودار ترتیبی فرآیند ارسال صورتحساب

در صورتی که وضعیت درخواست به صورت “PENDING” باشد به این معنی است که هنوز درخواست پردازش نشده است.

نمونه CURL درخواست در پیوست 1-2 ارائه شده است.

ساختار بسته صورتحساب

شناسنامه همه اقلام اطلاعاتی که در انواع و الگوهای صورتحساب وجود دارند به شرح جدول 7 است:

مقادیر مجاز

طول

فیلد

نوع فیلد

محل قرارگیری در

صورتحساب

 

JSON

عنوان قلم اطلاعاتی

ردیف

 

22

 

string

سرآمد Header

 

taxid

شماره منحصر به فرد

مالیاتی

1

 

14

 

Timestamp

سرآمد Header

 

indatim

تاریخ و زمان صدور

صورتحساب(میالدی)

2

 

14

 

Timestamp

سرآمد Header

 

Indati2m

تاریخ و زمان ایجاد

صورتحساب(میالدی)

3

3 - 2 – 1

-1 نوع اول

-2 نوع دوم

-3 نوع سوم

 

1

 

 

int

 

سرآمد Header

 

 

inty

 

 

نوع صورتحساب

 

 

4

 

10

string

سرآمد Header

inno

سریال صورتحساب

5

 

 

22

 

string

 

سرآمد Header

 

irtaxid

شماره منحصر به فرد مالیاتی صورتحساب

مرجع

 

6

6-5-4-3-2-1

 

الگوی:1 فروش

 

الگوی:2 فروش ارزی

 

الگوی:3 صورتحساب طال، جواهر و پالتین

 

قرارداد :الگوی4 پیمانکاری

 

الگوی:5 قبوض خدماتی

 

الگوی:6 بلیت هواپیما

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

int

سرآمد Header

 

 

 

 

 

 

 

 

 

inp

 

 

 

 

 

 

 

 

الگوی صورتحساب

 

 

 

 

 

 

 

 

7

-1 اصلی

-2 اصالحی

-3 ابطالی -4 برگشت از فروش

 

 

 

 

1

 

 

 

 

int

 

 

 

 

سرآمد Header

 

 

 

 

ins

 

 

 

 

موضوع صورتحساب

 

 

 

 

8

 

10

 

int

سرآمد Header

 

tins

شماره اقتصادی

فروشنده

9

5 - 4 -3 – 2 -1

-1 حقیقی

-2 حقوقی

-3 مشاركت مدنی

-4 اتباع غیر ایرانی -5 مصرف كننده نهایی

 

 

 

 

 

1

 

 

 

 

 

int

 

 

 

 

سرآمد Header

 

 

 

 

 

tob

 

 

 

 

 

نوع شخص خریدار

 

 

 

 

 

10

 

 

متغیر

 

int

 

سرآمد Header

 

bid

شماره/شناسه ملی/شناسه مشاركت

مدنی/كد فراگیر خریدار

 

11

 

10

int

سرآمد Header

tinb

شماره اقتصادی خریدار

12

 

متغیر

int

سرآمد Header

sbc

كد شعبه فروشنده

13

 

10

int

سرآمد Header

bpc

كد پستی خریدار

14

 

متغیر

int

سرآمد Header

bbc

كد شعبه خریدار

15

2-1

-1 داخلی

-2 خارجی

 

1

 

int

 

سرآمد Header

 

ft

 

نوع پرواز

 

16

 

متغیر

string

سرآمد Header

 

bpn

شماره گذرنامه خریدار

17

 

متغیر

 

int

سرآمد Header

 

 

scln

شماره پروانه گمركی

فروشنده

18

 

متغیر

int

سرآمد Header

 

scc

كد گمرک محل اظهار

19

 

متغیر

 

int

سرآمد Header

 

 

crn

شناسه یکتای ثبت

قرارداد فروشنده

20

 

متغیر

int

سرآمد Header

 

 

billid

شماره اشتراک/ شناسه

بهره بردار قبض

21

 

متغیر

 

double

سرآمد Header

 

 

tprdis

مجموع مبلغ قبل از

كسر تخفیف

22

 

متغیر

double

سرآمد Header

 

tdis

مجموع تخفیفات

23

 


مقادیر مجاز

 

طول

فیلد

نوع فیلد

محل قرارگیری در

صورتحساب

 

JSON

عنوان قلم اطلاعاتی

ردیف

 

متغیر

 

double

سرآمد Header

 

tadis

مجموع مبلغ پس از

كسر تخفیف

24

 

متغیر

 

double

سرآمد Header

 

tvam

مجموع مالیات بر ارزش

افزوده

25

 

متغیر

 

double

سرآمد Header

 

todam

مجموع سایر مالیات،

عوارض و وجوه قانونی

26

 

متغیر

double

سرآمد Header

tbill

مجموع صورتحساب

27

3-2-1

-1 نقد

-2 نسیه

-3 نقد/نسیه

 

 

1

 

 

int

سرآمد Header

 

 

setm

 

 

روش تسویه

 

 

28

 

متغیر

double

سرآمد Header

cap

مبلغ پرداختی نقدی

29

 

متغیر

double

سرآمد Header

insp

مبلغ پرداختی نسیه

30

 

متغیر

double

سرآمد Header

tvop

مجموع سهم مالیات بر

ارزش افزوده از پرداخت

31

2-1

-1 عدم پرداخت

-2 پرداخت

 

1

 

int

سرآمد Header

 

dpvb

عدم پرداخت مالیات بر ارزش افزوده خریدار

 

32

 

متغیر

double

سرآمد Header

Tax17

مالیات موضوع ماده 17

33

 

13

int

بدنه Body

sstid

شناسه كاال/خدمت

34

 

متغیر

string

بدنه Body

sstt

شرح كاال/خدمت

35

از جدول پیوست دستورالعمل صدور صورتحساب

الکترونیکی

 

 

3

 

 

int

بدنه Body

 

 

mu

 

 

واحد اندازهگیری

 

 

36

 

متغیر

int

بدنه Body

am

تعداد/مقدار

37

 

متغیر

double

بدنه Body

fee

مبلغ واحد

38

 

متغیر

double

بدنه Body

cfee

میزان ارز

39

 

متغیر

string

بدنه Body

cut

نوع ارز

40

 

متغیر

double

بدنه Body

exr

نرخ برابری ارز با ریال

41

 

متغیر

double

بدنه Body

prdis

مبلغ قبل از تخفیف

42

 

متغیر

double

بدنه Body

dis

مبلغ تخفیف

43

 

متغیر

double

بدنه Body

adis

مبلغ بعد از تخفیف

44

مقادیر مجاز

طول

فیلد

نوع فیلد

محل قرارگیری در

صورتحساب

 

JSON

عنوان قلم اطلاعاتی

ردیف

 

متغیر

 

double

بدنه Body

 

vra

نرخ مالیات بر

ارزشافزوده

45

 

متغیر

 

double

بدنه Body

 

vam

مبلغ مالیات بر ارزش

افزوده

46

 

متغیر

 

string

بدنه Body

 

odt

موضوع سایرمالیات و

عوارض

47

 

متغیر

 

double

بدنه Body

 

odr

نرخ سایرمالیات و

عوارض

48

 

متغیر

 

double

بدنه Body

 

odam

مبلغ سایرمالیات و

عوارض

49

 

متغیر

 

string

بدنه Body

 

olt

موضوع سایر وجوه

قانونی

50

 

متغیر

double

بدنه Body

olr

نرخ سایر وجوه قانونی

51

 

متغیر

double

بدنه Body

olam

مبلغ سایر وجوه قانونی

52

 

متغیر

double

بدنه Body

consfee

اجرت ساخت

53

 

متغیر

double

بدنه Body

spro

سود فروشنده

54

 

متغیر

double

بدنه Body

bros

حقالعمل

55

 

متغیر

 

double

بدنه )Body(

 

tcpbs

جمع كل اجرت، حق-

العمل و سود

56

 

متغیر

double

بدنه )Body(

cop

سهم نقدی از پرداخت

57

 

متغیر

 

double

بدنه Body

 

vop

سهم ارزش افزوده از

پرداخت

58

 

متغیر

 

int

بدنه Body

 

bsrn

شناسه یکتای ثبت

قرارداد حق العملکاری

59

 

متغیر

double

بدنه Body

tsstam

مبلغ كل كاال/خدمت

60

 

متغیر

 

int

) Payment

اطلاعات پرداخت (

 

iinn

شماره سوییچ پرداخت

61

 

متغیر

 

int

) Payment

اطلاعات پرداخت (

 

acn

شماره پذیرنده

فروشگاهی

62

 

متغیر

 

int

) Payment

اطلاعات پرداخت (

 

trmn

شماره پایانه

63

 

متغیر

 

int

)Payment

اطلاعات پرداخت (

 

trn

شماره پیگیری

64

مقادیر مجاز

طول

فیلد

نوع فیلد

محل قرارگیری در

صورتحساب

 

JSON

عنوان قلم اطلاعاتی

ردیف

 

متغیر

 

int

) Payment

اطلاعات پرداخت (

pcn

شماره كارت پرداخت

كننده صورتحساب

65

 

 

 

متغیر

 

 

int

 

) Payment

اطلاعات پرداخت (

 

 

pid

شماره/شناسه ملی/كد فراگیر اتباع غیر ایرانی پرداخت كننده

صورتحساب

 

 

66

 

14

 

Timestamp

) Payment

اطلاعات پرداخت (

 

pdt

تاریخ و زمان پرداخت

صورتحساب

67

جدول ۷. اقلام صورتحساب

نکته قابل توجه در ارسال اطلاعات صورتحساب این است که در صورتی که پارامتری فاقد مقدار باشد، باید به صورت پیشفرض با مقدار null
ارسال شود یا کال پارامتر ارسال نگردد.

پاسخ درخواست غیرهمگام

پس از دریافت درخواست توسط سرور و بررسی مربوط به الیه انتقال پاسخ مناسب مطابق جداول 8 و 9 به کالینت ارائه می شود.

AsyncResponse

اسم شی

{

"uid": "string", "referenceNumber": "string", "errorCode": "string", "errorDetail": "string"

}

 

نوع فیلدها

 

جدول ۸. مدل داده پاسخ های غیرهمگام

توضیحات

نام فیلد

شناسه یکتای ارسال صورتحساب، شناسهای که در سمت کالینت هنگام ارسال صورتحساب تولید میشود.

uid

رسید یکتای دریافت صورتحساب، در صورتی که بسته با موفقیت توسط سرور دریافت شود، این شناسه به

عنوان کد ارجاع برای کالینت ارسال خواهد شد.

به کمک این فیلد، وضعیت پردازش بسته قابل بررسی و پیگیری است. این کد سمت سرور تولید میشود.

 

 

referenceNumber

کد خطا، در صورتی که دریافت بسته با خطایی مواجه شود، این فیلد پر شده و کد خطا بازگردانی میشود.

errorCode

جزئیات خطا، در صورتی که دریافت بسته با خطایی مواجه شود، این فیلد پر شده و جزئیات خطا را شرح

میدهد.

 

errorDetail

جدول ۹. توضیحات فیلدهای خروجی درخواست غیرهمگام

متدهای همگام

سرویس درخواست های همگام

در جدول 10 جزئیات ورودی و خروجی بسته های همگام بیان شده است.

شایان ذکر است در متدهای همگام امضای درخواست ارسالی نیاز است و داده ها به رمزگذاری نیاز ندارند.

خروجی ورودی داده نام متد
***** طول عمر توکن به ثانیه: expiresIn شناسه یکتای حافظه یا : username شناسه شرکت معتمد
GET_TOKEN
نام تجاری nameTrade: وضعیت حافظهfiscalStatus: درصد حد مجاز saleThreshold: فروش شماره اقتصادیeconomicCode:

-


GET_FISCAL_ INFORMATION
[{ uid, referenceNumber, status, data, packetType, fiscalId }, ... ] { Uid: [ { uid, fiscalId } , { uid, fiscalId } , { uid, fiscalId




INQUIRY_BY_UID
  } , ... ]}  
[ { uid, referenceNumber, status, data, packetType, fiscalId }, ... ] { "referenceNumber": [ referenceNumber_1, referenceNumber_2, referenceNumber_3, ... ] }


INQUIRY_BY_ REFERENCE_NUMBER
[ { uid, referenceNumber, status, data, packetType, fiscalId }, ... ]


time



INQUIRY_BY_TIME
[ { uid, referenceNumber, status, data, packetType, fiscalId }, ... ]

,تاریخ شروع بازه مورد نظر startDate: تاریخ پایان بازه مورد نظر endDate:



INQUIRY_BY_TIME_RANGE
{ "serverTime": "سرور زمان", publicKeys”: [{ "key": "عمومی کلید", “, شناسه کلید عمومی" "id": ",الگوریتم کلید" : "algorithm" "هدف کلید. 1: "purpose" رمزگشایی صورتحسابها در جمع آوری"


-




GET_SERVER_INFORMATION
}] }    
{ "result" : [ { ",شناسه کاال/خدمت" "itemId": نرخ مالیات بر ارزش افزوده " "tax": "و سایر عوارض }, ... ], "pagination": { ",صفحه جاری" "page": ",تعداد در صفحه" "size": ",تعداد کل" "total": } }

{ "filters": [ لیست فیلتر بر روی داده ها ], "orderBy": [ لیست مرتب سازی ], ,صفحه مورد درخواست "page": تعداد در صفحه "size": }








GET_SERVICE_STUFF_LIST
,نام تجاری nameTrade: ,وضعیت مودی taxpayerStatus: ,نوع شخص taxpayerType: کدهای پستی postalcodeTaxpayer: مودی نشانی مودی addressTaxpayer:


economicCode



GET_ECONOMIC_CODE_ INFORMATION

جدول ۱۰. درخواست های همگام

پاسخ درخواست های همگام

توضیحات

نام فیلد

شناسه یکتای ارسال صورتحساب، شناسهای که در سمت کالینت هنگام ارسال صورتحساب تولید

میشود.

 

uid

نوع بسته پاسخ.

packetType

پاسخ رمز شده یا کشف بسته.

data

 


توضیحات

 

نام فیلد

شناسه کلید عمومی حافظه مالیاتی، جهت باز کردن کلید متقارن. در صورتی که داده ها رمز نشده

باشند، این فیلد خالی ارسال میشود.

 

encryptionKeyId

کلید متقارن رمز شده با کلید رمزنگاری (کلید عمومی سازمان) جهت باز کردن داده های رمز شده.

symmetricKey

بردار مقدار اولیه کلید.

iv

جدول ۱۱. توضیحات فیلدهای ساختار خروجی درخواست همگام

متد دریافت توکن

کالینت ها با استفاده از این متد، توکن JWT دریافت می کنند. با توجه به اینکه در این سرویس امضای درخواست کننده اجباری است، احراز هویت از طریق آن صورت می پذیرد. در صورتی که نام کاربری اعالم شده و امضای آن تطابق داشته باشد، توکن JWT برای کالینت ارسال می شود. این توکن طول عمر مشخصی دارد، با منقضی شدن آن، کالینت اقدام به دریافت توکن جدید می نمایند. با استفاده از این توکن در سرآیند درخواست ها می توان از این API ها استفاده کرد.

برای ارسال توکن ابتدا عبارت Bearer اضافه شده سپس توکن ارسال می شود. نمونه CURL درخواست در پیوست 2-2 ارائه شده است.

متد استعلام اطلاعات حافظه مالیاتی مودی و حد مجاز فروش مودی

با استفاده از این متد می توان اطلاعات حافظه مالیاتی مودی را دریافت نمود.این متد نیاز به احراز هویت نمونه CURL دارد.

درخواست در پیوست 3-2 ارائه شده است.

متد استعلام بسته های ارسالی غیرهمگام

برای استعلام وضعیت صورتحساب های ارسال شده می توان از متدهای ذیل استفاده کرد: این متدها به احراز هویت نیاز دارند.

  • Inquiry_by_uid: کالینت می تواند با آرایه ای از UID ها، صورتحساب های مورد نظر خود را استعلام نماید. در پاسخ وضعیت آنها باز گردانده می شود.نمونه CURL درخواست در پیوست 1-4-2 ارائه شده است.نکته: وجود fiscalId در ورودی درخواست کنار هر uid ضروری است.
  • Inquiry_by_reference_number: در این متد کالینت می تواند با آرایه ای از reference_number ها، صورتحساب های مورد نظر خود را استعلام نماید. در پاسخ وضعیت آنها باز گردانده می شود.

نمونه CURL درخواست در پیوست 2-4-2 ارائه شده است.

  • Inquiry_by_time: با این متد صورتحساب های دارای خطا از یک زمان مشخص تا زمان حال مشخص می شوند.

نمونه CURL درخواست در پیوست 3-4-2 ارائه شده است.

  • Inquiry_by_time_range: با این متد صورتحساب های دارای خطا در یک بازه زمانی مشخص می شوند.

نمونه CURL درخواست در پیوست 4-4-2 ارائه شده است.

نکته: فیلد “time” ، تاریخ شمسی با فرمت YYYYMMDD است و دقت شود فقط در خروجی این درخواست بسته هایی که وضعیت FAILED دارند برگشت داده می شوند.

متد دریافت اطلاعات سرور

این متد برای دریافت اطلاعات عمومی سرور شامل کلیدهای عمومی سازمان، شناسه کلید عمومی که از یک مرکز میانی معتبر اخذ شده است و تاریخ و زمان سرور، مورد استفاده قرار میگیرد. این متد به احراز هویت نیاز ندارد.

نمونه CURL درخواست در پیوست 5-2 ارائه شده است.

متد دریافت لیست کامل شناسه کالا/خدمات و نرخ مالیاتی

این متد برای دریافت لیست شناسه استاندارد کالا ها و خدمت ها که توسط وزارت صمت ابلاغ شده است مورد استفاده قرار می گیرد. با توجه به اینکه حجم نتیجه خروجی این متد ممکن است زیاد باشد، امکان دریافت اطلاعات به صورت صفحه بندی شده نیز در نظر گرفته شده است. این متد نیاز به احراز هویت ندارد.

نمونه CURL درخواست در پیوست 6-2 ارائه شده است.

ارسال فیلد فیلتر و مرتب سازی در ورودی اختیاری است. شماره صفحه از یک شروع می شود. برای مثال اگر 10 رکورد اول را بخواهیم دریافت کنیم ورودی به صورت زیر خواهد بود:

{
"page": 1,
"size": 10
}
متد استعلام اطلاعات شماره اقتصادی

این متد برای استعلام شماره اقتصادی مورد استفاده قرار می گیرد. این متد نیاز به احراز هویت ندارد.

نمونه CURL درخواست در پیوست 7-2 ارائه شده است.

لیست خطاها

مدل داده خطاها

ErrorResponse

اسم شی

{

"errorDetail": "string", "errorCode": "string"

}

نوع فیلد ها

جدول ۱۲. ساختار خروجی پاسخ خطا

لیست خطاهای اولیه انتقال

توضیحات

خطا

کد

خطای داخلی سرور

internal.server.error

5000

خطای general زمانی كه بسته مشکل داشته و در سمت سرور خطایی به صورت مشخص وجود نداشته باشد

 

bad.request

 

5001

عدم دارا بودن دسترسی برای ارسال این درخواست

un.authorized

5002

ارسال uid با فرمت اشتباه در packet

uid.format.is.not.valid

5003

ساختار JSON درخواست اشتباه است

invalid.json.structure

5004

ارسال درخواست با uid تکراری در packet

duplicate.request.uid

5005

ارسال تعداد packet بی از حد مجاز (در حال حاضر 100 عدد)

packet.size.is.too.large

5006

عدم پشتیبانی از نوع packet ارسالی

not.supported.packet-type

5007

مقدار فیلد encryptionKeyId در ارسال رمز شده صورتحساب صحیح نمی باشد

 

encryption.key.id.not.valid

 

5008

عدم تطابق packet ارسالی با نوع درخواست sync

not.match.packet-type.with.request

5009

گذشت زمان مشخصی از زمان ارسال درخواست و دریافت آن توسط سرور

 

request.time.has.passed

 

5010

تکراری بودن requestTraceId در سرآیند درخواست

duplicate.request.trace.id

5011

پیدا نشدن اطلاعات حافظه مالیاتی ارسالی

fiscal.id.not.found

5012

عدم اعتبار امضای درخواست

invalid.packet.signature

5013

فرمت ساختار نادرست است

invalid.format

5014

توكن نامعتبر

invalid.token

5015

جدول ۱۳. خطاهای الیه انتقال

لیست خطاهای اولیه انتقال

شرح خطا

خطای واقع شده

ردیف

Seller economic code is empty

عدم ثبت شماره اقتصادی فروشنده.

1

 

Buyer economic code is empty

عدم ثبت شماره اقتصادی خریدار در صورتحسابهای

الکترونیکی نوع اول.

 

2

Invoice date time is empty

عدم ثبت تاریخ و زمان صدور صورتحساب (میالدی.)

3

 

Payment date time is empty

عدم ثبت تاریخ و زمان پرداخت صورتحساب در

صورتحسابهای الکترونیکی نوع سوم.

 

4

Invoice number is empty

عدم ثبت سریال صورتحساب.

5

Invoice type is empty

عدم ثبت نوع صورتحساب.

6

Invoice pattern is empty

عدم ثبت الگوی صورتحساب.

7

Invoice subject is empty

عدم ثبت موضوع صورتحساب.

8

 

Reference tax-id is empty

عدم ثبت شماره منحصر به فرد مالیاتی صورتحساب مرجع در صورتیکه موضوع صورتحساب شامل اصالحی، ابطالی و یا

برگشت از فروش -یکی از مقادیر 2، 3 و یا 4 ) باشد.

 

9

Service-stuff-id is empty

عدم ثبت شناسه کاال/خدمت.

10

Fee is empty

عدم ثبت مبلغ واحد.

11

 

Currency-fee is empty

عدم ثبت میزان ارز در صورتحسابهای با الگوی فروش

ارزی.

 

12

Vat rate is empty

عدم ثبت نرخ مالیات بر ارزش افزوده.

13

Amount is empty

عدم ثبت تعداد/مقدار.

14

Contract registration number is empty

عدم ثبت شناسه یکتای ثبت قرارداد فروشنده در

صورتحسابهای الکترونیکی با الگوی قرارداد پیمانکاری.

 

15

 

Seller customs license is empty

عدم ثبت شماره پروانه گمرکی فروشنده در صورتحسابهای

الکترونیکی با الگوی فروش ارزی.

 

16

شرح خطا

خطای واقع شده

ردیف

 

Seller customs code is empty

عدم ثبت کد گمرک محل اظهار فروشنده در صورتحساب-

های الکترونیکی با الگوی فروش ارزی.

 

17

Buyer type is empty

عدم ثبت نوع شخص خریدار.

18

 

Flight type is empty

عدم ثبت نوع پرواز در صورتحسابهای الکترونیکی با

الگوی بلیط هواپیما.

 

19

 

Currency type is empty

عدم ثبت نوع ارز در صورتحسابهای الکترونیکی با الگوی

فروش ارزی.

 

20

 

Exchange rate is empty

عدم ثبت نرخ برابری ارز با ریال در صورتحسابهای

الکترونیکی با الگوی فروش ارزی.

 

21

 

Billing identification is empty

عدم ثبت شماره اشتراک /شناسه قبض در صورتحسابهای

الکترونیکی با الگوی قبوض خدماتی.

 

22

 

Pre-discount amount is empty

عدم ثبت مبلغ قبل از تخفیف در صورتحسابهای

الکترونیکی با الگوی اول تا پنجم.

 

23

 

Discount amount is empty

عدم ثبت مبلغ تخفیف در صورتحسابهای الکترونیکی با

الگوی اول تا پنجم.

 

24

 

 

After discount amount is empty

عدم ثبت مبلغ بعد از تخفیف در صورتحسابهای

الکترونیکی با الگوی اول تا پنجم (فروش-فروش ارزی- صورتحساب طال، جواهر، پالتین- قرارداد پیمانکاری-قبوض

خدماتی.)

 

 

25

Vat amount is empty

عدم ثبت مبلغ مالیات بر ارزش افزوده.

26

 

 

Vat of payment is empty

عدم ثبت سهم مالیات بر ارزش افزوده از پرداخت در صورتحسابهای الکترونیکی با الگوی اول تا چهارم

(فروش-فروش ارزی- صورتحساب طال، جواهر، پالتین-

قرارداد پیمانکاری.)

 

 

27

 

Settlement method is empty

عدم ثبت روش تسویه در صورتحسابهای الکترونیکی با الگوی اول تا چهارم (فروش-فروش ارزی- صورتحساب

طال، جواهر، پالتین- قرارداد پیمانکاری.)

 

28

Total service-stuff amount is

empty

عدم ثبت مبلغ کل کاال/خدمت.

29

شرح خطا

خطای واقع شده

ردیف

 

Total Pre-discount amount is empty

عدم ثبت مجموع مبلغ کل قبل از کسر تخفیف (به جز صورتحسابهای الکترونیکی با الگوی بلیط هواپیما و

صورتحسابهای نوع سوم.)

 

30

 

Total Discount amount is empty

عدم ثبت مجموع تخفیفات (به جز صورتحسابهای الکترونیکی با الگوی بلیط هواپیما و صورتحسابهای نوع

سوم.)

 

31

 

Total After discount amount is empty

عدم ثبت مجموع مبلغ کل پس از کسر تخفیف (به جز صورتحسابهای الکترونیکی با الگوی بلیط هواپیما و

صورتحسابهای نوع سوم.)

 

32

Total Vat amount is empty

عدم ثبت مجموع مالیات بر ارزش افزوده.

33

Total other-duty amount is empty

عدم ثبت مجموع سایر مالیات، عوارض و وجوه قانونی.

34

Total bill is empty

عدم ثبت مجموع صورتحساب.

35

Total Vat of payment is empty

عدم ثبت مجموع سهم مالیات بر ارزش افزوده از پرداخت.

36

JSON file is invalid

عدم رعایت قالب فایل متنی ارسالی.

37

Invalid tax-id

شماره منحصر به فرد مالیاتی نامعتبر

38

Invalid invoice number

سریال صورتحساب ارسالی نامعتبر

39

Invalid reference tax-id

شماره منحصر به فرد مالیاتی صورتحساب مرجع نامعتبر

40

 

Invalid invoice date time

عدم رعایت مهلت زمانی ابالغی صدور صورتحساب

اصالحی، ابطالی و برگشت از فروش

 

41

 

Invalid invoice date time

تاریخ و زمان صدور صورتحساب نامعتبر (وارد کردن زمان

آینده)

 

42

Invalid invoice type

نوع صورتحساب نامعتبر

43

Invalid invoice pattern

الگوی صورتحساب نامعتبر

44

Invalid seller economic code

شماره اقتصادی فروشنده نامعتبر

45

Invalid buyer economic code

شماره اقتصادی خریدار نامعتبر

46

Essential field is empty

عدم تکمیل فیلدهای ضروری مرتبط با الگو

47

Invalid Contract registration

number

شناسه یکتای ثبت قرارداد فروشنده نامعتبر

48

Invalid Service-stuff-id

شناسه کاال/خدمت نامعتبر

49

 

Invalid measurement unit

واحد اندازهگیری نامعتبر (کدهای آن در جدول واحد وجود

نداشته باشد)

 

50

شرح خطا

خطای واقع شده

ردیف

 

Invalid currency type

نوع ارز نامعتبر (فقط در الگوی فروش ارزی صورتحساب نوع

اول و دوم)

 

51

Error in digit ranges

خطا در محاسبه محدوده مجاز ارقام

52

 

Invalid Settlement method

روش تسویه نامعتبر (فقط در صورتحساب الگوهای 3،2،1،

4 و 6 نوع اول)

 

53

Invalid invoice subject

موضوع صورتحساب نامعتبر

55

Invalid Data type

خطای نوع مقدار وارد شده مغایر با نوع فیلد

56

 

Duplicate tax id

تکراری بودن فیلد «شماره منحصر به فرد مالیاتی

صورتحساب»

 

57

 

Mismatch buyer info

عدم تطابق فیلد «نوع شخص خریدار» با اطلاعات خریدار در

سامانه

 

58

Mismatch seller economic code and fiscal Id

فیلد «شماره اقتصادی فروشنده» با شناسه حافظه مالیاتی،

مغایرت دارد.

 

59

 

Tax id and fiscal Id does not match

مقدار فیلد شناسه حافظه مالیاتی d( I scal i f )

در صورتحساب با شناسه حافظه مالیاتی موجود در فیلد شماره منحصر به فرد مالیاتی d( axI )t تطابق ندارند

 

60

 

Seller Economic code and fiscal Id does not match

شماره اقتصادی فروشنده ،موجود در اقالم صورتحساب( ns i )t و شناسه حافظه مالیاتی موجود در فیلد شماره

منحصر به فرد مالیاتی d axI t تطابق ندارند

 

61

جدول ۱۴. کدهای خطای دریافتی از هسته مالیاتی یا به عبارتی کدهای خطای الیه محتوا

پیوست ها

کد نرمال سازی JSON به زبان java

import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper;


import java.text.Collator; import java.util.*;


public class CryptoUtils {


private final static ObjectMapper mapper = new ObjectMapper();


public static byte[] hexStringToByteArray(String s) {

int len = s.length();

byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)

+ Character.digit(s.charAt(i + 1), 16));
}
return data;

}
public static String normalJson(Object object, Map<String, Object> header)
if (object == null && header == null) return null;
Map<String, Object> map = null;

if (object != null) {

if (object instanceof String) {

try {

object = mapper.readValue((String) object, Object.class);

} catch (JsonProcessingException e) {

throw new RuntimeException(e.getMessage());
}
}
if (object instanceof Collection) {

PacketsWrapper packetsWrapper = new PacketsWrapper((Collection) object);

map = mapper.convertValue(packetsWrapper, Map.class);
} else {

map = mapper.convertValue(object, Map.class);
}
}
if (map == null && header != null) {
map = header;
}
if (map != null && header != null) {
for (Map.Entry<String, Object> entry : header.entrySet()) {
map.put(entry.getKey(), entry.getValue());
}
}
Map<String, Object> result = new HashMap<>();
flatMap(result, null, map);
StringBuilder sb = new StringBuilder();

List<String> keys = new ArrayList<>(result.keySet());

Collections.sort(keys, Collator.getInstance(Locale.ENGLISH));

for (String key : keys) {

String textValue;

Object value = result.get(key);

if (value != null) {

textValue = value.toString();

if (textValue == null || textValue.equals("")) {

textValue = "#";

} else {

textValue = textValue.replaceAll("#", "##");
}
} else {
textValue = "#";
}
sb.append(textValue).append('#');
}
return sb.deleteCharAt(sb.length() - 1).toString();
}
private static String getKey(String rootKey, String myKey) {

if (rootKey != null) {

return rootKey + "." + myKey;

} else {

return myKey;

}
}

private static void flatMap(Map<String, Object> result, String rootKey, Object input) {

if (input instanceof Collection) {

Collection list = (Collection) input;

int i = 0;

for (Object e : list) {

String key = getKey(rootKey, "E" + i++);

flatMap(result, key, e);
}
} else if (input instanceof Map) {

Map<String, Object> map = (Map) input;

for (Map.Entry<String, Object> entry : map.entrySet()) {

flatMap(result, getKey(rootKey, entry.getKey()), entry.getValue());
}
} else {
result.put(rootKey, input);
}
}
private static class PacketsWrapper {

private Collection packets;

public PacketsWrapper() {
}
public PacketsWrapper(Collection packets) {

this.packets = packets;

}

public Collection getPackets() {

return packets;

}
public void setPackets(Collection packets) {

this.packets = packets;
}
}
}
  • در کلاس CryptoUtils در کد بالا می توانید از متد استاتیک normalJson استفاده کنید.

کد DotNet برای نرمالسازی JSON

using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System;
using System.Collections;

using System.Collections.Generic; using System.Linq;
using System.Text;

using Org.BouncyCastle.Crypto;

using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Modes; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security; using System.Security.Cryptography; using System.IO;
using tax_collect_data_sdk_dotnet;

namespace ir.tax.gov.sdk.util
{
public class CryptoUtils
{
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)

.Where(x => x % 2 == 0)

.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))

.ToArray();

}
public static string NormalJson(object obj, Dictionary<string, string>
header)

{
if (obj == null && header == null)

throw new AccessViolationException();

Dictionary<string, object> map = null;

if (obj != null)

{
if (obj.GetType() == typeof(string))
{
if (obj.ToString().Trim().StartsWith("["))
{
obj = ToList<object>((string)obj);
}
else
{
obj = JsonConvert.DeserializeObject<object>((string)obj);
}
}
if (obj.GetType().IsGenericType && obj.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
PacketsWrapper packetsWrapper = new PacketsWrapper(obj);
map = ToDictionary<object>(packetsWrapper);
}
else
{
map = ToDictionary<object>(obj);
}
}
if (map == null && header != null)
{
map = new Dictionary<string, object>();
foreach (var headerElem in header)
map.Add(headerElem.Key, headerElem.Value.ToString());
}
if (map != null && header != null)
{
foreach (var headerElem in header)
map.Add(headerElem.Key, headerElem.Value);
}
Dictionary<string, object> result = new Dictionary<string, object>();
result = JsonHelper.DeserializeAndFlatten(JsonConvert.SerializeObject(map));
StringBuilder sb = new StringBuilder();
HashSet<string> keysSet = new HashSet<string>(result.Keys);
if (keysSet == null || !keysSet.Any())
{
return null;
}
var keys = keysSet.OrderBy(x => x).ToList();
foreach (var key in keys)
{
string textValue;
object value;
if (result.TryGetValue(key, out value))
{
if (value != null)
{
if (value.Equals(true) || value.Equals(false) || value.ToString().Equals("False") || value.ToString().Equals("True"))
{
textValue = value.ToString().ToLower();
}
else
{
textValue = value.ToString();
}
if (textValue == null || textValue.Equals(""))
{
textValue = "#";
}
else
{
textValue = textValue.Replace("#", "##");
}
}
else
{
textValue = "#";
}
}
else
{
textValue = "#";
}
sb.Append(textValue).Append('#');
}
return sb.Remove(sb.Length - 1, 1).ToString();
}
private static string getKey(string rootKey, string myKey)
{
if (rootKey != null)
{
return rootKey + "." + myKey;
}
else
{
return myKey;
}
}
public static Dictionary<string, TValue> ToDictionary<TValue>(object obj)
{
var json = JsonConvert.SerializeObject(obj);
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, TValue>>(json);
return dictionary;
}
public static List<Dictionary<string, object>> ToList<TValue>(string obj)
{
var dictionary = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(obj);
return dictionary;
}
}
}

کد بالا از کلاس دیگری به نام JSONHelper استفاده می کند که در ادامه آورده شده:

using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System;
using System.Collections.Generic; using System.IO;
using System.Linq; using System.Text;

namespace ir.tax.gov.sdk.util
{
public class JsonHelper
{
public static Dictionary<string, object> DeserializeAndFlatten(string json)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
JToken token = JToken.ReadFrom(new JsonTextReader(new StringReader(json)));
FillDictionaryFromJToken(dict, token, ""); return dict;
}
private static void FillDictionaryFromJToken(Dictionary<string, object>
dict, JToken token, string prefix)
{
switch (token.Type)
{
case JTokenType.Object:
foreach (JProperty prop in token.Children<JProperty>())
{
FillDictionaryFromJToken(dict, prop.Value, Join(prefix, prop.Name));
}
break;
case JTokenType.Array:
int index = 0;
foreach (JToken value in token.Children())
{
FillDictionaryFromJToken(dict, value, Join(prefix, index.ToString()));
index++;
}
break;
default:
dict.Add(prefix, ((JValue)token).Value);
break;
}
}
private static string Join(string prefix, string name)
{
return (string.IsNullOrEmpty(prefix) ? name : prefix + "." + name);
}
}
}

در کلاس CryptoUtils می توانید از متد NormalJson برای نرمالسازی JSON مدنظر استفاده کنید.

روش امضا رشته (string)

کد جاوا

public static String getSignedText(String text, String algorithm, PrivateKey privateKey) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
byte[] data = text.getBytes("UTF8");

Signature sig = Signature.getInstance(algorithm == null ? " SHA256WITHRSA"
: algorithm); sig.initSign(privateKey); sig.update(data);
byte[] signatureBytes = sig.sign();
return Base64.getEncoder().encodeToString(signatureBytes);
}

C# کد

public static string SignData(String stringToBeSigned, string privateKey)
{
var pem = "-----BEGIN PRIVATE KEY-----\n" + privateKey + "\n----- END PRIVATE KEY-----";	//
PemReader pr = new PemReader(new StringReader(pem));
AsymmetricKeyParameter privateKeyParams = (AsymmetricKeyParameter)pr.ReadObject();
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)privateKeyParams)
;

RSACryptoServiceProvider csp = new RSACryptoServiceProvider();//
cspParams);
csp.ImportParameters((RSAParameters)rsaParams);

var dataBytes = Encoding.UTF8.GetBytes(stringToBeSigned); return Convert.ToBase64String(csp.SignData(dataBytes,
HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
}

کد روش رمزگذاری به روش متقارن GCM /AES

کد جاوا

  • متد نحوه ایجاد کلید متقارن Random
public static SecretKey getAESKey(int keysize) throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(keysize, SecureRandom.getInstanceStrong()); return keyGen.generateKey();
}
  • متد ایجاد یک مقدار Random مورد استفاده در رمزنگاری متقارن (IV)
public static byte[] getRandomNonce(int byteSize) {

byte[] nonce = new byte[byteSize]; new SecureRandom().nextBytes(nonce); return nonce;
}
  • نحوه رمزنگاری با استفاده از SecretKey و IV
public static byte[] encrypt(byte[] pText, SecretKey secret, byte[] iv) throws Exception {
Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”); cipher.init(Cipher.ENCRYPT_MODE, secret, new GCMParameterSpec(128, iv)); return cipher.doFinal(pText);
}
  • کد نحوه XOR کردن دو آرایه
public static byte[] xor(byte[] a, byte[] b) {
int aLen = a.length;
int bLen = b.length;
int min = 0;
int size = aLen > bLen ? aLen : bLen;
byte[] c = new byte[size];

if (size == aLen) { min = bLen;
System.array(a, min, c, min, size - min);
} else {
min = aLen;
System.array(b, min, c, min, size - min);
}
for (int i = 0; i < min; i++) { c[i] = (byte) (a[i] ^ b[i]);
}
return c;
}

C# کد 2-4-1

در C# می توانید با []byte به صـــورت کامل تصـــادفی دو کلید IV و Key Secret را ایجاد کنید و از روش زیر متن خود را encrypt کنید:

public static string AesEncrypt(byte[] payload, byte[] key, byte[] iv)

{

var cipher = new GcmBlockCipher(new AesEngine());


byte[] baPayload = new byte[0];

cipher.Init(true, new AeadParameters(new KeyParameter(key), 128, iv, baPayload));
var cipherBytes = new byte[cipher.GetOutputSize(payload.Length)];

int len = cipher.ProcessBytes(payload, 0, payload.Length, cipherBytes, 0);
cipher.DoFinal(cipherBytes, len);

return Convert.ToBase64String(cipherBytes);

}

public static byte[] Xor(byte[] left, byte[] right)

{/*from w w w. ja v a 2 s . c o m*/ byte[] val = new byte[left.Length]; for (int i = 0; i < left.Length; i++) val[i] = (byte)(left[i] ^ right[i]); return val;
}

 

کد روش رمزگذاری به روش نامتقارن RSA-OAEP-SHA256

کد جاوا

public static String encrypt(String text, PublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
Cipher encryptCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA- 256ANDMGF1PADDING");
encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);


byte[] secretMessageBytes = text.getBytes(StandardCharsets.UTF_8);

byte[] encryptedMessageBytes = encryptCipher.doFinal(secretMessageBytes); return Base64.getEncoder().encodeToString(encryptedMessageBytes);
}

 

C# کد

public static string EncryptData(String stringToBeEncrypted, string publicKey)
{
try
{
//var pem = "-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-
----END PUBLIC KEY-----";	// Add header and footer
AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter;
RSAParameters rsaParameters = new RSAParameters(); rsaParameters.Modulus =
rsaKeyParameters.Modulus.ToByteArrayUnsigned();
rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();
RSACng rsa = new RSACng(); rsa.ImportParameters(rsaParameters);

string base64 = Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(stringToBeEncrypted
), RSAEncryptionPadding.OaepSHA256));

if (base64.Length % 4 == 3 )
{
base64 += "=";
} else if (base64.Length % 4 == 2)
{
base64 += "==";
}
return base64;
}
catch (Exception e)
{
return "error";
}
}

 

پیوست ۲

دریافت صورتحساب

  • نمونه CURL:
curl --location --request POST ' https://tp.tax.gov.ir/req/api/tsp/async/normal-enqueue' \
--header 'requestTraceId: 346edbfa-cf5f-11ec-9d64-0242ac120002' \
--header 'timestamp: 1645619844431' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJjbGllbnRUeXBlIjoiTUVNT1JZIiwicGVybWlzc2lvbnMiOlsic2Vs Zi10c3AuYXN5bmMuZmFzdC1lbnF1ZXVlIiwic2VsZi10c3Auc3luYyIsInNlbGYtdHNwLmFzeW5jL m5vcm1hbC1lbnF1ZXVlIl0sInBhY2tldFR5cGVzIjpbImludm9pY2UuZHJhZnQudjAwIiwiZ2V0X2 Zpc2NhbF9pbmZvcm1hdGlvbiIsImlucXVpcnlfYnlfdGltZV9yYW5nZSIsImlucXVpcnlfYnlfdGN uIiwiaW5xdWlyeV9ieV90aW1lIiwiZ2V0X3Rva2VuIiwiZ2V0X3NlcnZpY2Vfc3R1ZmZfbGlzdCIs ImdldF9lY29ub21pY19jb2RlX2luZm9ybWF0aW9uIiwiZ2V0X2Zpc2NhbF9mdWxsX2luZm9ybWF0a W9uIiwiaW5xdWlyeV9ieV9yZWZlcmVuY2VfbnVtYmVyIiwiZ2V0X3NlcnZlcl9pbmZvcm1hdGlvbi JdLCJpc3MiOiJUQVggT3JnYW5pemF0aW9uIiwiaWQiOiJ0ZXN0LXNlbGZ0Y3AtbWVtb3J5LWlkLTE iLCJleHAiOjE2NDU3MjkzNzUsInRheHBheWVySWQiOiJ0ZXN0LXRheHBheWVyLWlkLTEifQ.z0rQZ TXjdgLN7kiQ22- h095HUOex3hK3tSg2RvASis02lmS9xYOha3kBDVf8rN6eqbrHrWuc7u3kvsqq34fcCw' \
--header 'Content-Type: application/json' \
--data-raw '{
"packets":[{
"uid": "346edbfa-cf5f-11ec-9d64-0242ac120002", "packetType": "INVOICE.V01",
"retry": false, "data":
"Mt2l/b9FrZtxzM8+SGdNxVSCwHfPioMlX026yx6n9cUbwHaZSL68JX6bhV4MKhyiEyntIx0VTn7C m0heshfLtCOdE0SaJxClte3qQw5NSzW85t8VIAYnd9rqOufapmSGUa5Vs+YNhX2QAEQGHYMcVS8uK 0S++zIthLhm58DDK+v5iH+R240nvgVT79b/bH2O43ig/DwkT/0hXvW/JbEvJmrhf4QjMxz9ceEyTC en5fzYdaHdWd5/Y8Ci+5QAE9YrqKDoPhJtiS6UjrY2/hS+iQmk/FnO5pNC8xNT+R4D9oiDwgZmOz3 KV6MF1494ELT7oFQborCgzxXjjzOYlRB6bgWxgvTvs8b8YzoXKsabIUSACoFHm0HxpyGFm9k5VcXY cV9yTKFS/RpVSRfWYz5IT4qUQ0hikj6HfvrscKn5CFYVQcPpYx8Y7nWHPeY+PW/g6tJ+xZZ8d2r6Q KdvMXU6GZjb2Kvqf8FpVzeDNx065/CaYte1An5H+dimVz0XIQ7UE7pgLZcsv2fy2EC8IpFvOAnuaL eKvcSluBpGj6vx1Pa5dKSlFucTFQG8aslv5SX76bgO15gCpMglVHIAdn3wDqvp3OceHv/BS9xd2Dw kg35eGztMpj3hEHV1DHAMVF26L5A9vkC9R2efTjX6rQhJwlP/kGTVhkneV32HcAF562LNTqodxcVN
+s/NDGAbFHeND6LVOnEnwCSmuW40PokRl9wCuBnxGaxQ9xQqVowgo2optTgeGK2EVnNwxWgdlVXp2 2d9AVrzTogh3pxXNmyYO4JUihUkN6Vgmxlnc1cdDmtGEC51hNsDuFcibBLh/Q4MD4MchkHZBxqHJd JMF/yt7QZPWiEvBcvJRJe36tBzbd6sNed1KycDM3kAVEQPJgBH6QjsmbgXDJ+F4f2eW/GD5z0V72+ oWLvugHQJf90NxBB9j0wQZBj20tBjoww5o6kfIEeu7h8k26F7PW4f5AbC+6ler4xKD7mDxDDmI0qe bBXetgCOUdcWhIZ4MvAOMmRsZsYlZ1Noz4eFfLonL3U78C33e2EYICYsFstSdTBYFB9NWSoM6655l
oa6QQGZPyadlAKQJMZtR1UKR/lVKgHaKfyqqQGGdmgOjm1HUY+5Lm4J9l1Z8ETqs0sS383T06BNiF HTlX+ApFn8UbM3gKORiA1e5F8v4I5e7dqTb+et2Ivxee5TEkNXZXJoMGXFrQE/bho0W8A9kGi/ye1 udMcoxczmYSxWXXSdSbnlTHstcT7Fa2G31c1w0LDdVsq20yCK9vGCMqSNu9PMrefUb/3jP/a71d15 ecSNlQDbGdZ03ASkVQ8b356cuW6yuqECbvq1EeI1JlbB9T3wthKRvTcVRlTYvrLzf8ebdjAmysc+h rgnQ1FuJnwxoX6wXfnw+2ph1KMiaPrLH6p+bnm7+AUiaGu/LuSdBJPzYNQOEIrkJS5DrJi5KHn9jD 4b3gCQ97B8qspBspvd3mYLLVHQGU+qa4GP5EdoiU76vFzAHSHu+TOTDmKs9NQ7jUwuFlUov3+Fx/M LhUYkWyyDogbwGiyauK5wdgwhUi4AmBR8SwNMG/TxGIdB7xIsMydNOJOctKDJzTK0odvd4d7VkosN wVzhQw6C9okLJmBblnJbJQtOQZN5MIzXG6MfGkbgJ6g/zFPRKJf7+X9u9Vt83uUCx3ftrmdff/9uN
+5hbVep2gyxmMmiq4Lw2uKg8vyRSzDe7iACkfQWXO2Vstb1U3ZIT2iCzVNGyEYgsLLQdVO8yIjn8P fIuGsytMAqQx9iH2Q32rZqhB8vGsJQwBznKywv/u5wYRjlLVEN1dgGoqfXgjFdbdhjBzXLgbbLQ8+ FVi0GfCY88mRRKtkmzLnGJtwTenaNCsfrDDg7BeO/SCzuqij2P0r6WOV2X7zCQWKCThTWUWRu0IM0 nCdRIoshg2U2E/IQ+AIt4oQWjIFOQSy2cY4GUuVPXgwiFNvKV3xkYE3YyfeglPhJSKjlWnth9+V17
/C2IBGxXXVQxoLLgheq6IMLArZ6N0bvKX4y0Z2PE0COfpwYxBxEop6SdV4hFy3mZ1C5Wg4FaccfoG EJRpfCuYT59cIMF1xquwuMRyRBXrfGGzOdZe/1I4l/snweEqbXG2bXM/24/WOhdD3rR0X0+K+wmso bkoBUyTamhZDI8uuaHTYx1zQ/SJ9BgaV6C70s+K7jiUjXJgc0yinsmsk0B3yoq5tCqpIfcyZ5hbHw R7Vqc+2TgtygmQXMjg+Tu3O1j3J/Xqse6UoFy+RTM0hEmfMyGMmXQeX4X2IZ5fa98hglPdsdrvm4J mDvfjDnLCOpLDNeHqvEhKj8p9Kmxwdox6lV058UeWwZA5ZH7O/Krk+NdFzua1g=",
"encryptionKeyId": "31cf3e11-c468-4b14-90a4-d7c8c7e72fd5", "symmetricKey":
"cBAkPRW8JJiouZM0zLgiqIgtaqjUcWlNr2CoZj6uH4ESMIfJjTgR7kdOj5msAlblf5vcN21AYtv3 3+UHNipM0bAq30QIf9TnCQgNY+fbalFHQl5Em7/VE+5WYEr+N5uPnRHX/JK2j/A2/jiwwYmi9+Gey FK2QQYGLUYrfPUw+ifUG1veJldPAocwkDlRxZVXp+hV1L2fKxSwDUCVF5Uvr5jX8ACwmMa8t5qCco w/xWXumod1BfE9sPOUonOZ1hVINscJYrN4y7MG0Re88F/WRyL4grznetSSKOsAGTrGVflKZ1Mm3ng DF+o+8+t1WtVzF5Hj0zv6ODAiX3ikS03efMbFtGGQ5WygoEhhWLgt9/CqjkEm7qHE5T0iQ+pE+f1o TNXfh4eGH/+j9zeI//uLxcHSH/TnTmUlGxlareNXakumtcrKKulNAw2Mm7F+XBLKXXMfW3iJrTPd3
/hpycPTVpu/6SO/7JMKUA44+irWw5AaXl7j4EDWF72AvVDJCPlh2Qw7KrW7u4HFeT3Qll5L2vuP/E TWvFVgBitP5DbdB9nFoSb8NwKZn6AqGgYalOVz+8Y8SHgEBueix3V4e5PIm31WTbViqgnANP4TVft T3ZL3b3yBkjvQpvbc2CtstXgG05C16FzWX16UiR+IYZ7ahOolaTwmZr+GJA87ZLjKaK4=",
"iv": "dee90162e26db3f2246f052f38168ed0", "dataSignature" : "VSvyWrpmT1TwI8I1vUUe9wF0EGNFMZ/2dPgM1tjO0vr8agPDHoTOiL5J3XxqvFCauCOfaFs6iVpw dccwAtXfsFJ4wNQF3Mqr1I9un1v5AEePPeXAUp46CKl4Ny5sm3WGDTdnezx1+4FBCvO5uP07RkeDw ASyYOySFdWl9d6fHes7KNkaLW72NetbTaZWytQtHx7ib+7cJyG+54eLAY3L6EIuoNiRSIlC1Pn53Q 8AT90uRV8UPSCcpiZhg/YINQXrunF2YH/LbTSqckwFsdukqg6BGZJbaqPwMfvm2WdPZLNTEW/BgNm 2SmSNwxqivQb1AY2mcfNgO6dkyDCRVWTUeA==",
"fiscalId": "AA56CD"
}],
"signature": "FohMakKq0WRMPQD0nStssK2iP0bbFojw7w+NVUoWjTdyRFNeKBQeLP9FpL3r5u6EliSKUiO3vulI vBzEbAaFBuEHSbmyr3qOTN0CpuORdzqHDT/oNk/evvpOoEFt3LvowfLBoxNLDhAGrzD1K56jlRco9 3U4iplJgKzFmm9hlmByzTfDEe9FLX/22Gy9regeYtTg9sc12URu7csVttUr8YjcqFxuR82l4m0tZd Rf6jR709YZmskarPXavPsDr8buz7dzOHI0hIeokOvToyG3J1bAVMl0SdWREq1Ix0czJ5jLnMiI8N3 1s8rvnypKzo5yWDOjXECTrLfRr+8MgK42Sw=="
}'
{
"signature": "", "signatureKeyId": "", "timestamp": 1652605524, "result": [
{
"uid": "8a00f17a-bd35-46bc-ae52-3f61fab868c2", "referenceNumber": "967072eb-203e-428e-b9bb-6d2efdb9d356", "errorCode": null,
"errorDetail": null
}
]
}

 

  • نمونه پاسخ درخواست در صورت رخداد خطا:
{
"signature": "", "signatureKeyId": "", "timestamp": 1652605524, "result": [
{
"uid": "8a00f17a-bd35-46bc-ae52-3f61fab868c2",
"referenceNumber": null,
"errorCode": "5008",
"errorDetail": "invalid.request.uid"
}
]
}

متد دریافت توکن

  • نمونه CURL:
curl --location --request POST 'https://tp.tax.gov.ir/req/api/tsp/sync/GET_TOKEN' \
--header 'requestTraceId: 1655185848687' \
--header 'timestamp: 1655185848687' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "GET_TOKEN", "retry": false,
"data": {
"username": "test-tsp-id-1"
},
"encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "", "dataSignature":""
},
"signature": "IiIdkclswu3Krc8ZM7MQvEy7ZWzJmBPSl1CQrI0dhLGdRPRrmomVo+UkbdzRyuth9G4EnbgOjnjz 5WJcfO8MuBVouASTMfv/OCOhAkxTudQtWzUO0d6BU/YiRT5alNwdey0dMsn3T083luLv9iG/lKKz9 ewUem0RwBYOnehD6rJFXHirGDfJPHBOTSHCqHL1vQe0JLZAQwaTTieEE8zNWXwNr53BS2KxRKX8+M
leoUl8LWUn6wZS/zs3auOKSRSO5pgJVq6zZCadd5D7vlhrw1KB/XfO4pv8GexAx2dbRMiGG5eumQG BcLo1RvJW2mZsGu+dQRm/NwnIpN7CP5qlkg=="

}'
  • نمونه پاسخ درخواست:
{
"signature": null, "signatureKeyId": null, "timestamp": 1655185988494, "result": {
"uid": null,
"packetType": "TOKEN_RESULT", "data": {
"token": "eyJhbGciOiJIUzUxMiJ9.eyJjbGllbnRUeXBlIjoiVFNQIiwidG9rZW5JZCI6IjZlODlhZDQ3L TBlZjQtNDRmNC05YWZkLWI5MjdlNDM1ZmI2NyIsInBlcm1pc3Npb25zIjpbInRzcC5hc3luYy5m YXN0LWVucXVldWUiLCJ0c3AuYXN5bmMubm9ybWFsLWVucXVldWUiLCJ0c3Auc3luYyJdLCJwYWN rZXRUeXBlcyI6WyJHRVRfRUNPTk9NSUNfQ09ERV9JTkZPUk1BVElPTiIsIklOUVVJUllfQllfVE lNRSIsIkdFVF9TRVJWRVJfSU5GT1JNQVRJT04iLCJJTlFVSVJZX0JZX1VJRCIsIklOUVVJUllfQ llfUkVGRVJFTkNFX05VTUJFUiIsIkdFVF9UT0tFTiIsIkdFVF9GSVNDQUxfSU5GT1JNQVRJT04i LCJJTlZPSUNFLlYwMSIsIklOUVVJUllfQllfVElNRV9SQU5HRSIsIkdFVF9TRVJWSUNFX1NUVUZ
GX0xJU1QiXSwiaXNzIjoiVEFYIE9yZ2FuaXphdGlvbiIsImlkIjoidGVzdC10c3AtaWQtMSIsIm V4cCI6MTY1NTIwMDM4OCwiY3JlYXRlRGF0ZSI6MTY1NTE4NTk4ODQ5Mn0.SF06IpHsdSEKHDC0V
lX7oqgVITzy5S3ksehSHSbdrfwiaYxDT1mMn541TV8zP-HowhBs8u1fjs_S81kiZON4FA",
"expiresIn": 1655200388492
},
"encryptionKeyId": null, "symmetricKey": null, "iv": null
}
}

 

استعلام اطلاعات حافظه مالیاتی مودی و حد مجاز فروش مودی

  • نمونه CURL:
curl --location --request POST 'https://tp.tax.gov.ir/req/api/tsp/sync/GET_FISCAL_INFORMATION' \
--header 'requestTraceId: 1655188530459' \
--header 'timestamp: 1655188530459' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJjbGllbnRUeXBlIjoiVFNQIiwidG9rZW5JZCI6IjZlODlhZDQ3LT BlZjQtNDRmNC05YWZkLWI5MjdlNDM1ZmI2NyIsInBlcm1pc3Npb25zIjpbInRzcC5hc3luYy5mY XN0LWVucXVldWUiLCJ0c3AuYXN5bmMubm9ybWFsLWVucXVldWUiLCJ0c3Auc3luYyJdLCJwYWNr ZXRUeXBlcyI6WyJHRVRfRUNPTk9NSUNfQ09ERV9JTkZPUk1BVElPTiIsIklOUVVJUllfQllfVEl NRSIsIkdFVF9TRVJWRVJfSU5GT1JNQVRJT04iLCJJTlFVSVJZX0JZX1VJRCIsIklOUVVJUllfQl lfUkVGRVJFTkNFX05VTUJFUiIsIkdFVF9UT0tFTiIsIkdFVF9GSVNDQUxfSU5GT1JNQVRJT04iL CJJTlZPSUNFLlYwMSIsIklOUVVJUllfQllfVElNRV9SQU5HRSIsIkdFVF9TRVJWSUNFX1NUVUZG
X0xJU1QiXSwiaXNzIjoiVEFYIE9yZ2FuaXphdGlvbiIsImlkIjoidGVzdC10c3AtaWQtMSIsImV 4cCI6MTY1NTIwMDM4OCwiY3JlYXRlRGF0ZSI6MTY1NTE4NTk4ODQ5Mn0.SF06IpHsdSEKHDC0Vl
X7oqgVITzy5S3ksehSHSbdrfwiaYxDT1mMn541TV8zP-HowhBs8u1fjs_S81kiZON4FA' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "GET_FISCAL_INFORMATION",
"retry": false, "data": null, "encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "AA56CD", "dataSignature":""
},
"signature": "WjL0C+zYwHyJ0xZCntfGw59tuZ9jUyjPLFWJq7j8KOZ1VkFrGuSaxFXukndE0NCf3jKHFGBUqu Fe9jGCktGBRz6b+oBycCZJtH4BcwiyTkrg+nLfduBEc6bhRA48ZiKBBNAM/8RRSRj8tC0AoStj7 90gdw10SkS1yYZ4t0KRfxVl2a21wGWSF5ahsyt3LQptloKUjZTrHt6UtVU2WvIPnFkb4p6P/pw2
YjA8YfcHCdn/WqrCFvA4YC+09cvlqwRdxk8tEfxzyiczStRrd5Jq8UVZDBjXJIwel7GTeSWI9+h bCqcpAeHhK8cbUi7grdVkBgXucBlVE6Lfam+/SqBD0A=="
}'

 

  • نمونه پاسخ سرویس بالا:
{
"signature": null, "signatureKeyId": null, "timestamp": 1655188711025, "result": {
"uid": null,
"packetType": "FISCAL_INFORMATION",
"data": {
"nameTrade": "AA56CD", "fiscalStatus": "ACTIVE", "saleThreshold": 50.0,
"economicCode": "12345678911234"
},
"encryptionKeyId": null, "symmetricKey": null, "iv": null
}
}

 

دریافت پاسخ بسته های ارسالی غیرهمگام (استعلام)

استعلام از طریق UID) Inquiry_by_uid):

  • نمونه CURL:
curl --location --request POST 'https://tp.tax.gov.ir/req/api/tsp/sync/INQUIRY_BY_UID' \
--header 'requestTraceId: 1655186523487' \
--header 'timestamp: 1655186523487' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJjbGllbnRUeXBlIjoiVFNQIiwidG9rZW5JZCI6IjZlODlhZDQ3LT BlZjQtNDRmNC05YWZkLWI5MjdlNDM1ZmI2NyIsInBlcm1pc3Npb25zIjpbInRzcC5hc3luYy5mY XN0LWVucXVldWUiLCJ0c3AuYXN5bmMubm9ybWFsLWVucXVldWUiLCJ0c3Auc3luYyJdLCJwYWNr ZXRUeXBlcyI6WyJHRVRfRUNPTk9NSUNfQ09ERV9JTkZPUk1BVElPTiIsIklOUVVJUllfQllfVEl NRSIsIkdFVF9TRVJWRVJfSU5GT1JNQVRJT04iLCJJTlFVSVJZX0JZX1VJRCIsIklOUVVJUllfQl lfUkVGRVJFTkNFX05VTUJFUiIsIkdFVF9UT0tFTiIsIkdFVF9GSVNDQUxfSU5GT1JNQVRJT04iL
CJJTlZPSUNFLlYwMSIsIklOUVVJUllfQllfVElNRV9SQU5HRSIsIkdFVF9TRVJWSUNFX1NUVUZG
X0xJU1QiXSwiaXNzIjoiVEFYIE9yZ2FuaXphdGlvbiIsImlkIjoidGVzdC10c3AtaWQtMSIsImV 4cCI6MTY1NTIwMDM4OCwiY3JlYXRlRGF0ZSI6MTY1NTE4NTk4ODQ5Mn0.SF06IpHsdSEKHDC0Vl
X7oqgVITzy5S3ksehSHSbdrfwiaYxDT1mMn541TV8zP-HowhBs8u1fjs_S81kiZON4FA' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "INQUIRY_BY_UID", "retry": false,
"data": [
{"uid":"3b33584c-331e-4fbc-97ea-8d294a2009db","fiscalId":
"AA56CD"}
, {"uid":"8d595073-6349-423e-847f-83ae8a126394","fiscalId": "AA56CD"}
, {"uid":"c0b286fd-b30f-49d7-97ca-640e91652f6f","fiscalId": "AA56CD"}
],
"encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "", "dataSignature":""
},
"signature": "Vny+goEh3eDH1HCijyvD7LLvUi+iAJEmgkl8jc1yp73SrNHz0RHaFbsgXICN5F52zV8HPfa3YI cddBi3ZjVNVs9RA+HsEHolavOecPLo9AOIGS7y+BtvV1FBKLTizbflpejprrSvN78ledJQmEsjg MMiVZA1zexQ8HU73/kf3fIyaviXXVyVcwM7DFqiyVdVV4IX3klJYVzyamUO8PDl9zTcwQMxwiSd QiQ/plZtx0wzP2UTyLmy47jskdJVjpDseM1iSEt6fy+18R98iqvBFiKi5njo5ONr+yTHQusTfwF X6I2uhYNML6/aC8EByFbTjVuJXyIOrM7CqnP77SbavA=="

 

استعلام با رسید یکتای دریافت صورتحساب (Inquiry_by_reference_number):

  • نمونه ارسال درخواست CURL:
curl --location --request POST ''https://tp.tax.gov.ir/req/api/tsp/sync/INQUIRY_BY_REFERENCE_NUMBER' \
--header 'requestTraceId: 1655186644886' \
--header 'timestamp: 1655186644886' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJjbGllbnRUeXBlIjoiVFNQIiwidG9rZW5JZCI6IjZlODlhZDQ3LTBl ZjQtNDRmNC05YWZkLWI5MjdlNDM1ZmI2NyIsInBlcm1pc3Npb25zIjpbInRzcC5hc3luYy5mYXN0L WVucXVldWUiLCJ0c3AuYXN5bmMubm9ybWFsLWVucXVldWUiLCJ0c3Auc3luYyJdLCJwYWNrZXRUeX BlcyI6WyJHRVRfRUNPTk9NSUNfQ09ERV9JTkZPUk1BVElPTiIsIklOUVVJUllfQllfVElNRSIsIkd
FVF9TRVJWRVJfSU5GT1JNQVRJT04iLCJJTlFVSVJZX0JZX1VJRCIsIklOUVVJUllfQllfUkVGRVJF
TkNFX05VTUJFUiIsIkdFVF9UT0tFTiIsIkdFVF9GSVNDQUxfSU5GT1JNQVRJT04iLCJJTlZPSUNFL lYwMSIsIklOUVVJUllfQllfVElNRV9SQU5HRSIsIkdFVF9TRVJWSUNFX1NUVUZGX0xJU1QiXSwiaX
NzIjoiVEFYIE9yZ2FuaXphdGlvbiIsImlkIjoidGVzdC10c3AtaWQtMSIsImV4cCI6MTY1NTIwMDM 4OCwiY3JlYXRlRGF0ZSI6MTY1NTE4NTk4ODQ5Mn0.SF06IpHsdSEKHDC0VlX7oqgVITzy5S3ksehS
HSbdrfwiaYxDT1mMn541TV8zP-HowhBs8u1fjs_S81kiZON4FA' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "INQUIRY_BY_REFERENCE_NUMBER",
"retry": false, "data": { "referenceNumber":
["04af9b37-07e4-4019-88c2-efeaa844552f","99fab38b-b32f-49cb-89d8- 71e52cae2d91","6c2983cb-0fe4-4da4-b93f-2e30e9652631"]
},
"encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "AA56CD", "dataSignature":""
},
"signature": "MMy9CYojEIPEYg1I0gNbahYLJfST7VEEYA7bXr7/ZTHjvYMEoUeFQU9EcaN2sIhx/833abKw7FD0 cHeICnEBCWngc0WowS1ZScfWlviW8hrRQlAAZjaZcPw0JUXLgkM2rdUDPTBy8ENUbOGmGvDajcOOF NbO3GAtRD97szK8Na56qSDsnG7uDpqxS2r+xI0JtUKxJFJyL1i57u2wZbwUCw2uN7Ocd0XDD08oLZ I2CQxvwu/TV+vzaFOPqlTYtLk54H82ShFtXtaqbHnt7RTtX70aOs0P16SYxDaMfrr0EuV0p3FI5lF wz3TZzYF0OAVaSExv95UT5fRXKSOZDWhzPw=="

 

دریافت خطاهای بسته های ارسالی غیرهمگام با استفاده از زمان (INQUIRY_BY_TIME):

  • نمونه CURL:
TkNFX05VTUJFUiIsIkdFVF9UT0tFTiIsIkdFVF9GSVNDQUxfSU5GT1JNQVRJT04iLCJJTlZPSUNFL lYwMSIsIklOUVVJUllfQllfVElNRV9SQU5HRSIsIkdFVF9TRVJWSUNFX1NUVUZGX0xJU1QiXSwiaX
NzIjoiVEFYIE9yZ2FuaXphdGlvbiIsImlkIjoidGVzdC10c3AtaWQtMSIsImV4cCI6MTY1NTIwMDM 4OCwiY3JlYXRlRGF0ZSI6MTY1NTE4NTk4ODQ5Mn0.SF06IpHsdSEKHDC0VlX7oqgVITzy5S3ksehS
HSbdrfwiaYxDT1mMn541TV8zP-HowhBs8u1fjs_S81kiZON4FA' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {

"uid": null,
"packetType": "INQUIRY_BY_TIME", "retry": false,
"data": {
"time" : 14010321
},
"encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "", "dataSignature":""
},
"signature": "elHDykQjZBzgM9NIMSEVR+dYfDcAbowWF0OvEzI31WRuBwMVmmmYkXg6b4q6oIj+78Cgwd1O6Jo4 5zuaH1eNSxVc67xr7hagpnyvnVQYt2ot3Y5Rk+MJ0BkyfE06qv45yzV2kwe5CkfCAH2ccvFnnkEGd ol5CoaAyJk51hWNTPpGmOdXAwoEoUE2gjDRZqtRsgzMOmum5ep7GoPQ/8WildWNgxuVRLaWIqNmZs EuBDVLgJsY7xFMGczFCyZtlNwZwV1FVTDZVmn8XNDClu7eOIRX/krnF932EAxWiWG5zidyr/geXyz gpmFevQQbe1OeedCuLcFVT+GrNGfJUuzakw=="
}'

دریافت خطاهای بسته های اراسلی غیرهمگام با استفاده از بازه زمانی INQUIRY_BY_TIME_RANGE:

  • نمونه CURL:
curl --location --request POST ''https://tp.tax.gov.ir/req/api/tsp/sync/INQUIRY_BY_TIME_RANGE' \
--header 'requestTraceId: 1655187263981' \
--header 'timestamp: 1655187263981' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJjbGllbnRUeXBlIjoiVFNQIiwidG9rZW5JZCI6IjZlODlhZDQ3LTBl ZjQtNDRmNC05YWZkLWI5MjdlNDM1ZmI2NyIsInBlcm1pc3Npb25zIjpbInRzcC5hc3luYy5mYXN0L WVucXVldWUiLCJ0c3AuYXN5bmMubm9ybWFsLWVucXVldWUiLCJ0c3Auc3luYyJdLCJwYWNrZXRUeX BlcyI6WyJHRVRfRUNPTk9NSUNfQ09ERV9JTkZPUk1BVElPTiIsIklOUVVJUllfQllfVElNRSIsIkd FVF9TRVJWRVJfSU5GT1JNQVRJT04iLCJJTlFVSVJZX0JZX1VJRCIsIklOUVVJUllfQllfUkVGRVJF TkNFX05VTUJFUiIsIkdFVF9UT0tFTiIsIkdFVF9GSVNDQUxfSU5GT1JNQVRJT04iLCJJTlZPSUNFL lYwMSIsIklOUVVJUllfQllfVElNRV9SQU5HRSIsIkdFVF9TRVJWSUNFX1NUVUZGX0xJU1QiXSwiaX
NzIjoiVEFYIE9yZ2FuaXphdGlvbiIsImlkIjoidGVzdC10c3AtaWQtMSIsImV4cCI6MTY1NTIwMDM 4OCwiY3JlYXRlRGF0ZSI6MTY1NTE4NTk4ODQ5Mn0.SF06IpHsdSEKHDC0VlX7oqgVITzy5S3ksehS
HSbdrfwiaYxDT1mMn541TV8zP-HowhBs8u1fjs_S81kiZON4FA' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "INQUIRY_BY_TIME_RANGE", "retry": false,
"data": {
"startDate" :
14010321,
"endDate" :
14010324
},
"encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "", "dataSignature":""
},
"signature": "I/xb+7NttCGMd2+vw3qOWrVlFTKRHgcXDB+TBn0kTLrLg8bFLvT+Q7XSUNfDAXi5wo+Sn5sDGpJ1 jDF+nb66y3XnBP31ssbwkMTMemlNG1r6MWUednt6SYg2WNqqaDCsHUmfldfijVX7N/KUlmgnuVcMx oLEo8xf7o6UawWdYsOMrqbw2NWBZkrlYaFQQO9QdIzA5LxBjguumSW10D9fziFcyP+itTK9l/FUzZ j2uQCx/C/gzcWbZu/MdxMd1dZOy8MjWgCVccTe9oKPcVSKE8sWggiz1Vp6dClauekOeBbhjlFQh1E sOyxN10FVqbj2PIAP/im58LaKqe09GBbc4A=="
}'
"uid": null,
"packetType": "INQUIRY_RESULT", "data": [
{
"referenceNumber": "967072eb-203e-428e-b9bb-6d2efdb9d356", "uid": "8a00f17a-bd35-46bc-ae52-3f61fab868c2",
"status": "SUCCESS", "data": {
"confirmationReferenceId": "d4c0e7e6-d42e-11ec-9d64-0242ac120002", "taxResult": "SUCCESS"
},
"packetType": "RECEIVE_INVOICE_CONFIRM",
"fiscalId": "SAU5BC"
}
],
"encryptionKeyId": null, "symmetricKey": null, "iv": null
}

  • نمونه پاسخ درخواست های استعلام در صورت رخ دادن خطا:
{
"uid": null,
"packetType": "INQUIRY_RESULT", "data": [
{
"referenceNumber": "6df7b185-5254-4f58-b3e6-61169b5d5929", "uid": "3b33584c-331e-4fbc-97ea-8d294a2009db",
"status": "FAILED", "data": {
"confirmationReferenceId": null, "taxResult": "memory-id.is.null"
},
"packetType": "ERROR", "fiscalId": null
}
],
"encryptionKeyId": null, "symmetricKey": null, "iv": null
}

دریافت اطلاعات سرور GET_SERVER_INFORMATION

  • نمونه CURL:
curl --location --request POST 'https://tp.tax.gov.ir/req/api/tsp/sync/GET_SERVER_INFORMATION' \
--header 'requestTraceId: 1654938179880' \
--header 'timestamp: 1654938179880' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "GET_SERVER_INFORMATION",
"retry": false, "data": null, "encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "", "dataSignature":""
}
}'

  • نمونه پاسخ درخواست :
{
"signature": null, "signatureKeyId": null, "timestamp": 1655184692934, "result": {
"uid": null,
"packetType": "SERVER_INFORMATION",
"data": {
"serverTime": 1655184692934, "publicKeys": [
{
"key": "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxdzREOEfk3vBQogDPGTMqdDQ7t0oDhuK MZkA+Wm1lhzjjhAGfSUOuDvOKRoUEQwP8oUcXRmYzcvCUgcfoRT5iz7HbovqH+bIeJwT4rmLmFcbf Pke+E3DLUxOtIZifEXrKXWgSVPkRnhMgym6UiAtnzwA1rmKstJoWpk9Nv34CYgTk8DKQN5jQJqb9L
/Ng0zOEEtI3zA424tsd9zv/kP4/SaSnbbnj0evqsZ29X6aBypvnTnwH9t3gbWM4I9eAVQhPYClawH Tqvdaz/O/feqfm06QBFnCgL+CBdjLs30xQSLsPICjnlV1jMzoTZnAabWP6FRzzj6C2sxw9a/WwlXr Kn3gldZ7Ctv6Jso72cEeCeUI1tzHMDJPU3Qy12RQzaXujpMhCz1DVa47RvqiumpTNyK9HfFIdhgou pFkxT14XLDl65S55MF6HuQvo/RHSbBJ93FQ+2/x/Q2MNGB3BXOjNwM2pj3ojbDv3pj9CHzvaYQUYM
1yOcFmIJqJ72uvVf9Jx9iTObaNNF6pl52ADmh85GTAH1hz+4pR/E9IAXUIl/YiUneYu0G4tiDY4ZX
ykYNknNfhSgxmn/gPHT+7kL31nyxgjiEEhK0B0vagWvdRCNJSNGWpLtlq4FlCWTAnPI5ctiFgq925 e+sySjNaORCoHraBXNEwyiHT2hu5ZipIW2cCAwEAAQ==",
"id": "6a2bcd88-a871-4245-a393-2843eafe6e02",
"algorithm": "RSA", "purpose": 1
}
]
},
"encryptionKeyId": null, "symmetricKey": null, "iv": null
}
}

دریافت لیست کامل شناسه کالا/خدمات و نرخ مالیاتی GET_SERVICE_STUFF_LIST

  • نمونه CURL:
curl --location --request POST 'https://tp.tax.gov.ir/req/api/tsp/sync/ GET_SERVICE_STUFF_LIST \
--header 'requestTraceId: 1654521784527' \
--header 'timestamp: 1654521784527' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "GET_SERVICE_STUFF_LIST", "retry": false,
"data": {
"page" : 1,
"size" : 10
},
"encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "", "dataSignature":""
}
}'
  • نمونه پاسخ:
{
"signature": null,
"signatureKeyId": null,
"timestamp": 1655190910633, "result": {
"uid": null,
"packetType": "SERVICE_STUFF_LIST", "data": {
"result": [
{
"tax": 9,
"itemId": "1"
}
],
"pagination": { "size": 10,
"page": 1,
"total": 1
}
},
"encryptionKeyId": null, "symmetricKey": null, "iv": null
}

استعلام اطلاعات شماره اقتصادی GET_ECONOMIC_CODE_INFORMATION

نمونه CURL:

curl --location --request POST ''https://tp.tax.gov.ir/req/api/tsp/sync/GET_ECONOMIC_CODE_INFORMATION' \
--header 'requestTraceId: 1654521302712' \
--header 'timestamp: 1654521302712' \
--header 'Content-Type: application/json' \
--data-raw '{
"time": 1,
"packet": {
"uid": null,
"packetType": "GET_ECONOMIC_CODE_INFORMATION",
"retry": false, "data": {
"economicCode":"12345678911234"

},
"encryptionKeyId": "", "symmetricKey": "",
"iv": "",
"fiscalId": "", "dataSignature":""
}
}'
  • نمونه پاسخ:
{
"signature": null, "signatureKeyId": null, "timestamp": 1655191021181, "result": {
"uid": null,
"packetType": "ECONOMIC_CODE_INFORMATION",
"data": {
"nameTrade": "دولت پیشخوان", "taxpayerStatus": "فعال", "taxpayerType": "حقوقی", "postalcodeTaxpayer": "", "addressTaxpayer": "تهران"
},
"encryptionKeyId": null, "symmetricKey": null, "iv": null
}
}

نحوه ارسال صورتحساب الکترونیکی با لیمو

ثبت نام رایگان در کمتر از 1 دقیقه ثبت نام/ ورود

ایجاد مودی و اعتبارسنجی کلید خصوصی و عمومی سامانه مودیان توسط سامانه لیمو

تست اتصال رایگان به سامانه مودیان با ارسال 1 صورتحساب رایگان

انتخاب شناسه کالا خدمت جستجوی شناسه

ارسال صورتحساب و مشاهده نتیجه

چاپ فاکتور در صورت نیاز

در کلیه مراحل میتونین با پشتیبانی ما تماس بگیرین تا مشکلات احتمالی رو با هم بر طرف کنیم



بیشتر بخوانید:

  1. صفر تا صد صدور و ارسال صورتحساب الکترونیکی رایگان به سامانه مودیان مالیاتی


  2. آیا صدور و ارسال صورتحساب الکترونیکی بدون نرم افزار ممکن است؟ معرفی نرم افزار واسط تحت وب سامانه مودیان لیمو

  3. چگونه کلید خصوصی و عمومی سامانه مودیان دریافت کنیم؟


  4. پر تکرار ترین خطاهای سامانه مودیان و روش رفع آنها


  5. قوانین و نکات صدور و ارسال صورتحساب صادرات به سامانه مودیان


  6. صورت وضعیت پیمانکاری چیست؟ آموزش ارسال صورتحساب قرارداد پیمانکاری


  7. مراحل دریافت شناسه یکتای مالیاتی


  8. نگاهی فنی به سامانه مودیان مالیاتی - نکات سامانه مودیان مالیاتی


  9. ارسال صورتحساب اصلاحی، آموزش صدور صورتحساب الکترونیکی اصلاحی، ابطالی و برگشتی


  10. تفاوت نوع اول و دوم صورتحساب الکترونیکی


  11. نحوه صدور و ارسال رایگان صورتحساب الکترونیکی به سامانه مودیان مالیاتی


  12. صورتحساب الکترونیکی مالیات چیست؟ انواع صورتحساب الکترونیکی


صفر تا صد صدور صورتحساب الکترونیکی نوع اول و دوم پارت اول
صفر تا صد صدور صورتحساب الکترونیکی نوع اول و دوم پارت دوم
صفر تا صد صدور صورتحساب الکترونیکی نوع اول و دوم پارت سوم
صفر تا صد صدور صورتحساب الکترونیکی نوع اول و دوم پارت چهارم
صفر تا صد صدور صورتحساب الکترونیکی نوع اول و دوم پارت پنجم
صفر تا صد صدور صورتحساب الکترونیکی نوع اول و دوم پارت شش و آخر


دیدگاهی وجود ندارد، شما اولین دیدگاه را ایجاد کنید.

  • * توجه: دیدگاه ها بعد از تایید مدیر سایت نمایش داده میشوند.
  • * توجه: دیدگاه های حاوی توهین و الفاظ نامناسب تایید نمی شوند.
  • * توجه: فقط دیدگاه های فارسی تایید میشوند.


مطالب محبوب مطالب جدید