PDA

View Full Version : سوال: نمونه کد اتصال به بانک ملی (سداد)



Ali_M.Eghbaldar
سه شنبه 13 خرداد 1399, 09:53 صبح
سلام
دنبال نمونه کد VB.NET برای اتصال به بانک ملی میگیردم.
خود بانک C# و MVC در اختیارم قرار داده که طبیعتا به درد من نمیخوره. توی نتم هم سرچ زیادی زدم هرچی هست نمونه های قدیمی و منسوخ شدس.
اگر کسی نمونه کدی جدید داره لطف کنه.
ممنون میشم.

Ali_M.Eghbaldar
سه شنبه 13 خرداد 1399, 20:37 عصر
خودم تونستم انجامش بدم
فقط الان ی مسئله ای که برام اینکه برای Post و Redirect به پیج بانک میاد و تمامی پارامترها توی متغیری به اسم FormBody میریزه و بعد با input 'submit' ارجاع میده به صفحه بانک، الان چطوری میشه اینو با Behind code کنترلش کرد؟



<%=FormBody %>
<input type='submit' name='Submit Query' id="Submit2" />

باید بگم که کدهای بالای توی Form (چه با runat=server و چه بدون اون) کار نمیکنه چرا که در این متغییر تگ های HTML دارن تولید میشن و سپس post میشن


FormBody = MerchantHelpers.PaymentUtility(ServiceUrl, PaymentUrl, MerchantId, _ 10000, 35, tranKey, _
TerminalId, ReturnURL, AdditionalInfo, _
requestKey)

Ali_M.Eghbaldar
چهارشنبه 14 خرداد 1399, 11:07 صبح
ممنون از دوستانی که کمک کردند. خب ما یادگرفتیم خودمون همه چیز راس و ریس کنیم :لبخندساده: بگذریم ...
از اونجایی که دوست ندارم کسِ دیگه ای چند روز وقتش گرفته بشه، روند استفاده از کدهای (شاهکار) سداد میذارم. امیدوارم بدردتون بخوره

1) اضافه کردن DLL های EPS.MerchantHelper ، EPS.MerchantHelper.XmlSerializers ، EPSMerchantHelper.XmlSerializers و EPSMerchantV2_DLLVersion به پوشه ی Bin

2) اضافه کردن کلیدهای زیر جهت امنیت بیشتر در تگ appSetting فایل web.config (البته میتونید اینارو توی behindcode هم بذارید ولی توصیه نمیکنم)
<add key="MerchantId" value="**********"/>
<add key="Terminal" value="**********"/>
<add key="TranKey" value="**********"/>
<add key="ServiceURL" value="https://sadad.shaparak.ir/services/MerchantUtility.asmx"/>
<add key="ReturnURL" value="صفحه ای که میخواهید از بانک برگشت داده شود"/>
<add key="PaymentURL" value="https://sadad.shaparak.ir/purchase"/>

3) فراخوانی توابع کلاس EPS

Imports EPS.MerchantHelper

4) با دستورات زیر کلید اصلی (قبل از رفتن به صفحه بانک) ایجاد میشه و آماده Fire شدن هست (حالا من اینو صرفا برای تست توی page_load نوشتم شما میتونید هرجایی بنویسید)

Protected FormBody As String = ""

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Dim ServiceUrl As String = ConfigurationManager.AppSettings("ServiceURL")
Dim PaymentUrl As String = ConfigurationManager.AppSettings("PaymentURL")
Dim MerchantId As String = ConfigurationManager.AppSettings("MerchantId")
Dim tranKey As String = ConfigurationManager.AppSettings("TranKey")
Dim TerminalId As String = ConfigurationManager.AppSettings("Terminal")
Dim ReturnURL As String = ConfigurationManager.AppSettings("ReturnURL")
Dim AdditionalInfo As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")


Dim requestKey As String ' request key


FormBody = MerchantHelpers.PaymentUtility(ServiceUrl, PaymentUrl, MerchantId, _
10000, 35, tranKey, _
TerminalId, ReturnURL, AdditionalInfo, _
requestKey)
lblRequest.Text = requestKey


