برنامه نویسی درگاه بانک

 بسم الله الرحمن الرحیم

بخش چهارم

برنامه نویسی درگاه پرداخت آنلاین

بخش اول (اتصال سایت به درگاه بانک)

بخش دوم (برنامه نویسی درگاه پرداخت آنلاین)

بخش سوم (آموزش راه اندازی درگاه بانک ملتx)

بخش چهارم (برنامه نویسی درگاه بانک)

 

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

اطلاعاتی که درگاه پرداخت به شما بر می گرداند به صورت POST خواهد بود و این اطلاعات به صفحه ی callBackUrl که در متد bpPayRequest معرفی کرده اید، ارسال خواهد شد.

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

ردﻳﻒ    

ﻧﺎم ﭘﺎراﻣﺘﺮ

ﻣﺜﺎل

توضیح

ﻧﻮع 

1

RefId

AF82041a2Bf6989c7fF9

ﻛﺪ ﻣﺮﺟﻊ درﺧﻮاﺳﺖ ﭘﺮداﺧﺖ ﻛﻪ ﻫﻤﺮاه ﺑﺎ درﺧﻮاﺳﺖ bpPayRequest ﺗﻮﻟﻴد ﺷﺪه اﺳﺖ و به پذیرنده اختصاص یافته است.

string

2

ResCode

0

وضیعت خرید

string

3

saleOrderId

10

ﺷﻤﺎره درﺧﻮاﺳﺖ ﭘﺮداﺧﺖ

long

4

SaleReferenceId

5142510

ﻛﺪ ﻣﺮﺟﻊ ﺗﺮاﻛﻨﺶ ﺧﺮﻳﺪ ﻛﻪ از ﺳﺎﻳﺖ ﺑﺎﻧﻚ ﺑﻪ ﭘﺬﻳﺮﻧﺪه داده ﻣﻲ ﺷﻮد

long

 

Action مربوط به callBackUrl را درون کنترلر Payment در بخش قبل ایجاد کردیم، در این بخش کدهای این Action را طراحی و پیاده سازی خواهیم کرد.

قبل از پیاده سازی این Action باید چهار متد دیگر مربوط به درگاه پرداخت بانک ملت را درون کلاس BankMellatImplement خود پیاده سازی کنیم.

متدهای درگاه پرداخت بانک ملت

ﻣﺘﺪ ﺗﺎﻳﻴد تراکنش ﺧﺮید bpVerifyRequest

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

برای استفاده از این متد می بایست پارامترهای زیر را به این متد ارائه دهید.

ردﻳﻒ    

ﻧﺎم ﭘﺎراﻣﺘﺮ

ﻣﺜﺎل

توضیح

ﻧﻮع 

1

terminalId

1234

ﺷﻤﺎره ﭘﺎﻳﺎﻧﻪ ﭘﺬﻳﺮﻧﺪه 

long

2

userName

*******

ﻧﺎم ﻛﺎرﺑﺮی ﭘﺬﻳﺮﻧﺪه

string

3

userPassword

******

ﻛﻠﻤﻪ ﻋﺒﻮر ﭘﺬﻳﺮﻧﺪه

string

4

orderId

10

ﺷﻤﺎره درﺧﻮاﺳﺖ  ( پرداخت)

long

5

saleOrderId

10 (همان orderId می باشد)

ﺷﻤﺎره درﺧﻮاﺳﺖ ﭘﺮداﺧﺖ

long

6

SaleReferenceId

5142510

ﻛﺪ ﻣﺮﺟﻊ ﺗﺮاﻛﻨﺶ ﺧﺮﻳﺪ

long

 

ابتدا باید این متد را درون کلاس BankMellatImplement پیاده سازی کنیم. این متد را مانند متد bpPayRequest پیاده سازی می کنیم که بسیار هم ساده می باشد.

 

public string VerifyRequest(long orderId, long saleOrderId, long saleReferenceId)
{
    try
     {
          MellatWebService.PaymentGatewayImplService WebService = new MellatWebService.PaymentGatewayImplService();
          return WebService.bpVerifyRequest(terminalId, userName, password, orderId, saleOrderId, saleReferenceId);

     }
     catch (Exception Error)
     {
          throw new Exception(Error.Message);
     }
}

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

متد درخواست واریز وجه  bpSettleRequest

ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻣﺘﺪ ﻋﻤﻠﻴﺎت وارﻳﺰ اﻧﺠﺎم ﺧﻮاﻫﺪ ﺷﺪ، در ﺣﻘﻴﻘﺖ اﻳﻦ ﻣﺘﺪ ﺟﻬﺖ وارﻳﺰ ﻧﻬﺎﻳﻲ ﻧﻤﻮدن ﻋﻤﻠﻴﺎت واریز اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.

ﺑﺎﻧﻚ ﺗﺮاﻛﻨﺸﻬﺎی ﺗﺎﻳﻴﺪ ﺷﺪه  ﺗﻮﺳﻂ اﻳﻦ ﻣﺘﺪ را ﻃﺒﻖ ﻗﺮارداد ﺑﻪ ﺣﺴﺎب شما وارﻳﺰ می کند. ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ "0" ﺑﻪ ﻣﻌﻨﺎی ﻣﻮﻓﻖ درﺧﻮاﺳﺖ وارﻳﺰ به حساب شما می ﺑﺎﺷﺪ.

برای استفاده از این متد می بایست پارامترهای زیر را به این متد ارائه دهید.

ردﻳﻒ    

ﻧﺎم ﭘﺎراﻣﺘﺮ

ﻣﺜﺎل

توضیح

ﻧﻮع 

1

terminalId

1234

ﺷﻤﺎره ﭘﺎﻳﺎﻧﻪ ﭘﺬﻳﺮﻧﺪه 

long

2

userName

*******

ﻧﺎم ﻛﺎرﺑﺮی ﭘﺬﻳﺮﻧﺪه

string

3

userPassword

******

ﻛﻠﻤﻪ ﻋﺒﻮر ﭘﺬﻳﺮﻧﺪه

string

4

orderId

10

ﺷﻤﺎره درﺧﻮاﺳﺖ  ( پرداخت)

long

5

saleOrderId

10 (همان orderId می باشد)

ﺷﻤﺎره درﺧﻮاﺳﺖ ﭘﺮداﺧﺖ

long

6

SaleReferenceId

5142510

ﻛﺪ ﻣﺮﺟﻊ ﺗﺮاﻛﻨﺶ ﺧﺮﻳﺪ

long

 

ﺗﻤﺎم ﺗﺮاﻛﻨﺸﻬﺎﻳﻲ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻣﺘﺪ درﺧﻮاﺳﺖ وارﻳﺰ وﺟﻪ ﻛﺮده ﺑﺎﺷﻨﺪ، ﺑﻪ ﺣﺴﺎب شما وارﻳﺰ ﻣﻲ ﺷﻮﻧﺪ . در ﺣﻘﻴﻘﺖ اﮔﺮ ﺗﺮاﻛﻨﺶ ﻣﻮﻓﻘﻲ settle ﻧﺸﻮد وجه مورد نظر وارﻳﺰ ﻧﺨﻮاﻫﺪ ﺷﺪ.  

این متد را به صورت زیر پیاده سازی می کنیم.

 

public string SettleRequest(long orderId, long saleOrderId, long saleReferenceId)
  {
   try
   {
     MellatWebService.PaymentGatewayImplService WebService = new MellatWebService.PaymentGatewayImplService();
     return WebService.bpSettleRequest(terminalId, userName, password, orderId, saleOrderId, saleReferenceId);
   }
    catch (Exception Error)
   {
      throw new Exception(Error.Message);
    }
}

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

متد درخواست استعلام وجه bpInquiryRequest

اﻳﻦ ﻣﺘﺪ زﻣﺎﻧﻲ کارﺑﺮد دارد ﻛﻪ ﺑﻪ ﻫﺮ دﻟﻴﻠﻲ از ﻧﺘﻴﺠﻪ ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ bpVerifyRequest ﻣﻄﻠﻊ ﻧﮕﺮدید. در اﻳﻦ ﺣﺎﻟﺖ ﺑﺮای آﮔﺎﻫﻲ از نتیجه ﺗﺮاﻛﻨﺶ می ﺗﻮاﻧید در هر زﻣﺎﻧﻲ، اﻳﻦ ﻣﺘﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﺎید. (اﺳﺘﻌﻼم ﺗﺮاﻛﻨﺶ)

ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ﻣﺘﺪ، وﺿﻌﻴﺖ ﺗﺮاﻛﻨﺶ ﭘﺮداﺧﺖ ﺑﺮای شما ارسال ﺧﻮاﻫﺪ ﺷﺪ.

برای استفاده از این متد می بایست پارامترهای زیر را به این متد ارائه دهید.

ردﻳﻒ    

ﻧﺎم ﭘﺎراﻣﺘﺮ

ﻣﺜﺎل

توضیح

ﻧﻮع 

1

terminalId

1234

ﺷﻤﺎره ﭘﺎﻳﺎﻧﻪ ﭘﺬﻳﺮﻧﺪه 

long

2

userName

*******

ﻧﺎم ﻛﺎرﺑﺮی ﭘﺬﻳﺮﻧﺪه

string

3

userPassword

******

ﻛﻠﻤﻪ ﻋﺒﻮر ﭘﺬﻳﺮﻧﺪه

string

4

orderId

10

ﺷﻤﺎره درﺧﻮاﺳﺖ  ( پرداخت)

long

5

saleOrderId

10 (همان orderId می باشد)

ﺷﻤﺎره درﺧﻮاﺳﺖ ﭘﺮداﺧﺖ

long

6

SaleReferenceId

5142510

ﻛﺪ ﻣﺮﺟﻊ ﺗﺮاﻛﻨﺶ ﺧﺮﻳﺪ

long

 

ﻣﻘﺪار ﺑﺎزگشتی این ﻣﺘﺪ ﻳک رﺷﺘﻪ است که حاوی ﻛﺪ ﭘﺎﺳﺦ می ﺑﺎﺷﺪ.

این متد نیز به صورت زیر است.

public string InquiryRequest(long orderId, long saleOrderId, long saleReferenceId)
{
    try
    {
        MellatWebService.PaymentGatewayImplService WebService = new MellatWebService.PaymentGatewayImplService();
        return WebService.bpInquiryRequest(terminalId, userName, password, orderId, saleOrderId, saleReferenceId);

     }
     catch (Exception Error)
     {
        throw new Exception(Error.Message);
     }
}

 هرگاه توسط bpVerifyRequest نتوانستید وضعیت یک تراکنش را بررسی کنید، می توانید از این متد کمک بگیرید.

 

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

 متد درخواست برگشت وجه bpReversalRequest

اﻳﻦ ﻣﺘﺪ زﻣﺎﻧﻲ ﻛﺎرﺑﺮد می یابد که شما به هر دلیلی از نتیجه متد تایید تراکنش bpVerifyRequest و نیز متد اﺳﺘﻌﻼم ﺗﺮاﻛﻨﺶ bpInquiryRequest مطلع نگردید. در این صورت شما به دلیل روشن نبودن وضعیت پرداخت، ترجیح می دهید کالا و یا سرویس خود را به مشتری تحویل ندهید و همچنین از بانک درخواست کنید تا اگر این کاربر مبلغی را به حساب شما واریز کرده است، آن را به حسابش بازگرداند.

حداکثر زمان Reverse برای یک تراکنش تا پایان روز جاری می باشد.

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

ردﻳﻒ    

ﻧﺎم ﭘﺎراﻣﺘﺮ

ﻣﺜﺎل

توضیح

ﻧﻮع 

1

terminalId

1234

ﺷﻤﺎره ﭘﺎﻳﺎﻧﻪ ﭘﺬﻳﺮﻧﺪه 

long

2

userName

*******

ﻧﺎم ﻛﺎرﺑﺮی ﭘﺬﻳﺮﻧﺪه

string

3

userPassword

******

ﻛﻠﻤﻪ ﻋﺒﻮر ﭘﺬﻳﺮﻧﺪه

string

4

orderId

10

ﺷﻤﺎره درﺧﻮاﺳﺖ  ( پرداخت)

long

5

saleOrderId

10 (همان orderId می باشد)

ﺷﻤﺎره درﺧﻮاﺳﺖ ﭘﺮداﺧﺖ

long

6

SaleReferenceId

5142510

ﻛﺪ ﻣﺮﺟﻊ ﺗﺮاﻛﻨﺶ ﺧﺮﻳﺪ

long

 ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ اﻳﻦ ﻣﺘﺪ یک رﺷﺘﻪ اﺳﺖ ﻛﻪ ﺣﺎوی ﻛﺪ ﭘﺎﺳﺦ می ﺑﺎﺷﺪ. در صورتی که این متد مقدار صفر برگرداند، بدین معنا خواهد بود که عملیات به درستی لغو شده است. در غیر این صورت باید خطای صورت گرفته را بررسی کنید.

پیاده سازی این متد به صورت زیر خواهد بود:

 

public string bpReversalRequest(long orderId, long saleOrderId, long saleReferenceId)
{
    try
    {
       MellatWebService.PaymentGatewayImplService WebService = new MellatWebService.PaymentGatewayImplService();
       return WebService.bpReversalRequest(terminalId, userName, password, orderId, saleOrderId, saleReferenceId);

     }
    catch (Exception error)
     {
       throw new Exception(error.Message); ;
     }
}

حال تمام متدهای اصلی درگاه پرداخت بانک را پیاده سازی کردیم، مجددا به درون PaymentController باز می گردیم و در Action مربوط به BankCallback کدهای خود را کامل می کنیم.

ابتدا یک متغییر boolean برای نگهداری وضعیت تراکنش ایجاد می کنیم و مقدار پیش فرض آن را false قرار می دهیم در صورتی که برنامه ما خطایی اتفاق رخ دهد مقدار این متغییر را برابر true قرار می دهیم تا در پایان با بررسی مقدار این متغییر اطلاع پیدا کنیم که آیا باید تراکنش را توسط متد bpReversalRequest لغو کنیم و یا خیر.

دو متغییر saleReferenceId و saleOrderId را نیز برای نگهداری شماره تراکنش ایجاد می کنیم، متغییر resultCode_bpPayRequest برای ذخیره وضعیت تراکنش مورد استفاده قرار خواهد گرفت.

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

