# زبان های اسکریپتی > Classic ASP > سوال: پرداخت بانک ملي

## binyaz2003

کسي تا حالا با بانک ملي براي پرداخت با asp classic کار نکرده؟(ويرايش جديدش استفاده از وب سرويس)

----------


## binyaz2003

من تو کار با وب سرويس بانک مشکل دارم.خطاي زير رو ميده ، کسي ميدونه يعني چي؟کجا ميتونم مرجع Soap رو گيربيارم :
Err.Number 3 = -2147024809
SoapMapper:Restoring data into SoapMapper string failed HRESULT=0x80070057: The parameter is incorrect. - Client:Unspecified client error. HRESULT=0x80070057: The parameter is incorrect. 
طبق گفته پشتيباني بايد در تابع PaymentUtility پارامتر آخرش يک متغيير باشه که وبسروريس مقداري رو در اون ذخيره و برگرداند.همچنين گفتن که بايد بصورت ref فرستاده بشه.اونطور که من جستجو کردم در asp بصورت پيش فرض همينطوره.
کدي که من استفاده ميکنم :
On Error Resume Next
strRequestkey = ""
strForm = ""
SET objSoapClient = Server.CreateObject("MSSOAP.SoapClient30")
objSoapClient.ClientProperty("ServerHTTPRequest") = True
If Err Then Response.Write "<br>Err.Number 1 = " & Err.Number & "<br>" & Err.Description
Call objSoapClient.mssoapinit("https://bmiutility.bmi.ir/merchantutility.asmx?WSDL","MerchantUtility")
If Err Then Response.Write "<br>Err.Number 2 = " & Err.Number & "<br>" & Err.Description
strForm = objSoapClient.PaymentUtility("1111",10000,123456,"  bbbb","11112222","http://mydomain.com/recive.asp",strRequestkey)
If Err Then Response.Write "<br>Err.Number 3 = " & Err.Number & "<br>" & Err.Description
Response.Write(strForm)
Response.Write(strRequestkey)

----------


## binyaz2003

نمونه کد دات نت و php اون همراهش بايد باشه.من بعد از کلي گشتن و امتحان کردن کدهاي مختلف راه حلش رو پيدا کردم.نهايي که شد اينجا قرار ميدم.
اولي آدرس صفحه اي از سايت شماست که کاربر از سايت شما به سايت بانک ملي براي پرداخت هدايت ميشه.
دومي آدرس صفحه اي از سايت شماست که کاربر از سايت بانک به سايت شما برگشت داده ميشه.
در موارد خاصي از شماره پورت استفاده ميشه.
آخري هم نوع زبان برنامه نويسي شما هست.

----------


## binyaz2003

براي من مستندات کار با درگاه پرداخت اينترنتي بانک ملي نسخه 3.0 رو فرستادم به همراه يک مثال مفصل دات نت و يک مثال php 
اول اينکه کد php شون رو هاست من نه با php 4.7 و نه با php 5 کار نکرد و خطا داد که اعلام کردم بهشون اما جوابي ندادند.
http://bmi.ir/Forums/ShowPost.aspx?PostID=4153
دوم هم اينکه چون دات نت نميدونم رفتم سراغ اينکه با همين asp classic باهاش کارکنم.اين درگاه يک وبسرويس هست به آدرس https://bmiutility.bmi.ir/merchantutility.asmx که البته 4 خطه يعني https://bmiutility1.bmi.ir/merchantutility.asmx و ... که به شما اعلام ميکنند که شما روي کدوم Line بايد کارکنيد.
نکته ديگه اينکه همانطور که در اين تاپيک گفتم مشکلي وجود داره براي استفاده از soap و اينکه در اين وبسرويس در اکثر متدها از متغيير out که در C#‎ تعريف ميشه استفاده شده که تقريبا مثل ref ميمونه با يکسري تفاوت که در asp classic نميشه استفاده کرد.(به نظرم اينطوري برنامه نويس وبسرويس کار خودش رو راحتتر کرده مثلا در وبسرويس بانک سامان تا جاييکه من مثالشون رو ديدم با soap متصل ميشويد و خبري از out نيست که با فراخواني يک متد بيش از 2 مقدار رو بخوان برگردونند)بنابراين گزينه soap رو کنار گزاشتم .
کلا روند کلي اينطوريه که شما ابتدا متد PaymentUtility را با پارامترهاش صدا ميزنيد و اين متد يک رشته که فرم html هست به شما برميگردانه و کافيه شما يک دکمه submit به اون اضافه کنيد و کاربر يا تايد به سايت بانک جهت پرداخت هدايت ميشه همچنين يک کد به اسم RequestKey هم برميگردونه که شما بايد به همراه مبلغ و شماره خريد اون رو جهت چک کردن واريز ذخيره کنيد.
پس از پرداخت موفق بانک کاربر رو به صفحه اي که شما مشخص کرده ايد برميگردونه بعلاوه شماره خريد که بصورت متد پست فرم فرستاده ميشه و شما بايد در آن صفحه تابع CheckRequestStatus را صدا بزنيد تا هم از وضعيت پرداخت مطلع بشيد و هم واريز پول را قطعي کنيد در غير اينصورت پول برگشت ميخورد.
نکته اي رو هم که جايي ننوشته و يا بايد خودتون علم غيب داشته باشيد يا قبلا با اين سيستم ها کارکرده باشيد اينه که يک مبلغ کمي مثل 101 ريال بايد در ابتدا پرداخت کنيد تا محدوديت سقف واريز به حساب شما برداشته شود واگر نه با خطاي مواجه ميشيد و جالبيش به اينه که اگر با کارتي غير از کارت بانک ملي بخواهيد پرداخت کنيد نميتونيد،چرا؟چون براي کارتهاي شتاب حداقل 1000 ريال هست و يا بايد با کارت ملي اين محدوديت روبرداريد يا تماس بگيريد و بگيد که مبلغ محدوديت رو عوض کنند.
پس از جستجوي زيادي کردم تونستم با روش زير با وبسرويس کار کنم :
On Error Resume Next

CardAcqID="1111"
AmountTrans=1000
OrderId=1111
TransactionKey="1111"
TerminalId="1111"
ReturnURL="http://yoursite.com/recive.asp"

SOAPRequest="<?xml version=""1.0"" encoding=""utf-8""?>"
SOAPRequest=SOAPRequest&"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
SOAPRequest=SOAPRequest&"<soap:Body>"
SOAPRequest=SOAPRequest&"<PaymentUtility xmlns=""http://tempuri.org/"">"
SOAPRequest=SOAPRequest&"<CardAcqID xmlns="""">"&CardAcqID&"</CardAcqID>"
SOAPRequest=SOAPRequest&"<AmountTrans xmlns="""">"&AmountTrans&"</AmountTrans>"
SOAPRequest=SOAPRequest&"<OrderId xmlns="""">"&OrderId&"</OrderId>"
SOAPRequest=SOAPRequest&"<transactionKey xmlns="""">"&TransactionKey&"</transactionKey>"
SOAPRequest=SOAPRequest&"<TerminalId xmlns="""">"&TerminalId&"</TerminalId>"
SOAPRequest=SOAPRequest&"<RedirectURL xmlns="""">"&ReturnURL&"</RedirectURL>"
SOAPRequest=SOAPRequest&"</PaymentUtility>"
SOAPRequest=SOAPRequest&"</soap:Body>"
SOAPRequest=SOAPRequest&"</soap:Envelope>"

   set objSrvHTTP = CreateObject("Msxml2.ServerXMLHTTP.3.0")
   set objXMLSend = CreateObject("Msxml2.DOMDocument.3.0")

   objXMLSend.async = "false"
   objXMLSend.loadXML SOAPRequest
   
   objSrvHTTP.open "POST","https://bmiutility.bmi.ir/merchantutility.asmx","false"
   objSrvHTTP.setRequestHeader "Content-Type","application/soap+xml; charset=utf-8"
   objSrvHTTP.setRequestHeader "SOAPAction","http://tempuri.org/PaymentUtility"
   objSrvHTTP.send objXMLSend

strRequestkey=""
strForm=""
    Set nodes = objSrvHTTP.responseXML.getElementsByTagName("Payme  ntUtilityResult")
    For Each node in nodes
		strForm=node.text
    Next 
	Response.Write(strForm)
	Response.Write("<br>")
    Set nodes = objSrvHTTP.responseXML.getElementsByTagName("Reque  stKey")
    For Each node in nodes
		strRequestkey=node.text
    Next
	Response.Write(strRequestkey)
		
If Err Then Response.Write "<br>Err.number= " & Err.number & "<br>" & Err.Description

----------


## binyaz2003

من اين کدها رو براي بانک هم فرستاده بودم منتها چون جوابي نيومد اينجا گزاشتم اما امروز تعجب کردم که کد اصلاح شده رو فرستادن.انگار همه متغييرها بايسيتي رشته باشن تا درست کار کنه.تست کردم جواب داد.
_اينم کد تابع CheckRequestStatus که البته خطا ميده و منم بهشون اعلام کردم و جوابي به من ندادن و ميگن که حتما اشکال کار شماست در صورتي که من با همين رويه تابع اول رو صدا ميزنم و درست کار ميکنه خطا رو ميتونيد در آدرس زير ببينيد:
http://reg.yadeemam.ir/recive1.asp
لطفا اگر کسي ميتونه ببينه مشکل از چيه و از کجاست؟
کد :_
<%
On Error Resume Next

str_Result=""
str_RetrivalRefNo=""
str_AppStatus=""

str_Requestkey=Session("strRequestkey")
str_AmountTrans=Session("AmountTrans")
str_CardAcqID=Session("CardAcqID")
str_TransactionKey=Session("TransactionKey")
str_TerminalId=Session("TerminalId")
str_OrderId=Session("OrderId")

SOAPRequest="<?xml version=""1.0"" encoding=""utf-8""?>"
SOAPRequest=SOAPRequest&"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
SOAPRequest=SOAPRequest&"<soap:Body>"
SOAPRequest=SOAPRequest&"<CheckRequestStatus xmlns=""http://tempuri.org/"">"
SOAPRequest=SOAPRequest&"<OrderID xmlns="""">"&str_OrderId&"</OrderID>"
SOAPRequest=SOAPRequest&"<CardAcqID xmlns="""">"&str_CardAcqID&"</CardAcqID>"
SOAPRequest=SOAPRequest&"<TerminalID xmlns="""">"&str_TerminalId&"</TerminalID>"
SOAPRequest=SOAPRequest&"<transactionKey xmlns="""">"&str_TransactionKey&"</transactionKey>"
SOAPRequest=SOAPRequest&"<RequestKey xmlns="""">"&str_Requestkey&"</RequestKey>"
SOAPRequest=SOAPRequest&"<AmountTrans xmlns="""">"&str_AmountTrans&"</AmountTrans>"
SOAPRequest=SOAPRequest&"</CheckRequestStatus>"
SOAPRequest=SOAPRequest&"</soap:Body>"
SOAPRequest=SOAPRequest&"</soap:Envelope>"


   set objSrvHTTP = CreateObject("Msxml2.ServerXMLHTTP.3.0")
   set objXMLSend = CreateObject("Msxml2.DOMDocument.3.0")

   objXMLSend.async = "false"
   objXMLSend.loadXML SOAPRequest
   
   objSrvHTTP.open "POST","https://bmiutility4.bmi.ir/merchantutility.asmx","false"
   objSrvHTTP.setRequestHeader "Content-Type","application/soap+xml; charset=utf-8"
   objSrvHTTP.setRequestHeader "SOAPAction","http://tempuri.org/CheckRequestStatus"
   objSrvHTTP.send objXMLSend

    Set nodes = objSrvHTTP.responseXML.getElementsByTagName("Check  RequestStatusResult")
    For Each node in nodes
    	str_Result=node.text
    Next
    Set nodes = objSrvHTTP.responseXML.getElementsByTagName("Retri  valRefNo")
    For Each node in nodes
    	str_RetrivalRefNo=node.text
    Next
    Set nodes = objSrvHTTP.responseXML.getElementsByTagName("AppSt  atus")
    For Each node in nodes
    	str_AppStatus=node.text
    Next

    'Response.Write(objSrvHTTP.responseXML.xml)

    Response.Write "Result : "+str_Result
    Response.Write "<br>"
    Response.Write "RetrivalRefNo : "+str_RetrivalRefNo	
    Response.Write "<br>"
    Response.Write "AppStatus : "+str_AppStatus

    If str_AppStatus="COMMIT" and str_Result=0 Then
	    Response.Write "<p align='center'><font color='#008800' face='Tahoma' size='2'>با تشکر،پرداخت شما ثبت شد.</font><br>کد پيگيري پرداخت : "& str_RetrivalRefNo &"</p>"
    Else
	    Response.Write "<p align='center'><font color='#FF0000' face='Tahoma' size='2'>خطا در پرداخت</font>"
	    Response.Write "<br>"
	    Select Case cdbl(str_Result)
		    Case -1
			    Response.Write("یکی از موارد مبلغ، شماره سفارش یا کلید درخواست اشتباه است")
		    Case 1
			    Response.Write("با بانک صادر کننده تماس حاصل نمایید")
		    Case 3
			    Response.Write("پذیرنده کارت فعال نیست")
		    Case 12
			    Response.Write("تراکنش معتبر نمی باشد")
		    Case 13
			    Response.Write("مبلغ تراکنش معتبر نمی باشد")
		    Case 14
			    Response.Write("شماره کارت اشتباه است")
		    Case 33
			    Response.Write("تاریخ استفاده کارت به پایان رسیده است")
		    Case 41
			    Response.Write("کارت مفقوده می باشد")
		    Case 43
			    Response.Write("کارت مسروقه می باشد")
		    Case 51
			    Response.Write("موجودی حساب کافی نمی باشد")
		    Case 55
			    Response.Write("رمز وارده صحیح نمی باشد")
		    Case 56
			    Response.Write("شماره کارت یا CVV2  صحیح نمی باشد")
		    Case 57
			    Response.Write("دارنده کارت مجاز به انجام این تراکنش نمی باشد")
		    Case 58
			    Response.Write("پذیرنده کارت مجاز به انجام این تراکنش نمی باشد")
		    Case 61
			    Response.Write("مبلغ تراکنش از حد مجاز بالاتر است")
		    Case 65
			    Response.Write("تعداد دفعات تراکنش از حد مجاز بیشتر است")
		    Case 75
			    Response.Write("ورود رمز دوم از حد مجاز گذشته است. رمز دوم جدید در خواست نمایید")
		    Case 79
			    Response.Write("شماره حساب نامعتبر است")
		    Case 80
			    Response.Write("تراکنش موفق عمل نکرده است")
		    Case 84
			    Response.Write("سوئیچ صادر کننده کارت فعال نیست")
		    Case 88
			    Response.Write("سیستم دچار اشکال شده است")
		    Case 90
			    Response.Write("ارتباط به طور موقت قطع می باشد")
		    Case 91
			    Response.Write("پاسخ در زمان تعیین شده بدست سیستم نرسیده است")
		    Case 1003
			    Response.Write("اطلاعات پذیرنده اشتباه است")
		    Case 1004
			    Response.Write("پذیرنده موجود نیست")
		    Case 1006
			    Response.Write("خطای داخلی")
		    Case 1012
			    Response.Write("اطلاعات پذیرنده اشتباه است")
		    Case 1017
			    Response.Write("پاسخ خطا از سمت مرکز")
		    Case 1018
			    Response.Write("شماره کارت اشتباه است")
		    Case 1019
			    Response.Write("مبلغ بیش از حد مجاز است")
		    Case 9005
			    Response.Write("تراکنش ناموفق ( مبلغ به حساب دارنده کارت برگشت داده شده است)")
		    Case 9006
			    Response.Write("تراکنش ناتمام ( در صورت کسرموجودی مبلغ به حساب دارنده کارت برگشت داده می شود)")
		    Case 9008
			    Response.Write("اشکالی در بررسی وضعیت تراکنش رخ داده است.")
	    End Select
	    Response.Write("<br>")
	    Select Case str_AppStatus
		    Case "NOT_SET"
			    Response.Write("مقادیر تراکنش هنوز مشخص نشده است")
		    Case "NOT_EXIST"
			    Response.Write("تراکنش بر روی درگاه وجود ندارد")
		    Case "INCOMPLET_INFO"
			    Response.Write("تراکنش در مرحله تکمیل اطلاعات است")
		    Case "REQUEST_DONE"
			    Response.Write("تراکنش انجام شده است ولی هنوز نتیجه آن توسط پذیرنده دریافت نشده است")
		    Case "WAIT_FOR_REVERSAL"
			    Response.Write("در انجام تراکنش مشکلی به وجود آمده است و تراکنش در حال انتظار برای انجام عملیات بازگشت به حساب است")
		    Case "WAIT_FOR_REVERSAL_ADVISE"
			    Response.Write("در انجام عملیات برگشت تراکنش مشکلی به وجود آمده است و تراکنش در انتظار برگشت مجدد است.")
		    Case "REVERSALED"
			    Response.Write("تراکنش موفق نبوده است و مبلغ با موفقیت به حساب خریدار برگشت داده شده است.")
		    Case "FAILED"
			    Response.Write("خطایی در انجام تراکنش رخ داده است.جهت تشخیص نوع خطا به لیست کدهای خطا مراجه نمایید.")
		    Case "CHECK_STATUS"
			    Response.Write("تراکنش با موفقیت انجام شده است و در انتظار عملیات checkstatus  از سمت پذیرنده میباشد")
		    Case "WAIT_FOR_REVERSAL_10MINUTE"
			    Response.Write("نتیجه تراکنش ظرف 10 دقیقه توسط پذیرنده دریافت نشده است و در انتظار برای عملیات برگشت پول میباشد.")
	    End Select
	    Response.Write("</p>")
    End If

    If Err Then Response.Write "<br>Err.number= " & Err.number & "<br>" & Err.Description