'''''''''''''''
Session("ServiceURL") = ServiceUrl
Session("TranKey") = tranKey
Session("MerchantID") = MerchantId
Session("Terminal") = TerminalId
Session("AmountTrans") = "10000"
Session("RequestKey") = requestKey
Session("AdditionalInfo") = AdditionalInfo


End Sub

5) از اونجایی که طبق کدنویسی شاهکار سداد، تگ های ACTION در متغییر FORMBODY بصورت HTML تشکیل میشه و بیشترین مشکل خود منم با این قسمت بود (چون بصورت معمول قابلیت fire شدن نداره)، خود سداد از input submit استفاده میکنه ولی خوب این برای حالتی که بخوایم از behindcode استفاده کنم مقدور نیست پس میشه دو تا کلک رشتی زد:
یک: مقدار متغیر FORMBODY توی کنترل literal ریخت و خودبخود هم fire میشه ولی شرط این حالت اینکه که از قبل، متغیر در page_load پر شده باشه وگرنه کاربر مجبوره دو بار fire کنه که خوب مناسب نیست.:افسرده:
Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click Literal1.Text = FormBody
End Sub

دو: اگر بخوایم در یک مرحله، هم متغیر پر بشه و هم fire صورت بگیره باید از response.write بصورت زیر استفاده کرد:
Response.Clear() Dim sb As New StringBuilder
sb.Append(FormBody)
sb.Append("<html>")
sb.AppendFormat("<body onload='document.forms[0].submit()'>")
sb.Append(FormBody)
sb.Append("</body>")
sb.Append("</html>")
Response.Write(sb.ToString())
Response.End()

ولی...
اگر کدهای کسی در Updatepanel باشه دیگه دردسر بیشتر میشه چون response.write توی updatepanle کار نمیکنه. نگران نباشید اونم حل کردم.
ابتدا تابع جاوای زیر به انتهای صفحه تون اضاف کنید:
<script> function post(f) {
document.body.innerHTML = f;
document.getElementById("paymentUTLfrm").submit();
}
</script>
بعد از دستور ScriptManager.RegisterClientScriptBlock بصورت زیر استفاده کنید تا فرم submit کنه.
ScriptManager.RegisterClientScriptBlock(Me, Me.GetType(), "post", "post('" & FormBody.Replace("'", """") & "');", True)

6) اینم کدهای صفحه برگشتی از بانک:
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load

If Not IsPostBack Then


txtPostFP.Text = HttpContext.Current.Request.Form("FP")
txtPostOrderId.Text = HttpContext.Current.Request.Form("OrderId")
txtPostTimeStamp.Text = HttpContext.Current.Request.Form("TimeStamp")


If Session.Count > 0 Then
txtTXKey.Text = Session("TranKey").ToString()
txtMerchantID.Text = Session("MerchantID").ToString()
txtTerminalID.Text = Session("Terminal").ToString()
TxtAmount.Text = Session("AmountTrans").ToString()
txtRequestKey.Text = Session("RequestKey").ToString()
Else
lblMessage.Text = "اطلاعات خرید موجود نیست"
End If


CheckRequestStatus()
End If


End Sub


Private Sub CheckRequestStatus()


Dim OrderId As Long = Convert.ToInt64(35)
Dim Amount As Long = Convert.ToInt64(10000)




Dim ServiceURL As String = Session("ServiceURL").ToString()
Dim _RefNo, Appstatus, RealTransactionDateTime As String


Dim _AppStatusCode As Integer = MerchantHelpers.CheckRequestStatus(ServiceURL, OrderId,
txtMerchantID.Text, txtTerminalID.Text,
txtTXKey.Text, txtRequestKey.Text, Amount,
_RefNo, Appstatus, RealTransactionDateTime)


TxtAmount.Text = Amount.ToString()
LabelStatus.Text = _AppStatusCode.ToString()
LabelRefNo.Text = _RefNo
LabelAppStatus.Text = Appstatus
lblRealTransactionDateTime.Text = RealTransactionDateTime


End Sub

در خصوص مدیریت خرید:
شما میتونید با مقدار برگشتی در متغییر Status بررسی لازم انجام بدین. بعنوان مثال اگر مقدار برگشتی -1 باشه یعنی خرید موفق نبوده (خریدار برگشت زده) و اگر 0 باشه خرید موفق بوده. لیست کامل این مقادر در پیوست شماره (3) و در جدول «کلیدهای بازگشتی» که بانک به شما میده موجوده همیچنین وقتی خرید موفق آمیز باشه، پارامتر برگشتی (ByRef) به اسم _RefNo هم مقدار یونیکی به خودش میگیره که میتونید توی بانک ذخیرش کنیدکه این مقدار با عنوان «شماره مرجع تراکنش» در پرتال بانک ملی قابل رصد کردنه.

امیدوارم کسی مشکلی نداشته باشد با این کدهای VB
لازم به گفتن که ما بخاطر استفاده از WEB FORM کلید API عوض کردیم پس این کدهای برای MVC نیست.
برای تغییر کلید باید با پشتیبانی سداد تماس بگیرید و دو ساعت هم بیشتر طول نمیکشه
موفق باشید.

Tekyegah
یک شنبه 18 خرداد 1399, 01:22 صبح
سلام
:تشویق: چه عجب ...
بعد مدت ها یه بنده خدایی پیدا شد که مشکلش حل شد و اومد توضیح داد چیکار کرده و چطوری کد درست شد .
سپاسگذریم

dexterato
جمعه 13 تیر 1399, 15:16 عصر
سلام
یه پروژه متن باز هست به اسم پرباد که چندین درگاه بانکی رو هم پشتیبانی می کنه.

پشتیبانی از درگاه‌های: ملت، ملی (سداد)، پارسیان، پاسارگاد، ایران کیش، سامان و آسان پرداخت ، زرین پال، پی آی آر و آی دی پی

moslem.hady
دوشنبه 16 تیر 1399, 11:11 صبح
ممنون از دوستانی که کمک کردند. خب ما یادگرفتیم خودمون همه چیز راس و ریس کنیم :لبخندساده: بگذریم ...
از اونجایی که دوست ندارم کسِ دیگه ای چند روز وقتش گرفته بشه، روند استفاده از کدهای (شاهکار) سداد میذارم. امیدوارم بدردتون بخوره

تشکر بابت به اشتراک گذاری :تشویق::تشویق: