Sina-Soltani / Parbad

A free, open-source, integrated and extensible library which connects your web applications to online payment gateways. Gateways can be added or developed by you.
GNU Lesser General Public License v3.0
364 stars 81 forks source link

خطا در ارسال اطلاعات در بانک پاسارگاد #293

Closed Zvr417 closed 2 years ago

Zvr417 commented 2 years ago

وقت بخیر. در استفاده از پرباد و بانک پاسارگاد، برای رفتن به درگاه ارور "خطا در ارسال اطلاعات" دریافت میکنیم. با توجه به اینکه مقدار parivateKey براساس فایل txt از بانک دریافت کردیم، موقع تعریف بانک پاسارگاد چ جوری باید مقدار دهی شود؟ طبق مستندات خود بانک پاسارگاد باید امضای دیجیتال براساس اون فایل ایجاد شود. حال طبق مستندات یک سری مقادیر برای تولید این امضا نیاز می باشد، مثل موبایل خریدار یا تاریخ و ساعت تراکنش قبل از رفتن به درگاه. نمونه مستندات:

var sendingData = "{ \"InvoiceNumber\": \"123456\", \"InvoiceDate\": \"1349/04/04\",\"TerminalCode\": \"1\", \"MerchantCode\": \"1\", \"Amount\":\"1000\", \"RedirectAddress\":\" https://www.sample.com/PaymentResult\", \"Timestamp\":\"2018/09/18 15:15:13\", \"Action\":\"1003\", \"Mobile\":\"09122222222\", \"Email\":\"BuyerName@Sample.ir\" }"

در صورتی که parivateKey توی startup ست میشود. و اونجا همچین اطلاعاتی دسترسی نداریم برای تولید امضا. آیا روشی دیگری برای تولید امضا وجود داره؟ یا قبل از درگاه و موقع فراخوانی بانک پاسارگاد امکان تعریف مجدد این مقدار هست؟ ممنون میشم راهنمایی بفرمایید

Sina-Soltani commented 2 years ago

درود هدف از پکیج Parbad بی نیاز بودن به مسائل داخلی درگاه‌های بانکی هست. امضا دیجیتال و یا هر عمل دیگه‌ای به صورت خودکار توسط Parbad انجام میشه. شما فقط باید موارد لازم رو در قسمت تنظیمات درگاه بدید. PrivateKey رو باید از درگاه پاسارگاد دریافت کنید اگر بهتون ندادن،‌باید ازشون تقاضا کنید موفق باشید

Zvr417 commented 2 years ago

ممنونم. بله به فرمت فایل txt با محتوی xml داده شده. الان محتوی این فایل به متغیر PrivateKey بدیم یا تبدیلش کنیم؟ محتوی xml که بدیم ارور خطا در ارسال اطلاعات دریافت میکنیم. متغیر های دیگه یعنی terminalCode , merchantCode هم که مقادیر ش مشخصه و طبیعتا مشکل از این دو متغیر نیست. ممنون میشم بگید چ جوری باید این PrivateKey مقدار بدیم؟

Sina-Soltani commented 2 years ago

بله PrivateKey یک متن با محتوای XML هست بررسی کنید ببینید آیا محتوای PrivateKey استاندارد و صحیح هست یا خیر کد زیر (که در پَرباد به صورت خودکار انجام میشه) رو داخل یک برنامه کنسول کپی کنید برای تست کردن و مقادیر رو بهش بدید. برای مقدار data هر چیزی که می‌خواهید وارد کنید و ببینید آیا الگوریتم به درستی کار میکنه یا خیر اگر به شما خطایی در مورد محتوای XML میده، پس بنابراین PrivateKey شما صحیح نیست و باید با پشتیبانی بانک پارسیان صحبت کنید

using System;
using System.Security.Cryptography;
using System.Text;

public static class PasargadCrypto
    {
        public static string Encrypt(string privateKey, string data)
        {
            using (var rsa = new RSACryptoServiceProvider())
            {
                byte[] encryptedData;
#if NETSTANDARD2_0
                rsa.FromXml(privateKey);
                encryptedData = rsa.SignData(Encoding.UTF8.GetBytes(data), HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
#else
                rsa.FromXmlString(privateKey);
                encryptedData = rsa.SignData(Encoding.UTF8.GetBytes(data), new SHA1CryptoServiceProvider());
#endif
                return Convert.ToBase64String(encryptedData);
            }
        }
    }
Zvr417 commented 2 years ago

ممنون از راهنمایی تون. فایل xml درست بود. پس علت خطای "خطا در ارسال اطلاعات" قبل از درگاه واسه چیه؟ طبق پرباد، 3 متغیر باید مقدار دهی شوند و خلاص. موقع ارسال به درگاه لینک ایجاد برای رفتن به درگاه به صورت زیر هست: https://pep.shaparak.ir/gateway.aspx?merchantCode=5108880&terminalCode=2366429&invoiceNumber=637857118319095174&invoiceDate=2022/04/16%2013:17:11&amount=5000&redirectAddress=https://www.haamin.ir/PaymentCallback?Pay=true&PayPrice=5000&Tick=637857118319095174&BankID=3&UserID=1&paymentToken=2ba29a6cdb4f41c5bfce37d9875dd4ba&action=1003&timeStamp=2022/04/16%2013:17:11&sign=avVb0rnGbFubnvWC5NV/xoucYN8K7eM3YGYpmMZTRoj+xn2YkK6pdJBMx1STyrAU1Q6Jjzu3FzUy62yqWtQWH+vSt2foVKu2xaNM0pIZh8MnkpMXE4t5L3x4Fa7aMWevnfgnE7lTRxWFPyEeOyhIuRdtgUCGtkGn/HLQrwP2C1c=

Sina-Soltani commented 2 years ago

در صورت تمایل میتونید مقادیر و تنظیمات مرتبط با این درگاه رو به آدرس ایمیل زیر ارسال کنید تا بررسی کنم.

parbad@outlook.com

Zvr417 commented 2 years ago

درود ، ایمیل شد. ممنونم

Sina-Soltani commented 2 years ago

ایمیلی دریافت نشده. لطفا چک کنید ببینید درست ارسال کردید یا خیر

Sina-Soltani commented 2 years ago

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

Sina-Soltani commented 2 years ago

فایلی که در ایمیل پیوست کردید به دلایلی قابل دانلود نیست. لطفا فایل رو به صورت zip یا rar ارسال کنید

Zvr417 commented 2 years ago

خدمت شما. ممنون

On Sun, Apr 17, 2022 at 3:11 PM Sina Soltani @.***> wrote:

فایلی که در ایمیل پیوست کردید به دلایلی قابل دانلود نیست. لطفا فایل رو به صورت zip یا rar ارسال کنید

— Reply to this email directly, view it on GitHub https://github.com/Sina-Soltani/Parbad/issues/293#issuecomment-1100850510, or unsubscribe https://github.com/notifications/unsubscribe-auth/AYYDXY27TFISNBD35LDJA53VFPTG3ANCNFSM5TSF632Q . You are receiving this because you authored the thread.Message ID: @.***>

Sina-Soltani commented 2 years ago

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

Sina-Soltani commented 2 years ago

درگاه پاسارگاد اجازه ادامه عملیات رو به من نمیده چون درخواست‌ها رو فقط از IP فروشنده دریافت میکنه. اما در هر صورت ارتباط تا داخل درگاه به درستی پیش میره و پیغام زیر نمایش داده میشه image

شما پیغام "خطا در ارسال اطلاعات" رو دقیقا در کجا و چه مرحله ای دریافت کردید؟ در صورت امکان همینجا Screenshot ارسال کنید

Zvr417 commented 2 years ago

ممنونم. تا مرحله ورود به درگاه، که این ارور دریافت میکنم. متغیرهای مربوطه مقدار دهی میکنم، و طبق url برگردانده شده توسط پرباد، به درگاه باید منتقل شود که ارور زیر میاد.

image

Sina-Soltani commented 2 years ago

ممنون از راهنمایی تون. فایل xml درست بود. پس علت خطای "خطا در ارسال اطلاعات" قبل از درگاه واسه چیه؟ طبق پرباد، 3 متغیر باید مقدار دهی شوند و خلاص. موقع ارسال به درگاه لینک ایجاد برای رفتن به درگاه به صورت زیر هست: https://pep.shaparak.ir/gateway.aspx?merchantCode=5108880&terminalCode=2366429&invoiceNumber=637857118319095174&invoiceDate=2022/04/16%2013:17:11&amount=5000&redirectAddress=https://www.haamin.ir/PaymentCallback?Pay=true&PayPrice=5000&Tick=637857118319095174&BankID=3&UserID=1&paymentToken=2ba29a6cdb4f41c5bfce37d9875dd4ba&action=1003&timeStamp=2022/04/16%2013:17:11&sign=avVb0rnGbFubnvWC5NV/xoucYN8K7eM3YGYpmMZTRoj+xn2YkK6pdJBMx1STyrAU1Q6Jjzu3FzUy62yqWtQWH+vSt2foVKu2xaNM0pIZh8MnkpMXE4t5L3x4Fa7aMWevnfgnE7lTRxWFPyEeOyhIuRdtgUCGtkGn/HLQrwP2C1c=

در مورد این لینکی که ارسال کردید: چنین لینکی اصلا از سمت پَرباد تولید نمیشه. چطور ممکنه شما چنین لینکی دریافت کرده باشید؟ چون لینکی که پّرباد برای شما تولید میکنه فقط شامل آدرس درگاه هست و مابقی اطلاعاتی که الان من در این لینکی که شما فرستادید میبینم، اصلا وجود نداره، بلکه همه اینها به صورت پارامترهایی داخل یک فرم ارسال میشن.

لطفا در صورت امکان یک screenshot در حالت دیباگ کردن بگیرید از نتیجه ی متد Request تا بررسی کنم چه محتوایی برای شما ایجاد شده و این لینک به چه صورت برای شما تولید شده. تصویر رو از نتیجه دستور Request بگیرید. برای مثال در دستور زیر، نتیجه داخل متغیر result هست.

var result = await Request(.......)

پارامتری که در متغیر result باید کاملا باز کنید و ازش عکس بگیرید، نامش GatewayTransporter هست. در صورتی قادر به ارسال اسکرین شات نیستید، راه حل بهتر و ساده تر اینه که با کمک newtonsoft json این متغیر result رو به جیسون تبدیل کنید و برای من ارسال کنید تا محتوا رو بررسی کنم

var json = JsonConvert.Serialize(result);
Zvr417 commented 2 years ago

سلام مجدد، بله حق با شما بود، ادرس به صورت https://pep.shaparak.ir/gateway.aspx این بود، ی ایراد از طرف کد من بود. و پارامتر ها داخل فرم بودن. منتهی باز هم ارور "خطا در ارسال اطلاعات " میده.

image

image

Sina-Soltani commented 2 years ago

درود کد مربوط به هدایت کاربر به درگاه رو لطفا اینجا بزارید.

Zvr417 commented 2 years ago

ست کردن در startup: gateways.AddPasargad().WithAccounts(accounts => { accounts.AddInMemory(account => { account.TerminalCode = bank.TerminalCode;//2366429 account.PrivateKey = bank.ExtractedKeywords; account.MerchantCode = bank.TerminalUsername; account.Name = bank.Name; }); });

هدایت کاربر: string tick = DateTime.Now.Ticks.ToString(); var resultOnlinePaymentPasargad = _onlinePayment.RequestAsync(invoice => { invoice .SetAmount((long)payPrice) .SetCallbackUrl(callbackPage) .UsePasargad() .SetTrackingNumber(Convert.ToInt64(tick)); }); if (resultOnlinePaymentPasargad.Result.IsSucceed) { string urlRedirect = resultOnlinePaymentPasargad.Result.GatewayTransporter.Descriptor.Url; return new JsonResult(@"{""Result"":""{Result}"",""RefID"":""{RefID}"",""Message"":""{Message}"",""UrlRedirect"":""{UrlRedirect}""}" .Replace("{Result}", "true") .Replace("{RefID}", "1") .Replace("{UrlRedirect}", urlRedirect) .Replace("{Message}", "در حال هدایت به بانک")); }

Sina-Soltani commented 2 years ago

شما ظاهرا هدایت کاربر به درگاه رو دارید خودتون به صورت دستی انجام میدید نه با پَرباد. از کدها میشه متوجه شد که احتمالا قصد دارید که در سمت کلاینت این هدایت انجام بشه و نه در سمت سرور. سوال اینجاست که شما با توجه به اینکه از ۹ تا پارامتری که پَرباد به صورت فرم برای شما ایجاد کرده و بهتون داده،‌ ظاهرا هیچکدوم رو اصلا استفاده نکردید که برای مثال به سمت کلاینت بفرستید. کد سمت کلاینت که برای هدایت کاربر به درگاه دارید رو لطفا قرار بدید تا بررسی کنیم.

Sina-Soltani commented 2 years ago

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

Zvr417 commented 2 years ago

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

On Wed, Apr 20, 2022, 11:39 AM Sina Soltani @.***> wrote:

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

— Reply to this email directly, view it on GitHub https://github.com/Sina-Soltani/Parbad/issues/293#issuecomment-1103546307, or unsubscribe https://github.com/notifications/unsubscribe-auth/AYYDXY27252MV3QT2NHF6LDVF6USZANCNFSM5TSF632Q . You are receiving this because you authored the thread.Message ID: @.***>

msngithub commented 2 years ago

عرض سلام و ادب خدمت شما جناب سلطانی ما از طریق متد RequestAsync که خروجی رو دریافت میکنیم مقدار GatewayTransporter.Descriptor.Url را از خروجی میخونیم و به سمت client میفرستیم و با window.location کاربر رو به سمت اون url هدایت میکنیم ، این شیوه برای درگاه ملی و درگاه پارسیان جواب میداد و مشکلی نبود ، با این روش نمیتوان با بانک پاسارگاد کار کرد ؟ حتما باید سمت سرور redirect انجام شود ؟

Sina-Soltani commented 2 years ago

درود

با توجه به توضیحات شما،‌ پس در واقع در کد شما هدایت کاربر با متد POST نادیده گرفته شده و البته من این رو از کدهایی که اینجا قرار داده شد متوجه شدم که اشتباه شما از کجا بوده. همونطور که توضیح دادم،‌ شما ظاهرا هدایت کاربر رو فقط از طریق متد GET یا همون به اصطلاح ریدایرکت دارید انجام میدید. در صورتیکه تعدادی از درگاه ها با متد POST کار میکنن که بیانگر این هست که شما یک فرم باید ارسال کنید. لطفا مثال مربوط به برنامه Angular رو بررسی کنید. مثال کاملا واضح هست و نحوه هدایت کاربر از سمت کلاینت رو پوشش میده.

کد سمت سرور کد سمت کلاینت

Zvr417 commented 2 years ago

سلام. وقت بخیر. ارسال به درگاه درست شد، برگشت هم به صورت Get دریافت میشه، یا 3 تا queryString در url برگشتی. iN,iD,tref که طبق مستندات باید با tref ، verify شود. اما خطا دارد. ایا برگشت از بانک به صورت Get درست است؟ ممنون میشم برگشت از بانک توضیحی بدین

Sina-Soltani commented 2 years ago

درود آیا نمونه مثال‌ها واضح نیستن؟

Zvr417 commented 2 years ago

سلام مجدد، سپاس از شما. مشکل حل شد

Sina-Soltani commented 2 years ago

درود خواهش میکنم موفق باشید