%>

----------


## binyaz2003

پس من از سيستم ديگري استفاده ميکنم (تفاوتشون در چيه؟)
در مورد کد ccv2 فکر کنم بسته به بانک صادر کننده کارت باشه.
اگر در صفحه پرداخت مشخصات شما رو بياره يعني اين مقاديري که به شما دادن درسته و از همينها بايد استفاده کنيد اگر هم مثلا اسم سداد يا چيز ديگري ميآورد، براي تست هستند.

----------


## binyaz2003

کد صدا زدن CheckRequestStatus  اصلاح شد.

----------


## hamid19395

سلام
امروز من اومدم شهریه دانشگاه بریزم 
پیغام داد (مبلغ تراکنش بیش از حد مجاز است)
این پیغام یعنی چی؟من هربار همین مبلغ رو میریختم و مشکلی نبود الان نمیدونم چرا
اینجوری شده
کسی میتونه کمکم کنه؟

----------


## binyaz2003

دانشگاه آزاد؟
شما بايد با مسئول سايتتون تماس بگيريد يا در اينجا http://bmi.ir/Forums/Default.aspx?tid=1 مطرح کنيد.

----------


## hamid19395

> دانشگاه آزاد؟
> شما بايد با مسئول سايتتون تماس بگيريد يا در اينجا http://bmi.ir/Forums/Default.aspx?tid=1 مطرح کنيد.


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

----------


## binyaz2003

مشکل از شما نيست.بانک ملي براي هر حساب يک محدوديت سقف پرداخت ميزاره که تا اون مبلغ خاص پرداخت نشه بيشتر از اون نميشه پرداخت.اگر سايت دانشگاه شما تازه راه اندازي شده شايد هنوز نپرداختن.در کل به مسئول سايت خبر بيديد.مشکل از کاربر نيست.

----------

