برنامه نویسی درگاه بانک
بسم الله الرحمن الرحیم
بخش چهارم
برنامه نویسی درگاه پرداخت آنلاین
بخش اول (اتصال سایت به درگاه بانک)
بخش دوم (برنامه نویسی درگاه پرداخت آنلاین)
بخش سوم (آموزش راه اندازی درگاه بانک ملت)
بخش چهارم (برنامه نویسی درگاه بانک)
در بخش پیش اطلاعات را برای درگاه بانک ملت ارسال کردیم، در این بخش اطلاعات برگردانده شده را بررسی و این آموزش را به پایان خواهیم رساند.
اطلاعاتی که درگاه پرداخت به شما بر می گرداند به صورت 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 پیاده سازی می کنیم که بسیار هم ساده می باشد.
بسم الله الرحمن الرحیم
بخش چهارم
برنامه نویسی درگاه پرداخت آنلاین
بخش اول (اتصال سایت به درگاه بانک)
بخش دوم (برنامه نویسی درگاه پرداخت آنلاین)
بخش سوم (آموزش راه اندازی درگاه بانک ملت)
بخش چهارم (برنامه نویسی درگاه بانک)
در بخش پیش اطلاعات را برای درگاه بانک ملت ارسال کردیم، در این بخش اطلاعات برگردانده شده را بررسی و این آموزش را به پایان خواهیم رساند.
اطلاعاتی که درگاه پرداخت به شما بر می گرداند به صورت 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
توضیحات: برنامه نویسی درگاه بانک ملت
hamid
سلام دوباره خسته نباشید.من یه سوال راجع به payerId پرسیده بودم که هیچ شناسه ای از بانک من نگرفتم،آیا صفر گذاشتن آن مشکلی برام ایجاد میکنه?
یه سوال دیگه راجع به صفحه BankCallback دارم و اونم اینه که من طبق آموزش شما یه اکشن مشابه اکشن شما در کنترلر نوشتم و برای این اکشن یه View ایجاد کردم،اما سوالم اینه چگونه تو View می تونم به پارامترهای ارسالی از بانک دسترسی داشته باشم و اونارو نشون بدم.تو آموزش شما راجع به View مربوط به BankCallback هیچ حرفی نزدین.
مشتاقانه منتظر پاسخ شما هستم.
تشکر و سپاس.
hamid
سلام دوباره خسته نباشید.من یه سوال راجع به payerId پرسیده بودم که هیچ شناسه ای از بانک من نگرفتم،آیا صفر گذاشتن آن مشکلی برام ایجاد میکنه?
یه سوال دیگه راجع به صفحه BankCallback دارم و اونم اینه که من طبق آموزش شما یه اکشن مشابه اکشن شما در کنترلر نوشتم و برای این اکشن یه View ایجاد کردم،اما سوالم اینه چگونه تو View می تونم به پارامترهای ارسالی از بانک دسترسی داشته باشم و اونارو نشون بدم.تو آموزش شما راجع به View مربوط به BankCallback هیچ حرفی نزدین.
مشتاقانه منتظر پاسخ شما هستم.
تشکر و سپاس.
اسماعیلشیدایی
با عرض سلام
ممنون. خیلی خوب بود
امیر
فقط یک کلمه : تشکر
اسماعیلشیدایی
باعرض سلام
حسام
با سلام و خسته نباشید
حسام
لطفا کمک کنید
اسماعیلشیدایی
با عرض سلام
از روش های زیر استفاده کنید و ببینید می توانید نتیجه بگیرید.
web config پروزه را به صورت زیر تنظیم کنید
همچنین می توانید برای هر دامنه ای که قرار است سایت شما به آن متصل شود به صورت زیر اطلاعات آن را ثبت کنید. اگر دو دامنه ی بانک و سایت خود را می خواهید ثبت کنید باید از کد زیر دوبار استفاده کنید.
همچنین می توانید در web config خود مقدار Machine Key را نیز تنظیم کنید.
و آخرین روش اینکه می توانید اطلاعات session خود را به صورت cookie ذخیره کنید و آنها را در مواقع نیاز بخوانید.
موفق باشید
حسام
راستی من مدت زمان Session رو 15 دقیقه گذاشتم
حسام
آقا سایتتون بسیار عالی هس خیلی خوشم اومد
مجید جمشیدی
اگر امکانش هست پرداخت الکترونیکی رو با php هم اموزش بدید ، سپاسگذارم
اسماعیلشیدایی
با عرض سلام
بله در حال تکمیل دوره های آموزشی PHP هستیم
موفق باشید
حسام
سلام و خسته نباشید
اسماعیلشیدایی
با عرض سلام
یک بار کد خطا را با مستندات بانک بررسی کنید و مطمئن شوید کدی که به شما اعلام می شود کد خطای IP است.
باتشکر
امیر
درود
و خسته نباشید
آقای شیدایی واقعا کارتون خیلی درسته
خیلی ممنون از مطالب و آموزش های مفیدتون , برای من با چند سال سابقه برنامه نویسی خیلی از مطالبتون مفید بود
اسماعیلشیدایی
با عرض سلام
ما نیز بسیار خوشحال هستیم که توانسته ایم نظر دوستان عزیزی همچون شما را جذب کنیم.
موفق باشید
shima
سلام خیلی ممنون از آموزش خوب و جامع خسته نباشید
در قسمت اخر لینکی برای دانلود پروژه پیدا نکردم ممنون میشم بررسی کنید
اسماعیلشیدایی
با عرض سلام
بله حتما، لینک پروژه را در اولین فرصت نیز اصلاح خواهیم کرد.
باتشکر
SadafZiya
سلام درگاه من نشون داده میشه و کدنویسی هم تا جاییکه دیدم درست انجام شده ولی وقتی میخواد به متد bankcallback بیاد خطا میده و واردش نمیشه
اسماعیلشیدایی
با عرض سلام
بهترین راه حل در چنین شرایطی ذخیره و بررسی خطای رخ داده است، بهتر است کدهای خود را درون یک بلاک try catch قرار دهید و سپس با استفاده از دستورات زیر خطا را دریک فایل ذخیره و دلیل رخ دادن خطا را بررسی کنید.
SadafZiya
روی لوکال با اعداد تست وارد میشه ولی زمانی که صفحه بانک نشون میده و خرید و تکمیل خرید انجام میشه وارد این تابع نمیشه من درون این تابع لاگ گذاشتم لاگها بررسی کردم و مشخص شد اصلا واردش نمیشه که بخواد خطا بده . روی برنامه آپلود شده با برنامه پست من چکش کردم ارور 404 میده و بعد از کلی امتحان یهو چندتااز درخواست 200ok داد ولی باز 404 شد . این موردیم که شما گفتید را تست میکنم باز (شاید وارد شه و خطاشو ثبت کنه!) مرسی
اسماعیلشیدایی
با سلام
برخی مواقع به دلیل استفاده Package های مختلف در web.config تنظیماتی ایجاد می شود که شما اجازه دسترسی و صدا زدن برخی توابع را از بیرون نمی دهید.
این مورد را هم حتما در نظر بگیرید
SadafZiya
ممنون مرسی از سایت خوبتون
SadafZiya
سلام
من درگاه اینترنتی را درست کردم و پرداخت انجام میشه
در اینجا مشکلی دارم اینکه : پس از پرداخت کد پیگیری بانک به فرد میده که مشخص میشه اون فرد این مبلغ واریز کرده .
اما در گردش حساب اینترنتی من راهی وجود نداره که بفهمم اون فرد با اون کر پیگیری چقدر ریخته . من الان چه جوری این کد پیگیری را در گردش حسابم رمزگشایی کنم ؟؟
اسماعیلشیدایی
معمولا مبلغ پرداختی کاربران بعد از گذشت 24 الی 48 ساعت توسط شرکت شاپرک به حساب شما واریز می شود.
SadafZiya
خب دقیقا منم همین کارو میکنم ولی کد پیگیری و شماره تراکنشی که دارم از پرداخت ها با اطلاعاتی که در گردش حساب هست تفاوت داره یعنی اصلا هیچ رابطه ای بینشون نیست اون کد یکتا تراکنش مگه کد پیگیری که بعد از پرداخت میده نیست ؟
در صورت حساب ، شرح تراکنش شماره حواله نوشته که یه عدد بزرگیه که چنین عددی به فرد داده نشده اصلا
تورنادوزارع
با سلام
ممنون از سایت بسیار مفیدتون و مطالب پربار آن
من پس از اجرای bpPayRequest در حالت تست، کد خطای 21، نامعتبر بودن پذیرنده رو دریافت میکنم. مقادیری که استفاده کردم نیز به جز آدرس دامنه شبیه مقادیر استفاده شده در آموزش شماست. اگر امکان داره راهنمایی بفرمایید.
با تشکر
مسعودش.
با سلام خدمت شما آقای شیدایی عزیز ممنون از آموزش جامع و کاملی که آماده کردید.
من هم مثل خانم صدف ضیا، می خواستم بدونم که اون کد پیگیری که با اطلاعات تراکنش حساب، میشه مقایسه کرد رو بانک با چه اسمی به سایت برگشت میده که بشه ذخیره کرد.
آیا SaleReferenceId همون کد هست یا چیز دیگه ایه؟
باز هم از زحمتی که برای تهیه آموزش کشیدید تشکر می کنم
اسماعیلشیدایی
با عرض سلام
از لطف شما بسیار سپاسگزارم
در ابتدای همین صفحه توضیحات مربوط به پارامترها و نحوه ی استفاده از انها مشخص شده است و همانطور که فرمودید، SaleReferenceId شماره ی مرجع تراکنش است و بر اساس سایر پارامتر ها شما می توانید تعیین کنید که آیا مبلغ مورد نظر پرداخت شده است یا خیر.
مختصرا، برای تعیین اینکه مبلغ مورد نظر پرداخت شده است باید پارامتر شماره ی تراکنش را به همراه تابع verify چک کنید که در صورت واریز شدن به حساب شما بانک کد مربوطه را اعلام کنید.
مسعودش.
از شما بابت زحمتی که برای تهیه آموزش ها می کشید و اینکه سریع جواب دادید تشکر می کنم.
ایمان
با سلام و تشکر از آموزش خوبتون
من کد رو استفاده کردم مرحله پرداخت به درستی انجام میشه ولی وقتی بازگشت با سایت پذیرنده رو میزنم 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 و فراخوانی نمیشه.
ممنون میشم راهنماییم بکنید که مشکل از کجاست؟
اسماعیلشیدایی
با عرض سلام
شاید شما Route خاصی را تعریف کرده اید و این سبب پیدا نشدن صفحه ی مربوطه می شود، ابتدا تست کنید که اگر آدرس را به صورت دستی وارد می کنید آیا سایت باز می شود یا خیر؟ اگر باز شد پس مشکل در کدهای شما برای بانک است ولی اگر کلا صفحه ی مورد نظر باز نشد حتما Route یا آدرس شما مشکل دارد
موفق باشید