آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش اتصال به درگاه بانکی از طریق ASP.Net MVC

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

آموزش اتصال به درگاه بانکی از طریق ASP.Net MVC

در این مقاله سعی داریم اتصال به درگاه پرداخت اینترنتی بانک ملت را توسط Asp.Net MVC به شما آموزش دهیم

بعد از ثبت نام شما در وب سایت بانک ملت، مقاله ای از طرف بانک برای شما ارسال میشود که پیشنهاد میکنیم حتما آن را مطالعه بفرمایید.

در اولین مرحله به سراغ جدول درگاه پرداخت رفته و به طراحی آن می‎پردازیم

یک جدول با نام Payment طراحی و فیلد های زیر را به جدول اضافه می کنیم.

آموزش ASP.Net MVC
  • PaymentId :شماره رکورد پرداخت است که توسط خود دیتابیس مقدار دهی می شود.
  • ReferenceNumber: شماره پیگیری فاکتور موجود.
  • SaleReferenceId : شماره پرداخت فاکتور موجود.
  • StatusPayment: وضعیت پرداخت.
  • PaymentFinished: وضعیت نهایی پرداخت.
  • Amount: مبلغ پرداخت شده.
  • BankName: نام بانک سرویس دهنده.
  • UserID: کد کاربر خریدار.
  • BuyDatetime: تاریخ خرید.

بعد از طراحی جدول در دیتابیس، وارد Visual Studio میشویم و یک پروژه از نوع Asp.Net Mvc ایجاد می کنیم.

بعد از ایجاد پروژه، به قسمت Refrence ها رفته و بر روی Refrence کلیک راست کرده و گزینه Add Service Refrence را انتخاب می کنیم

آموزش ASP.Net MVC

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


آموزش ASP.Net MVC

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

آموزش ASP.Net MVC

وارد پنجره زیر که شدیم از URL زیر یک کپی تهیه می کنیم و در قسمت URL جایگذاری کرده و گزینه روبرو را کلیک کرده تا وب سرویس آماده شود

https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl

آموزش ASP.Net MVC

بعد از 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 ساده به ما میدهد که بصورت زیر است

آموزش ASP.Net MVC

یک فرم ساده طراحی کرده ایم که مبلغ و نام بانک پذیرنده را از ما دریافت می کند و به اطلاعات را به اکشن مورد نظر ارسال می کند.چون معمولا مبالغ توسط سامانه و بر اساس قسمت کالا و یا ... اتخاب می شود؛ شما می توانید مبلغ را توسط 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 نتیجه صفحه متفاوت خواهد بود .

آموزش ASP.Net MVC
توجه :

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

  • 7650
  •    4674
  • تاریخ ارسال :   1396/09/02

دانلود PDF دانلود سورس کد دانلود فیلم آموزشی دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
آموزش اتصال به درگاه بانکی از طریق ASP.Net MVC
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

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