PDA

View Full Version : آموزش: نمونه کد اتصال به بانک ملت (به پرداخت)



Ali_M.Eghbaldar
سه شنبه 20 خرداد 1399, 16:38 عصر
سلام
این چند وقت همش درگیر درگاه های بانکی بودم و هستم اول سداد ( نمونه کد اتصال به بانک ملی (سداد) (https://barnamenevis.org/showthread.php?561217-%D9%86%D9%85%D9%88%D9%86%D9%87-%DA%A9%D8%AF-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%A8%D8%A7%D9%86%DA%A9-%D9%85%D9%84%DB%8C-(%D8%B3%D8%AF%D8%A7%D8%AF)) ) و حالا هم ملت. جالب قضیه اینجاست که باز سداد نمونه کد (هرچند قدیمی و بروز نشده و ...) در اختیار من گذاشت، ولی «به پرداخت» گفت نمونه کد هم نداریم و فقط مستندات (منظورش همون PDF بود! - آدم فکر میکنه چه چیز(هایی) میخوان حالا بفرستن!) ایمیل کردند، زنگ هم زدم میگن اصلا نمونه کد نداریم! فک کنم برم سراغ درگاه بعدی احتمالا میگن بیا وب سرویس هم تو بنویس خودتم استفاده کن! هیچ ارزشی برای وقت آدم قائل نیستن، متاسفم!
نمونه کدهایی البته با C#‎‎‎‎‎‎‎‎‎ تو گوگل و سایت های دیگر و توی همین فروم هم هست ولی هم قدیمی هم خب C#‎‎‎‎‎‎‎‎‎ ئه.
باز هم بگذریم دوستان ...

نمونه کد تست شده با VB در اختیارتون میذارم. امیدوارم بدردتون بخوره :لبخندساده:

قبل از هر چیزی بگم که کدهایی «به پرداخت»چون آیپی سایتتون (همون که توی فرم ها تحویلشون دادید) چک میکنه توی localhost قابلیت اجرایی نداره و با خطای 421 مواجه میشید که invalid IP طبق مستندات!!! :قهقهه:

1) اضافه کردن وب سرویس به آدرس:
https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl

توجه: کدهای زیر پس از اد کردن وب سرویس توی web.config باید ایجاد بشه:
<system.serviceModel> <bindings>
<basicHttpBinding>
<binding name="PaymentGatewayImplServiceSoapBinding">
<security mode="Transport"/>
</binding>
<binding name="PaymentGatewayImplServiceSoapBinding1"/>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://bpm.shaparak.ir/pgwchannel/services/pgw" binding="basicHttpBinding" bindingConfiguration="PaymentGatewayImplServiceSoapBinding" contract="Mellat.IPaymentGateway" name="PaymentGatewayImplPort"/>
</client>
</system.serviceModel>

2) مشخصات کد پذیرندگی، ترمینال، نام کاربری و پسورد در فایل web.config صرفا جهت امنیت: (این موارد ایمیل میشن توسط به پرداخت عزیز!)
<add key="Bmellat_PgwSite" value="https://bpm.shaparak.ir/pgwchannel/startpay.mellat"/> <add key="Bmellat_TerminalId" value="*********"/>
<add key="Bmellat_UserName" value="**********"/>
<add key="Bmellat_UserPassword" value="********"/>
<add key="Bmellat_CallBackUrl" value="http://yoursite.com/bmellat"/>

3) متغیرهای زیر بصورت پاپلیک (Pgwsite = اجباری) در هدر تعریف کنید:
Public PgwSite As String = ConfigurationManager.AppSettings("Bmellat_PgwSite") Dim CallBackUrl As String = ConfigurationManager.AppSettings("Bmellat_CallBackUrl")
Dim TerminalId As String = ConfigurationManager.AppSettings("Bmellat_TerminalId")
Dim UserName As String = ConfigurationManager.AppSettings("Bmellat_UserName")
Dim UserPassword As String = ConfigurationManager.AppSettings("Bmellat_UserPassword")

4) دستورات زیر برای ارجاع به بانک مثلا از طریق Button استفاده کنید:
Dim localdate As String = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString().PadLeft(2, "0") + DateTime.Now.Day.ToString().PadLeft(2, "0") Dim localtime As String = DateTime.Now.Hour.ToString().PadLeft(2, "0") + DateTime.Now.Minute.ToString().PadLeft(2, "0") + DateTime.Now.Second.ToString().PadLeft(2, "0")


Dim M As New Mellat.PaymentGatewayClient
Dim Result As String = M.bpPayRequest(Val(TerminalId), _
UserName, _
UserPassword, 1101120, 1000, localdate, localtime, "", CallBackUrl, 1)


Dim resultarray() As String = Result.Split(",")
If (resultarray(0) = "0") Then
ClientScript.RegisterStartupScript(GetType(Page), "ClientScript", "<script language='javascript' type='text/javascript'> postRefId('" + resultarray(1) + "');</script> ", False)
End If

5) دستورات زیر در HTML و در Head:
<script language="javascript" type="text/javascript"> function postRefId(refIdValue) {
var form = document.createElement("form");
form.setAttribute("method", "POST");
form.setAttribute("action", "<%= PgwSite %>");
form.setAttribute("target", "_self");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("name", "RefId");
hiddenField.setAttribute("value", refIdValue);
form.appendChild(hiddenField);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
}
</script>

6: و در انتها دستورات خوانش مقادیر برگشتی از بانک:
RefIdLabel.Text = Request.Params("RefId") ResCodeLabel.Text = Request.Params("ResCode")
SaleOrderIdLabel.Text = Request.Params("SaleOrderId")
SaleReferenceIdLabel.Text = Request.Params("SaleReferenceId")
با مقدار برگشتی ResCode میتونید بفهمید که تراکنش تون موفق بوده یا نه. اگر صفر بود موفق است و اگر غیر از صفر براساس جدول شماره یازده ناموفق. مثلا اگر 17 برگشت داده شد یعنی کاربر روی دکمه ی انصراف زده.
بعد از بررسی صحت ResCode و صفر بودن آن باید با استفاده از کد verify زیر به بانک بفهمونید که عملیات درست انجام شده در غیر این صورت مبلغ به حساب مشتری برمیگرده.
Dim M As New Mellat.PaymentGatewayClient
ResCode = M.bpVerifyRequest(TerminalId, username, password, Val(SaleOrderId), Val(SaleOrderId), Val(SaleReferenceId))
مقدار جدید برگشتی ResCode هم حاوی کد تائید براساس جدول است. (این کد با کد اولیه که توی ResCode ریخته شد متفاوته من هر دو رو توی ی متغیر ریختم شما میتونید توی متغیر های متفاوت بریزید.)

بازم اگر به نکته ای رسیدم مثل پست «سداد» ویرایش میکنم.
موفق باشید.