[HttpPost]
public ActionResult BankCallback()
{
bool Run_bpReversalRequest = false;
long saleReferenceId = -999;
   long saleOrderId = -999;
   string resultCode_bpPayRequest;

   BankMellatImplement bankMellatImplement = new BankMellatImplement();

   try
   {
saleReferenceId = long.Parse(Request.Params["SaleReferenceId"].ToString());
saleOrderId = long.Parse(Request.Params["SaleOrderId"].ToString());
resultCode_bpPayRequest = Request.Params["ResCode"].ToString();


همانطور که مشاهده می کنید برای خواندن اطلاعات POST شده توسط درگاه پرداخت بانک ملت، از کد [""]Request.Params استفاده کرده ایم.

کدهای زیر را به ترتیب در بدنه try در انتهای کدهای قبلی اضافه می کنیم:

سه متغییر تعریف می کنیم تا بتوانیم نتیجه نتیجه هر یک از متدهای درگاه پرداخت بانک ملت را بررسی کنیم.

مقدار پیش فرض این سه متغییر را عددی در نظر گرفتیم که این اعداد در لیست خطاهای بانک ملت نیست.


//Result Code
string resultCode_bpinquiryRequest = "-9999";
string resultCode_bpSettleRequest = "-9999";
string resultCode_bpVerifyRequest = "-9999";

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


if (int.Parse(resultCode_bpPayRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
{
  //Success
}
else
{
    TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpPayRequest)).Replace("_", " ");
    Run_bpReversalRequest = true;
}

در قسمت  Success کدهای زیر را اضافه کنید.

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

اگر متد VerifyRequest نتوانست نتیجه ای را برای ما برگرداند پس باید از متد InquiryRequest استفاده کنیم.


resultCode_bpVerifyRequest = bankMellatImplement.VerifyRequest(saleOrderId, saleOrderId, saleReferenceId);
if (string.IsNullOrEmpty(resultCode_bpVerifyRequest))
{
   #region Inquiry Request
   
    resultCode_bpinquiryRequest = bankMellatImplement.InquiryRequest(saleOrderId, saleOrderId, saleReferenceId);
    if (int.Parse(resultCode_bpinquiryRequest) != (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
    {
       //the transactrion faild
       TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpinquiryRequest.Replace("_", " ")));
       Run_bpReversalRequest = true;
    }

   #endregion
}

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


if ((int.Parse(resultCode_bpVerifyRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
    ||
    (int.Parse(resultCode_bpinquiryRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ))
{
   //Success
}
else
{
   TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpVerifyRequest.Replace("_", " ")));
   Run_bpReversalRequest = true;
}

 

در نهایت در قسمت Success باید به بانک اطلاع بدهیم تا مبلغ واریز شده را به حساب ما انتقال دهد، برای اینکار باید از متد SettleRequest استفاده کنیم:


#region SettleRequest

 resultCode_bpSettleRequest = bankMellatImplement.SettleRequest(saleOrderId, saleOrderId, saleReferenceId);
 if ((int.Parse(resultCode_bpSettleRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
     || (int.Parse(resultCode_bpSettleRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_Settle_ﺷﺪه_اﺳﺖ))
 {
     TempData["Message"] = "تراکنش شما با موفقیت انجام شد ";
     TempData["Message"] += " لطفا شماره پیگیری را یادداشت نمایید" + saleReferenceId;
 }
 else
 {
     TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpSettleRequest.Replace("_", " ")));
     Run_bpReversalRequest = true;
 }

 // Save information to Database...

 #endregion

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

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

همانطور که در کدها بالا مشاهده کردید، در هر بخش اگر خطایی رخ دهد آن خطا را در TempData ذخیره می کنیم و همچنین مقدار متغییر Run_bpReversalRequest را برابر با true قرار می دهیم تا در نهایت در بخش finally کد خود کل عملیات را لغو کنیم.

در نهایت کل کد این Action به صورت زیر خواهد بود


      [HttpPost]
        public ActionResult BankCallback()
        {
            bool Run_bpReversalRequest = false;
            long saleReferenceId = -999;
            long saleOrderId = -999;
            string resultCode_bpPayRequest;

            BankMellatImplement bankMellatImplement = new BankMellatImplement();

            try
            {
                saleReferenceId = long.Parse(Request.Params["SaleReferenceId"].ToString());
                saleOrderId = long.Parse(Request.Params["SaleOrderId"].ToString());
                resultCode_bpPayRequest = Request.Params["ResCode"].ToString();

                //Result Code
                string resultCode_bpinquiryRequest = "-9999";
                string resultCode_bpSettleRequest = "-9999";
                string resultCode_bpVerifyRequest = "-9999";

                if (int.Parse(resultCode_bpPayRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
                {
                    #region Success

                    resultCode_bpVerifyRequest = bankMellatImplement.VerifyRequest(saleOrderId, saleOrderId, saleReferenceId);

                    if (string.IsNullOrEmpty(resultCode_bpVerifyRequest))
                    {
                        #region Inquiry Request

                        resultCode_bpinquiryRequest = bankMellatImplement.InquiryRequest(saleOrderId, saleOrderId, saleReferenceId);
                        if (int.Parse(resultCode_bpinquiryRequest) != (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
                        {
                            //the transactrion faild
                            TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpinquiryRequest.Replace("_", " ")));
                            Run_bpReversalRequest = true;
                        }

                        #endregion
                    }

                    if ((int.Parse(resultCode_bpVerifyRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
                        ||
                        (int.Parse(resultCode_bpinquiryRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ))
                    {

                        #region SettleRequest

                        resultCode_bpSettleRequest = bankMellatImplement.SettleRequest(saleOrderId, saleOrderId, saleReferenceId);
                        if ((int.Parse(resultCode_bpSettleRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_ﺑﺎ_ﻣﻮﻓﻘﻴﺖ_اﻧﺠﺎم_ﺷﺪ)
                            || (int.Parse(resultCode_bpSettleRequest) == (int)BankMellatImplement.MellatBankReturnCode.ﺗﺮاﻛﻨﺶ_Settle_ﺷﺪه_اﺳﺖ))
                        {
                            TempData["Message"] = "تراکنش شما با موفقیت انجام شد ";
                            TempData["Message"] += " لطفا شماره پیگیری را یادداشت نمایید" + saleReferenceId;
                        }
                        else
                        {
                            TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpSettleRequest.Replace("_", " ")));
                            Run_bpReversalRequest = true;
                        }

                        // Save information to Database...

                        #endregion
                    }
                    else
                    {
                        TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpVerifyRequest.Replace("_", " ")));
                        Run_bpReversalRequest = true;
                    }

                    #endregion
                }
                else
                {
                    TempData["Message"] = bankMellatImplement.DesribtionStatusCode(int.Parse(resultCode_bpPayRequest)).Replace("_", " ");
                    Run_bpReversalRequest = true;
                }

                return RedirectToAction("ShowError", "Payment");
            }
            catch (Exception Error)
            {
                TempData["Message"] = "متاسفانه خطایی رخ داده است، لطفا مجددا عملیات خود را انجام دهید در صورت تکرار این مشکل را به بخش پشتیبانی اطلاع دهید";
                // Save and send Error for admin user
                Run_bpReversalRequest = true;
                return RedirectToAction("ShowError", "Payment");
            }
            finally
            {
                if (Run_bpReversalRequest) //ReversalRequest
                {
                    if (saleOrderId != -999 && saleReferenceId != -999)
                        bankMellatImplement.bpReversalRequest(saleOrderId, saleOrderId, saleReferenceId);
                    // Save information to Database...
                }
            }

        }

شما می توانید کل کد این پروژه را از بخش زیر دانلود کنید

دانلود پروژه درگاه پرداخت بانک ملت با ASP.NET MVC

توضیحات: برنامه نویسی درگاه بانک ملت

 

نظرات (۱۱)

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

بله حتما، لینک پروژه را در اولین فرصت نیز اصلاح خواهیم کرد.

باتشکر
درود

و خسته نباشید

آقای شیدایی واقعا کارتون خیلی درسته

خیلی ممنون از مطالب و آموزش های مفیدتون , برای من با چند سال سابقه برنامه نویسی خیلی از مطالبتون مفید بود
پاسخ:
با عرض سلام

ما نیز بسیار خوشحال هستیم که توانسته ایم نظر دوستان عزیزی همچون شما را جذب کنیم.

موفق باشید
سلام و خسته نباشید 
من به یه مشکل خوردم سایت همش به خطای Ip  نامعتبر پیغام میده در صورتی که با یه سایت دیگم رو همون سرور داره کار می کنه 
؟
پاسخ:
با عرض سلام

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

باتشکر
  • مجید جمشیدی
  • اگر امکانش هست پرداخت الکترونیکی رو با php هم اموزش بدید ، سپاسگذارم
    پاسخ:
    با عرض سلام

    بله در حال تکمیل دوره های آموزشی PHP هستیم

    موفق باشید
    آقا سایتتون بسیار عالی هس خیلی خوشم اومد 

    درست شد تشکر  مشکل از خود مرکز بود IP رو NAT  کرده بود 

    فقط یه مسئله : کاربرای من وارد سایت میشن با نام کاربری و رمز عبورشون و من یه Session  ایجاد میکنم وقتی که می خوان پرداخت از طریق بانک رو انجام بدن موقع برگشت از بانک Session  از بین رفته ممنون میشم راهنمایی کنید ؟
    راستی من مدت زمان Session  رو 15 دقیقه گذاشتم
    لطفا کمک کنید 
    پاسخ:


    با عرض سلام

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

    web config پروزه را به صورت زیر تنظیم کنید


    <system.web>
      <sessionState mode="InProc" cookieless="false" timeout="20" />
      <authentication mode="Forms">
        <forms name=".SAMPLESITEAUTH" loginUrl="~/Login.aspx" protection="All" timeout="20" slidingExpiration="true" path="/" cookieless="UseCookies"></forms>
      </authentication>
    </system.web>

    همچنین می توانید برای هر دامنه ای که قرار است سایت شما به آن متصل شود به صورت زیر اطلاعات آن را ثبت کنید. اگر دو دامنه ی بانک و سایت خود را می خواهید ثبت کنید باید از کد زیر دوبار استفاده کنید.


    <forms
       name="name"
       loginUrl="URL"
       defaultUrl="URL"
       domain=".example.com">
    </forms>


    همچنین می توانید در web config خود مقدار Machine Key  را نیز تنظیم کنید.

    و آخرین روش اینکه می توانید اطلاعات session خود را به صورت cookie ذخیره کنید و آنها را در مواقع نیاز بخوانید.

    protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
        {
          /* only apply session cookie persistence to requests requiring session information*/
     
          #region session cookie /*check and set data*/
          if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState )
          {
            /* Ensure ASP.NET Session Cookies are accessible throughout the subdomains.*/
     
            if (Request.Cookies["ASP.NET_SessionId"] != null && Session != null && Session.SessionID != null)
            {
              Response.Cookies["ASP.NET_SessionId"].Value = Session.SessionID;
              Response.Cookies["ASP.NET_SessionId"].Domain = ".know24.net"; /* the full stop prefix denotes all sub domains*/
              Response.Cookies["ASP.NET_SessionId"].Path = "/"; /*default session cookie path root */
            }
          }
          #endregion    
        }




    موفق باشید
    با سلام و خسته نباشید 

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

    سپاس فراوان 
    فقط یک کلمه : تشکر
    پاسخ:
    باعرض سلام

    از لطف شما متشکریم

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

    پاسخ:
    با عرض سلام

    بانک تمامی اطلاعات را به صورت POST برای شما ارسال می کند و شما نیز می توانید اطلاعات ارسالی را مثلا در ViewBag و یا Tempdata و یا حتی به صورت پارامتر به View مورد نظر خود انتقال دهید و اطلاعات کامل را برای کاربران خود در آنجا نمایش دهید.

    موفق و پیروز باشید
    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی