براي من مستندات کار با درگاه پرداخت اينترنتي بانک ملي نسخه 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