
یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتر
یادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
آموزش اتصال به درگاه بانکی از طریق ASP.Net MVC
آموزش اتصال به درگاه بانکی از طریق ASP.Net MVC
در این مقاله سعی داریم اتصال به درگاه پرداخت اینترنتی بانک ملت را توسط Asp.Net MVC به شما آموزش دهیم
بعد از ثبت نام شما در وب سایت بانک ملت، مقاله ای از طرف بانک برای شما ارسال میشود که پیشنهاد میکنیم حتما آن را مطالعه بفرمایید.
در اولین مرحله به سراغ جدول درگاه پرداخت رفته و به طراحی آن میپردازیم
یک جدول با نام Payment طراحی و فیلد های زیر را به جدول اضافه می کنیم.

- PaymentId :شماره رکورد پرداخت است که توسط خود دیتابیس مقدار دهی می شود.
- ReferenceNumber: شماره پیگیری فاکتور موجود.
- SaleReferenceId : شماره پرداخت فاکتور موجود.
- StatusPayment: وضعیت پرداخت.
- PaymentFinished: وضعیت نهایی پرداخت.
- Amount: مبلغ پرداخت شده.
- BankName: نام بانک سرویس دهنده.
- UserID: کد کاربر خریدار.
- BuyDatetime: تاریخ خرید.
بعد از طراحی جدول در دیتابیس، وارد Visual Studio میشویم و یک پروژه از نوع Asp.Net Mvc ایجاد می کنیم.
بعد از ایجاد پروژه، به قسمت Refrence ها رفته و بر روی Refrence کلیک راست کرده و گزینه Add Service Refrence را انتخاب می کنیم

وارد پنجره زیر می شویم و گزینه Advance را کلیک می کنیم

در پنجره زیر AddWeb Service را کلیک می کنیم.

وارد پنجره زیر که شدیم از URL زیر یک کپی تهیه می کنیم و در قسمت URL جایگذاری کرده و گزینه روبرو را کلیک کرده تا وب سرویس آماده شود
https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl

بعد از Load شدن سرویس ، میتوانید نام سرویس را تغییر داده و بر روی Add Reference کلیک کنید.
بعد از اضافه کردن Reference ، یک پوشه به نام Web References به پروژه اضافه می گردد.
در مرحله بعد بانک موجود را به روش Data base First به پروژه اضافه می کنیم.
حال به سراغ Controller ها رفته و یک کنترلر با نام دلخواه به پروژه اضافه می کنیم.
در کنترلر جاری، یک Action با نام Index اضافه می کنیم و در View آن کد های زیر را جایگذاری می کنیم
@{ Layout = null; } < !DOCTYPE html > < html > < head > < meta name="viewport" content="width=device-width" / > < link href="~/Content/bootstrap.css" rel="stylesheet" / > < link href="~/Content/Site.css" rel="stylesheet" / > < title >فرم پرداخت< /title > < /head > < body dir="rtl" > @using (Html.BeginForm()) { @Html.AntiForgeryToken() < div class="container" > < div class="row" > < section class="col-lg-4" >< /section > < div class="col-lg-4 border" > < h1 class="text-center" >آموزشگاه تحلیل داده< /h1 > < table class="table table-responsive " > < tr > < td >مبلغ< /td > < td > @Html.TextBox("Price", null, new {@class = "form-control"}) < /td > < /tr > < tr > < td colspan="2" > < span >انتخاب درگاه بانک : < /span > < /td > < /tr > < tr > < td > @Html.RadioButton("Dargah", "بانک ملت", true, new {@class = "radio"}) < section >بانک ملت< /section > < /td > < td > < input type="submit" value="پرداخت" class="btn btn-success btn-block" / > < /td > < /tr > < tr > < td colspan="2" > @ViewBag.Message < /td > < /tr > < /table > < /div > < section class="col-lg-4" >< /section > < /div > < /div > } < /body > < /html >
نتیجه کد های فوق ، یک صفحه Html ساده به ما میدهد که بصورت زیر است

