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

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

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

بخش چهارم

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

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

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

بخش سوم (آموزش راه اندازی درگاه بانک ملت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 پیاده سازی می کنیم که بسیار هم ساده می باشد.

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

بخش چهارم

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

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

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

بخش سوم (آموزش راه اندازی درگاه بانک ملت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

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

 

نظرات

  • Hannah Martinez
    hamid
    دو شنبه 11 دی 1278 - 0:00

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

  • Hannah Martinez
    hamid
    دو شنبه 11 دی 1278 - 0:00

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام


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

      موفق و پیروز باشید

  • Hannah Martinez
    دو شنبه 11 دی 1278 - 0:00

    ممنون. خیلی خوب بود

  • Hannah Martinez
    امیر
    دو شنبه 11 دی 1278 - 0:00

    فقط یک کلمه : تشکر

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      باعرض سلام


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

      موفق باشید

  • Hannah Martinez
    حسام
    دو شنبه 11 دی 1278 - 0:00

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


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

    سپاس فراوان 

  • Hannah Martinez
    حسام
    دو شنبه 11 دی 1278 - 0:00

    لطفا کمک کنید 

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00


      با عرض سلام

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

      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    
          }




      موفق باشید

  • Hannah Martinez
    حسام
    دو شنبه 11 دی 1278 - 0:00

    راستی من مدت زمان Session  رو 15 دقیقه گذاشتم

  • Hannah Martinez
    حسام
    دو شنبه 11 دی 1278 - 0:00

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


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

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

  • Hannah Martinez
    مجید جمشیدی
    دو شنبه 11 دی 1278 - 0:00

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

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

      موفق باشید

  • Hannah Martinez
    حسام
    دو شنبه 11 دی 1278 - 0:00

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

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

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

      باتشکر

  • Hannah Martinez
    امیر
    دو شنبه 11 دی 1278 - 0:00

    درود

    و خسته نباشید

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

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

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

      موفق باشید

  • Hannah Martinez
    shima
    دو شنبه 11 دی 1278 - 0:00

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

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

      باتشکر

  • Hannah Martinez
    SadafZiya
    دو شنبه 11 دی 1278 - 0:00

    سلام درگاه من نشون داده میشه و کدنویسی هم تا جاییکه دیدم درست انجام شده ولی وقتی میخواد به متد bankcallback بیاد خطا میده و واردش نمیشه

  • Hannah Martinez
    اسماعیلشیدایی
    دو شنبه 11 دی 1278 - 0:00

    با عرض سلام

    بهترین راه حل در چنین شرایطی ذخیره و بررسی خطای رخ داده است، بهتر است کدهای خود را درون یک بلاک try catch قرار دهید و سپس با استفاده از دستورات زیر خطا را دریک فایل ذخیره و دلیل رخ دادن خطا را بررسی کنید.

     

     

    
    catch (Exception er)
    {
    using (StreamWriter writer =
    	    new StreamWriter("C:\\log.txt", true))
    	{
    	    writer.WriteLine(er.Message);
    	}
    }
    

     

     

  • Hannah Martinez
    SadafZiya
    دو شنبه 11 دی 1278 - 0:00

    روی لوکال با اعداد تست وارد میشه ولی زمانی که صفحه بانک نشون میده و خرید و تکمیل خرید انجام میشه وارد این تابع نمیشه من درون این تابع لاگ گذاشتم لاگها بررسی کردم و مشخص شد اصلا واردش نمیشه که بخواد خطا بده . روی برنامه آپلود شده با برنامه پست من چکش کردم ارور 404 میده و بعد از کلی امتحان یهو چندتااز درخواست 200ok داد ولی باز 404 شد . این موردیم که شما گفتید را تست میکنم باز (شاید وارد شه و خطاشو ثبت کنه!) مرسی

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با سلام

      برخی مواقع به دلیل استفاده Package های مختلف در web.config تنظیماتی ایجاد می شود که شما اجازه دسترسی و صدا زدن برخی توابع را از بیرون نمی دهید.

      این مورد را هم  حتما در نظر بگیرید

       

  • Hannah Martinez
    SadafZiya
    دو شنبه 11 دی 1278 - 0:00

    ممنون مرسی از سایت خوبتون

  • Hannah Martinez
    SadafZiya
    دو شنبه 11 دی 1278 - 0:00

    سلام

    من درگاه اینترنتی را درست کردم و پرداخت انجام میشه

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

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

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

  • Hannah Martinez
    SadafZiya
    دو شنبه 11 دی 1278 - 0:00

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

    در صورت حساب ، شرح تراکنش شماره حواله نوشته که یه عدد بزرگیه که چنین عددی به فرد داده نشده اصلا

  • Hannah Martinez
    تورنادوزارع
    دو شنبه 11 دی 1278 - 0:00

    با سلام

    ممنون از سایت بسیار مفیدتون و مطالب پربار آن

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

    با تشکر

  • Hannah Martinez
    مسعودش.
    دو شنبه 11 دی 1278 - 0:00

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

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

    آیا SaleReferenceId همون کد هست یا چیز دیگه ایه؟

    باز هم از زحمتی که برای تهیه آموزش کشیدید تشکر می کنم

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام
      از لطف شما بسیار سپاسگزارم

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

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

  • Hannah Martinez
    مسعودش.
    دو شنبه 11 دی 1278 - 0:00

    از شما بابت زحمتی که برای تهیه آموزش ها می کشید و اینکه سریع جواب دادید تشکر می کنم.

  • Hannah Martinez
    ایمان
    دو شنبه 11 دی 1278 - 0:00

    با سلام و تشکر از آموزش خوبتون

    من کد رو استفاده کردم مرحله پرداخت به درستی انجام میشه ولی وقتی بازگشت با سایت پذیرنده رو میزنم page not found برای url همون callback یعنی /payment/BankCallback نمایش داده میشه.

     

    اول action backCallback این کد رو گذاشتم ولی لاگ نمیشه توش:

     

    using (StreamWriter writer = new StreamWriter("C:\\log.txt", true)) { writer.WriteLine("ENTERED"); }

     

    برداشت خودم این که وقتی روی برگشت به سایت پذیرنده میزنم درخواستی که توی browser بوجود میاد از نوع get هست و action از نوع httpPost و فراخوانی نمیشه.

     

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      شاید شما Route خاصی را تعریف کرده اید و این سبب پیدا نشدن صفحه ی مربوطه می شود، ابتدا تست کنید که اگر آدرس را به صورت دستی وارد می کنید آیا سایت باز می شود یا خیر؟ اگر باز شد پس مشکل در کدهای شما برای بانک است ولی اگر کلا صفحه ی مورد نظر باز نشد حتما Route یا آدرس شما مشکل دارد 

      موفق باشید

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس