<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های علی‌رضا زمانی</title><link>https://virgool.ir/feed/@alitnk</link><description>دوست‌دار تکنولوژی</description><language>fa</language><pubDate>2026-11-11 21:28:22</pubDate><image><url>https://files.virgool.ir/upload/users/1259437/avatar/avatar.png</url><title>علی‌رضا زمانی</title><link>https://virgool.ir/@alitnk</link></image><item><title>تراکنش آنلاین در Node.js با پکیج Monopay</title><link>https://virgool.ir/@alitnk/انجام-تراکنش-آنلاین-با-سرویس-ها-مختلف-در-nodejs-با-polypay-ok6uqntbnerd</link><description>اضافه کردن سیستم پرداخت آنلاین به یک برنامه Node.js میتونه چالش های مختلفی داشته باشه. برای اضافه کردن پرداخت آنلاین ابتدا باید یک سرویس رو انتخاب کنیم، مستندات سرویس رو کامل بخونیم و شروع به نوشتن کد برای ایجاد درخواست پرداخت، ارسال کاربر به صفحه پرداخت، تایید صحت پرداخت و گرفتن خطا های مختلفی که ممکن هست توی این روند اتفاق بیفتند کنیم. اما اگر یک ماه بعد بخواهیم سرویس درگاه پرداخت را عوض کنیم چه اتفاقی می‌افتد؟ باید تمام این موارد از اول پیاده سازی شوند، و سرویس های درگاه پرداخت ایرانی بسیار متفاوت هستند. تمام موارد مربوط به درخواست،‌ ارسال کاربر، تایید صحت پرداخت و گرفتن خطا و... باید دوباره چک شوند،‌ چون بحث پرداخت آنلاین، بحث پول کاربران شماست و بسیار حساس است.تمام این موارد ما رو به فکر ساخت یک بسته انداختند که یک رابط برای ارتباط با تمام درگاه ها داشته باشد و به ما اطمینان دهد که در روند پرداخت خطای غیر منتظره ای رخ نمی‌دهد. این شد که شروع به نوشتن مونو‌پِی(Monopay) کردیم.برای استفاده از این بسته، ابتدا بسته را از npm دریافت کنید. در صورتی که از npm استفاده می‌کنید کد زیر را در ترمینال خود وارد کنید:npm install monopayو در صورتی که از yarn استفاده می‌کنید:‌yarn add monopayسپس درایور مربوط به درگاه مورد نظر خود را بسازید:import { getPaymentDriver } from &#39;monopay&#39;;&#xA;const driver = getPaymentDriver(&#34;zibal&#34;, {  merchantId: &#34;zibal-merchant&#34;, sandbox: true });در صورتی که از TypeScript استفاده می‌کنید، می توانید به این صورت از type safety بهره‌مند شوید:import { getPaymentDriver, Zibal } from &#39;monopay&#39;;  &#xA;const driver = getPaymentDriver&lt;Zibal&gt;(&#34;zibal&#34;, {  merchantId: &#34;zibal-merchant&#34;, sandbox: true });درخواست برای پرداختبرای ارسال درخواست پرداخت، از متد requestPayment استفاده کنید. این متد یک ورودی به صورت آبجکت دریافت می‌کند که شامل فیلد های callbackUrl، amount و سایر فیلد های مخصوص به درایور مورد استفاده است.const paymentInfo = await driver.requestPayment({&#xA;  amount: 50000, // in Rial (IRR)&#xA;  callbackUrl: &#34;https://my-site.com/callback&#34;,&#xA;  description: &#34;Description about the transaction&#34;,&#xA;});مقدار برگشتی متد requestPayment, یک کلاس است که موارد زیر را شامل می‌شود:اطلاعات در‌مورد پرداختreferenceId: شمارنده‌ای یکتا که به پرداخت فعلی ارجاع دارد، این شمارنده را در جایی ذخیره کنید.اطلاعات در‌مورد نحوه انتقال کاربرurl: لینکی که باید کاربر را به آن بفرستیدmethod: روشی که باید به آن کاربر را بفرستید. با‌توجه به درایور مورد استفاده می تواند GET یا POST باشدparams: اطلاعاتی که باید همراه با کاربر ارسال شوندارسال کاربر به درگاهبرای فرستادن کاربر، یک فرم در سمت کاربر بسازید و...صفت action فرم را مساوی با لینک قرار دهید.صفت method آن را مساوی با متد قرار دهید.اطلاعات فرم را به عنوان المان های input به فرم اضافه کنید.در صورتی که صفحه‌های خود را از سمت سرور می فرستید‌، می توانید از متد getScript بر روی paymentInfo استفاده کنید تا مراحل بالا به صورت خودکار انجام شوند و کاربر به درگاه منتقل شود. به صورت زیر:res.send(&#xA;  `&lt;html&gt;&#xA;    &lt;body&gt;&#xA;        &lt;h1&gt; We&#39;re redirecting you to the payment gateway... &lt;/h1&gt;&#xA;        ${paymentInfo.getScript()}&#xA;    &lt;/body&gt;&#xA;  &lt;/html&gt;`&#xA;);تایید صحت پرداختدر این مرحله،‌ از متد verifyPayment در آدرس برگشت که قبلا برای درگاه فرستادیم (callbackUrl) استفاده می‌کنیم که دو ورودی قبول می‌کند:یک آبجکت که amount و referenceId را در بر دارد.‌ (قبلا در دیتابیس ذخیره کردیم)پارامتر های دریافت شده در صفحه بازگشت کاربرتوجه کنید که در لینک بازگشت، باید از GET و POST پشتیبانی کنید، چون برخی از درگاه ها از GET و برخی از POST استفاده می‌کنند. اگر از express استفاده می‌کنید،‌ از res.all() استفاده کنید و query و body را به پارامتر دوم بدهید.res.all(&#39;/my-callback-url&#39;, (request, response) =&gt; {&#xA;    const receipt = await driver.verifyPayment(&#xA;      {&#xA;        amount: 50000, // Comes from database&#xA;        referenceId: 1234, // Comes from database&#xA;      },&#xA;      { ...request.query, ...request.body }&#xA;    );&#xA;}این متد یک رسید (receipt) باز می گرداند که شامل کد رهگیری (transactionId) و کارت استفاده شده به صورت هش شده (panCard) و اطلاعات دیگر مربوط به پرداخت است. در صورت تایید پرداخت شما می‌توانید سرویس/محصول خود را به همراه کد رهگیری به کاربر ارائه دهید.توجه کنید که در مراحل مختلف پرداخت، ممکنه خطا های مختلفی انداخته بشوند. می‌تونید در این صفحه تمام خطا‌ها و استثنا‌ها را مشاهده کنید.مستندات فارسی بسته رو می‌توانید این لینک مشاهده کنید.اگر با مستندات انگلیسی راحت هستید از این لینک استفاده کنید.اگر مشکلی مشاهده کردید،‌ می‌توانید در گیت‌های یک Issue بسازید تا با هم مشکل رو حل کنیم.و اینکه سرویس شدم تا این پست رو بنویسم. چند بار پستم بعد از انتشار یهو خالی شد و مجبور شدم از اول بنویسم. نمیدونم چه مشکلی هست که ویرگول داره.? اگر از بسته استفاده کردید و ازش خوشتون اومد، در صفحه گیت‌هاب بهش ستاره بدید.❤️ اگر این مطلب براتون مفید بود، پست رو لایک کنید.</description><category>علی‌رضا زمانی</category><author>علی‌رضا زمانی</author><pubDate>Fri, 15 Oct 2021 14:18:30 +0330</pubDate></item></channel></rss>