یک فرم ساده طراحی کرده ایم که مبلغ و نام بانک پذیرنده را از ما دریافت می کند و به اطلاعات را به اکشن مورد نظر ارسال می کند.چون معمولا مبالغ توسط سامانه و بر اساس قسمت کالا و یا ... اتخاب می شود؛ شما می توانید مبلغ را توسط Session به اکشن مذکور ارسال کنید.
بعد از وارد کردن مبلغ، فرم به اکشن همنام پست می شود و در آن اکشن کد های زیر را می نویسیم
[HttpPost] public ActionResult Index(long Price, string Dargah) { string RedirectPage = Url.Action("Success", "Home"); try { Peyment p = new Peyment { Amount = Price, StatusPayment = "-100", BankName = Dargah, SaleReferenceId = 0, BuyDatetime = System.DateTime.Now, UserID = 1, PaymentFinished = false, }; db.Peyments.Add(p); db.SaveChanges(); int paymentid = p.PaymentId; if (paymentid > 0) { switch (Dargah) { case "بانک ملت": BypassCertificateError(); string TerminalID = "1111"; string UserName = "2121"; string Password = "0000"; var payment = new ir.shaparak.bpm.PaymentGatewayImplService(); string result = payment.bpPayRequest( Int64.Parse(TerminalID), UserName, Password, paymentid, Price, GetDate(), GetTime(), "خرید از سایت تحلیل داده", RedirectPage, Int64.Parse("0") ); if (result != null) { // 45zm24554654,0 string[] ResultArray = result.Split(','); if (ResultArray[0].ToString() == "0") { UpdatePayment(paymentid, "-100", 0, ResultArray[1], false); NameValueCollection collection = new NameValueCollection(); collection.Add("RefId", ResultArray[1]); Response.Write(Helper.PreparePOSTForm("https://bpm.shaparak.ir/pgwchannel/startpay.mellat", collection)); } else { UpdatePayment(paymentid, ResultArray[0].ToString(), 0, null, false); ViewBag.Message = PaymentResult.MellatResult(ResultArray[0]); } } else { ViewBag.Message = "امکان اتصال به درگاه بانک وجود ندارد"; } break; default: ViewBag.Message = "هیچ درگاهی انتخاب نشده"; break; } } } catch (Exception e) { Console.WriteLine(e); throw; } return View(); }
در کد های فوق توابعی وجود دارد که آن توابع بصورت تفکیکی در ذیل آمده است
این تابع برای رفع خطاهای بانکی و توسط خود بانک ساخته شده که ما در پروژه از آن استفاده می کنیم
void BypassCertificateError() { ServicePointManager.ServerCertificateValidationCallback += delegate ( Object sender1, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; }
متد زیر برای update دیتابیس استفاده می شود
private void UpdatePayment(long PaymentID, string VResult, long SaleRefrenceID, string RefID, bool PeymentFinished = true) { var p = db.Peyments.Find(PaymentID); if (PaymentID != null) { p.StatusPayment = VResult; p.SaleReferenceId = SaleRefrenceID; p.PaymentFinished = PeymentFinished; if (RefID != null) { p.ReferenceNumber = RefID; } db.Entry(p).State = EntityState.Modified; db.SaveChanges(); } }
متد های زیر برای تبدیل کردن تاریخ و زمان بصورت رشته ای استفاده می شود
private string GetDate() { return DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString().PadLeft(2, '0') + DateTime.Now.Day.ToString().PadLeft(2, '0'); } private string GetTime() { return DateTime.Now.Hour.ToString().PadLeft(2, '0') + DateTime.Now.Minute.ToString().PadLeft(2, '0') + DateTime.Now.Second.ToString().PadLeft(2, '0'); }
تابع PaymentResult انواع کدهای خطای صادر شده از بانک را از ورودی گرفته و رشته خطای معادل آن را به کاربر نمایش می دهد که بصورت یک کلاس نوشته شده و تابع MellatResult درون آن نوشته می شود.
public class PaymentResult { public static string MellatResult(string ID) { string result = ""; switch (ID) { case "-100": result = "پرداخت لغو شده"; break; case "0": result = "تراكنش با موفقيت انجام شد"; break; case "11": result = "شماره كارت نامعتبر است "; break; case "12": result = "موجودي كافي نيست "; break; case "13": result = "رمز نادرست است "; break; case "14": result = "تعداد دفعات وارد كردن رمز بيش از حد مجاز است "; break; case "15": result = "كارت نامعتبر است "; break; case "16": result = "دفعات برداشت وجه بيش از حد مجاز است "; break; case "17": result = "كاربر از انجام تراكنش منصرف شده است "; break; case "18": result = "تاريخ انقضاي كارت گذشته است "; break; case "19": result = "مبلغ برداشت وجه بيش از حد مجاز است "; break; case "111": result = "صادر كننده كارت نامعتبر است "; break; case "112": result = "خطاي سوييچ صادر كننده كارت "; break; case "113": result = "پاسخي از صادر كننده كارت دريافت نشد "; break; case "114": result = "دارنده كارت مجاز به انجام اين تراكنش نيست"; break; case "21": result = "پذيرنده نامعتبر است "; break; case "23": result = "خطاي امنيتي رخ داده است "; break; case "24": result = "اطلاعات كاربري پذيرنده نامعتبر است "; break; case "25": result = "مبلغ نامعتبر است "; break; case "31": result = "پاسخ نامعتبر است "; break; case "32": result = "فرمت اطلاعات وارد شده صحيح نمي باشد "; break; case "33": result = "حساب نامعتبر است "; break; case "34": result = "خطاي سيستمي "; break; case "35": result = "تاريخ نامعتبر است "; break; case "41": result = "شماره درخواست تكراري است ، دوباره تلاش کنید"; break; case "42": result = "يافت نشد Sale تراكنش"; break; case "43": result = "داده شده است Verify قبلا درخواست"; break; case "44": result = "يافت نشد Verfiy درخواست"; break; case "45": result = "شده است Settle تراكنش"; break; case "46": result = "نشده است Settle تراكنش"; break; case "47": result = "يافت نشد Settle تراكنش"; break; case "48": result = "شده است Reverse تراكنش"; break; case "49": result = "يافت نشد Refund تراكنش"; break; case "412": result = "شناسه قبض نادرست است "; break; case "413": result = "شناسه پرداخت نادرست است "; break; case "414": result = "سازمان صادر كننده قبض نامعتبر است "; break; case "415": result = "زمان جلسه كاري به پايان رسيده است "; break; case "416": result = "خطا در ثبت اطلاعات "; break; case "417": result = "شناسه پرداخت كننده نامعتبر است "; break; case "418": result = "اشكال در تعريف اطلاعات مشتري "; break; case "419": result = "تعداد دفعات ورود اطلاعات از حد مجاز گذشته است "; break; case "421": result = "نامعتبر است IP"; break; case "51": result = "تراكنش تكراري است "; break; case "54": result = "تراكنش مرجع موجود نيست "; break; case "55": result = "تراكنش نامعتبر است "; break; case "61": result = "خطا در واريز "; break; default: result = string.Empty; break; } return result; } }
تابع فوق ، انواع خطاهای بانک ملت می باشد که هر کد نشانه یک خطا در انجام عملیات بانکی می باشد و به عنوان مثال اگر خروجی کد صفر باشد یعنی عملیات با موفقیت انجام شده است.
متد Helper یک فرم تولید کرده و به بانک پست می کند که یک url می گیرد و Data که در کد های بالا نوشته شده است .
public class Helper { public static String PreparePOSTForm(string url, NameValueCollection data) { string formID = "PostForm"; StringBuilder strForm = new StringBuilder(); strForm.Append("< form id=\"" + formID + "\" name=\"" + formID + "\" action=\"" + url + "\" method=\"POST\" >"); foreach (string key in data) { strForm.Append("< input type=\"hidden\" name=\"" + key + "\" value=\"" + data[key] + "\" >"); } strForm.Append("< /form >"); StringBuilder strScript = new StringBuilder(); strScript.Append("< script language='javascript' > "); strScript.Append("var v" + formID + " = document." + formID + ";"); strScript.Append("v" + formID + ".submit();"); strScript.Append("< /script >"); return strForm.ToString() + strScript.ToString(); } }
اگر این نتیجه این متد موفقیت آمیز بود ، یعنی کاربر به بانک متصل شده است و در صورت تایید و یا عدم تایید، به اکشن Success رفته که کد های آن به صورت زیر است.
public ActionResult Success() { ViewBag.Bank = "ملت"; MellatReturn(); return View(); }
مهمترین متد این پروژه می باشد که بصورت زیر نوشته می شود.
متد MellatReturn():
private void MellatReturn() { BypassCertificateError(); if (string.IsNullOrEmpty(Request.Params["SaleReferenceId"])) { //ResCode=StatusPayment if (!string.IsNullOrEmpty(Request.Params["ResCode"])) { ViewBag.Message = PaymentResult.MellatResult(Request.Params["ResCode"]); ViewBag.SaleReferenceId = "**************"; } else { ViewBag.Message = "رسید قابل قبول نیست"; ViewBag.SaleReferenceId = "**************"; } } else { try { string TerminalId = "1224"; string UserName = "3569"; string UserPassword = "5465"; long SaleOrderId = 0; //PaymentID long SaleReferenceId = 0; string RefId = null; try { SaleOrderId = long.Parse(Request.Params["SaleOrderId"].TrimEnd()); SaleReferenceId = long.Parse(Request.Params["SaleReferenceId"].TrimEnd()); RefId = Request.Params["RefId"].TrimEnd(); } catch (Exception ex) { ViewBag.message = ex + "
" + " وضعیت:مشکلی در پرداخت بوجود آمده ، در صورتی که وجه پرداختی از حساب بانکی شما کسر شده است آن مبلغ به صورت خودکار برگشت داده خواهد شد "; ViewBag.SaleReferenceId = "**************"; return; } var bpService = new ir.shaparak.bpm.PaymentGatewayImplService(); string Result; Result = bpService.bpVerifyRequest(long.Parse(TerminalId), UserName, UserPassword, SaleOrderId, SaleOrderId, SaleReferenceId); if (!string.IsNullOrEmpty(Result)) { if (Result == "0") { string IQresult; IQresult = bpService.bpInquiryRequest(long.Parse(TerminalId), UserName, UserPassword, SaleOrderId, SaleOrderId, SaleReferenceId); if (IQresult == "0") { long paymentID = Convert.ToInt64(SaleOrderId); UpdatePayment(paymentID, Result, SaleReferenceId, RefId, true); ViewBag.Message = "پرداخت با موفقیت انجام شد."; ViewBag.SaleReferenceId = SaleReferenceId; // پرداخت نهایی string Sresult; // تایید پرداخت Sresult = bpService.bpSettleRequest(long.Parse(TerminalId), UserName, UserPassword, SaleOrderId, SaleOrderId, SaleReferenceId); if (Sresult != null) { if (Sresult == "0" || Sresult == "45") { //تراکنش تایید و ستل شده است } else { //تراکنش تایید شده ولی ستل نشده است } } } else { string Rvresult; //عملیات برگشت دادن مبلغ Rvresult = bpService.bpReversalRequest(long.Parse(TerminalId), UserName, UserPassword, SaleOrderId, SaleOrderId, SaleReferenceId); ViewBag.Message = "تراکنش بازگشت داده شد"; ViewBag.SaleReferenceId = "**************"; long paymentId = Convert.ToInt64(SaleOrderId); UpdatePayment(paymentId, IQresult, SaleReferenceId, RefId, false); } } else { ViewBag.Message = PaymentResult.MellatResult(Result); ViewBag.SaleReferenceId = "**************"; long paymentId = Convert.ToInt64(SaleOrderId); UpdatePayment(paymentId, Result, SaleReferenceId, RefId, false); } } else { ViewBag.Message = "شماره رسید قابل قبول نیست"; ViewBag.SaleReferenceId = "**************"; } } catch (Exception ex) { string errors = ex.Message; ViewBag.Message = "مشکلی در پرداخت به وجود آمده است ، در صورتیکه وجه پرداختی از حساب بانکی شما کسر شده است آن مبلغ به صورت خودکار برگشت داده خواهد شد"; ViewBag.SaleReferenceId = "**************"; } } }
در صورت تایید و یا عدم تایید به View اکشن Success رفته که کد های آن بصورت زیر است
@{ Layout = null; } < !DOCTYPE html > < html > < head > < meta name="viewport" content="width=device-width" / > < link href="~/Content/bootstrap.css" rel="stylesheet" / > < link href="~/Content/Site.css" rel="stylesheet" / > < title >Success< /title > < /head > < body dir="rtl" > < div class="container" > < div class="row" > < div class="col-lg-4" >< /div > < div class="col-lg-4" > < table class="table table-hover table-responsive" > < tr > < td class="alert-success" >درگاه پرداخت< /td > < td >@ViewBag.Bank< /td > < /tr > < tr > < td class="alert-success" > وضعیت پرداخت< /td > < td >@ViewBag.Message< /td > < /tr > < tr > < td class="alert-success" >کد رهگیری< /td > < td >@ViewBag.SaleReferenceId< /td > < /tr > < /table > < /div > < div class="col-lg-4" >< /div > < /div > < /div > < /body > < /html >
کد های Html فوق ، یک صفحه تولید میکند که با توجه به نتیجه متد MellatReturn نتیجه صفحه متفاوت خواهد بود .

برای یادگیری بهتر پیشنهاد می کنیم حتما فیلم آموزشی موجود در پیوست مقاله را مشاهده بفرمایید
پروژه ، دیتابیس و فیلم آموزشی مقاله فوق ، در پیوست موجود می باشد
سلام خیلی ممنونم من از این آموزشتون استفاده کردم و درگاه بهپرداخت رو توی سایتمون که MVC بود راه اندازی کردم. جا داره خیلی تشکر کنم چون سمپل هایی که داشتیم همه وب فرم بودن. عالی بودید