PDA

View Full Version : پرداخت الکترونیکی بانک ملی



jaykob
دوشنبه 29 فروردین 1390, 19:00 عصر
سلام دوستان

من پرداخت الکترونیکی بانک ملت را پیاده سازی کردم و همینطور از سامان رو هم دارم کار می کنم مشکلی نداشتم و درست کار می کنند . اما از بانک ملی یا همون دامون یکسری مستندات و فایل asp فرستاده که من سر در گم شدم . از دوستان کسی نمونه کد دات نت رو داره که برام بفرسته و یا اینکه با مثال مراحل پست کردن رو توضیح بده خیلی بد توضیح داده شده و پشتیبانی هم نداره .

با تشکر

aserfg
سه شنبه 30 فروردین 1390, 08:26 صبح
سلام دوست عزیز اگه فایل asp فرستاده دیگه نباید مشکلی داشته باشین در صفحه aspx خودتون در دایرکتیو صفحه AspCompat="true قرار بدین این باعث می شه شما بتونید از asp کلاسیک استفاده کنید .

jaykob
سه شنبه 30 فروردین 1390, 13:41 عصر
ممنون اما کد هاش به خوانایی بانک هایی مثل ملت نیستند من تمامی مستندات فنی را ضمیمه کردم . دوستانی هم که پیاده سازی کرده اند لطفا راهنمایی بفرمایند .

با تشکر

HamidNch
سه شنبه 30 فروردین 1390, 22:49 عصر
سلام.ازدوستان که ایکار رو کردن یا در حال انجام هستن.میشه خواهش کنم بفرمایند اگر مقدار پرداخت توسط کاربر و با تایپ در TextBox مشخص بشه چطور میشه اطلاعات مربوط به امضا رو اول در دیتابیس ذخیره کرد و بعد به صفحه پرداخت بانک ارجاع کرد.مشکل من تو اینه که چون امضا تو قسمت CodeBehind تولید میشه ،در اینصورت مقدار مبلغ ثابت هست و نمیشه اونو تغییر داد ازطرفی هم فرم با متد پست به صفحه بانک ارجاع میشه .حتی از Postbackurl هم استفاده کنیم باز نمیشه مقدار مبلغ رو با توجه به ورودی کاربر در امضا شرکت داد و سپس در دیتابیس ذخیره کرد و در نهایت به سایت بانک ارجاع کرد
دوستان اگه کسی میدونه کمک کنه.باتشکر فراوان.

jaykob
چهارشنبه 31 فروردین 1390, 11:30 صبح
سلام.ازدوستان که ایکار رو کردن یا در حال انجام هستن.میشه خواهش کنم بفرمایند اگر مقدار پرداخت توسط کاربر و با تایپ در TextBox مشخص بشه چطور میشه اطلاعات مربوط به امضا رو اول در دیتابیس ذخیره کرد و بعد به صفحه پرداخت بانک ارجاع کرد.مشکل من تو اینه که چون امضا تو قسمت CodeBehind تولید میشه ،در اینصورت مقدار مبلغ ثابت هست و نمیشه اونو تغییر داد ازطرفی هم فرم با متد پست به صفحه بانک ارجاع میشه .حتی از Postbackurl هم استفاده کنیم باز نمیشه مقدار مبلغ رو با توجه به ورودی کاربر در امضا شرکت داد و سپس در دیتابیس ذخیره کرد و در نهایت به سایت بانک ارجاع کرد
دوستان اگه کسی میدونه کمک کنه.باتشکر فراوان.

دوست عزیز شما تا کجا پیش رفتید من کلا مبحث این بانک ملی واسم جا نیوفتاده شما اگر می شه از اول کارهایی کردید رو واسه ما هم بگید تا با هم فکری هم به اتمامش برسونیم .

ممنون

naeeme
چهارشنبه 31 فروردین 1390, 12:19 عصر
سلام.ازدوستان که ایکار رو کردن یا در حال انجام هستن.میشه خواهش کنم بفرمایند اگر مقدار پرداخت توسط کاربر و با تایپ در TextBox مشخص بشه چطور میشه اطلاعات مربوط به امضا رو اول در دیتابیس ذخیره کرد و بعد به صفحه پرداخت بانک ارجاع کرد.مشکل من تو اینه که چون امضا تو قسمت CodeBehind تولید میشه ،در اینصورت مقدار مبلغ ثابت هست و نمیشه اونو تغییر داد ازطرفی هم فرم با متد پست به صفحه بانک ارجاع میشه .حتی از Postbackurl هم استفاده کنیم باز نمیشه مقدار مبلغ رو با توجه به ورودی کاربر در امضا شرکت داد و سپس در دیتابیس ذخیره کرد و در نهایت به سایت بانک ارجاع کرد
دوستان اگه کسی میدونه کمک کنه.باتشکر فراوان.
شما در هر صورت مجبوری که یک صفحه دوم داشته باشی و نمیتونی مستقیما از این صفحه کاربر رو به سایت بانک هدایت کنی. در این صفحه مبلغ رو در دیتابیس ذخیره کن و در pageLoade صفحه بعد، امضا رو ایجاد کن و با کمک Hiden fildها اون رو در صفحه ذخیره و کاربر رو با یه دکمه که باید حتما کلیک کنه به بانک بفرست.
در تمامی بانکهایی که از POST استفاده میکنن، این روش رو باید استفاده کنی
برای نمونه میتونی به سایت رجا یا سایت سازمان سنجش بری و ببینی که دارن چی کار میکنن. اونها هم اول مبلغ رو محاسبه میکنن و در دیتابیس ذخیره میکنن. بعد کاربر رو به یه صفحه می فرستن که فقط درش یه دکمه تایید هست. در اون صفحه مثلا تایید نهایی رو از کاربر دریافت میکنن اما در واقع دارن کاربر رو وادار میکنن که با متد POST به سایت دروازه پرداخت بره.

HamidNch
چهارشنبه 31 فروردین 1390, 14:39 عصر
دوست عزیر jaykob (http://barnamenevis.org/member.php?133240-jaykob) به این آدرس یکسر بزن:
http://barnamenevis.org/showthread.php?238297-مشکل-در-اتصال-به-درگاه-پرداخت-آنلاین-بانک-ملی-با-ASP.Net/page1 (http://barnamenevis.org/showthread.php?238297-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%AF%D8%B1%DA%AF%D8%A7%D9%87-%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA-%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86-%D8%A8%D8%A7%D9%86%DA%A9-%D9%85%D9%84%DB%8C-%D8%A8%D8%A7-ASP.Net/page1)

raziee
چهارشنبه 31 فروردین 1390, 20:53 عصر
من با دامون ارتباط برقرار کردم.
کد های زیر رو برای نمونه به من دادند.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Net.Security;
using System.Collections;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using System.Security.Cryptography;

namespace ResiptPage
{
public partial class ChechSSL : System.Web.UI.Page
{



protected void Page_Load(object sender, EventArgs e)
{

}
private string createfpHash(string signacher)
{
string key = "eoXaEm2LUnz2OiyQ";
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

byte[] keyByte = encoding.GetBytes(key);

HMACMD5 hmacmd5 = new HMACMD5(keyByte);

byte[] messageBytes = encoding.GetBytes(signacher);

byte[] hashmessage = hmacmd5.ComputeHash(messageBytes);

return signacher = ByteToString(hashmessage);



}
private string ByteToString(byte[] buff)
{
string sbinary = "";

for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); // hex format
}
return (sbinary);
}


protected void Button2_Click(object sender, EventArgs e)
{
using (var client = new WebClient())
{
var datatopost = Encoding.Default.GetBytes(""); //encoding.default.getbytes("param1=value1&param2=value2");
string emza = createfpHash("737218180013^577^1265011576^1^Rial");
var result = client.UploadData
(@"https://Damoon.bsi.ir/DamoonVerificationController?x_description=damoon test&x_login=737218180013&x_fp_sequence=577&x_fp_timestamp=1265011576&x_amount=1&x_currency_code=Rial&x_fp_hash=" +
emza, "post", datatopost);
// do something with the result
string dd = Encoding.ASCII.GetString(result);
Response.Write("<Div>");

Response.Write(dd.Remove(dd.IndexOf("<")));

Response.Write("</Div>");
string[] arrayofdata = dd.Remove(dd.IndexOf("<")).Split(new char[2] { '&','=' });
foreach (string ssss in arrayofdata)
{
Response.Write(ssss);
Response.Write("</br>");
}
}
}
}

rana-writes
سه شنبه 20 تیر 1391, 22:45 عصر
سلام آقاي رضيئي
من با همين كدها مشكل دارم
توي بخش Verification اين كدها رو دادن و اصلا نميدونم كجا و چطوري پياده سازيش كنم
ميشه راهنماييم كنين؟

raziee
چهارشنبه 21 تیر 1391, 00:13 صبح
سلام آقاي رضيئي
من با همين كدها مشكل دارم
توي بخش Verification اين كدها رو دادن و اصلا نميدونم كجا و چطوري پياده سازيش كنم
ميشه راهنماييم كنين؟

بعد از اینکه کاربر از طرف بانک به شما فرستاده میشه، یکسری کد که مشخص کننده ی "پرداخت شده"،"پرداخت نشده" و "حالت انتظار" دریافت خواهید کرد.
اگر پاسخ "پرداخت نشده" رو دریافت کردید که هیچ.
اگه پاسخ "پرداخت شده" رو دریافت کردید هم مشکلی نیست ، یک درخواست برای تائید پرداخت توسط کاربر به بانک ارسال میکنید و پاسخ مربوطه رو میگیرد.
مشکل زمانی پیش میاد که "حالت انتظار" یا "عدم پاسخ" رو بگیرید. که ممکنه کاربر پرداخت کرده باشه اما به هر دلیلی بانک پاسخ "پرداخت شد" رو به شما ارسال نکنه.
در این حالت هم باز یک درخواست به بانک میفرستید اگه پاسخ های "پرداخت شد" و یا "پرداخت نشد" رو گرفتید که هیچ. اما اگه هنوز سرور بانک پاسخگوی شما نبود(این اتفاق ممکنه بیفته) شما یا باید به صورت دستی و توسط کاربر درخواست تائید رو مجددا ارسال کنید و یا برنامه ای بنویسید که به صورت خودکار پرداخت های بدون وضعیت رو در بازه های زمانی بررسی کنه تا به یه پاسخ برسه(البته یه زمانی هم باید بگذارید که دیگه بررسی نکنه و خودتون پیگیری کنید)

شما زمانی که برای اولین بار اطلاعات رو آماده میکنید و به سمت بانک میفرستید(برای پرداخت) اطلاعات رو در جایی ذخیره کنید(مثلا امضاء،timeStamp،مبلغ و ....)
بعد از دریافت میتونید از طریق همین اطلاعات ذخیره شده درخواست تائید رو به سمت بانک بفرستید.


using (var webClient = new WebClient())
{
webClient.Encoding = UnicodeEncoding.UTF8;
webClient.Headers["Content-type"] = "application/x-www-form-urlencoded";

string bankResponse = webClient.UploadString("https://Damoon.bankmelli-iran.com/DamoonVerificationController?" + postData, "POST", postData);
bankResponse = Regex.Replace(bankResponse, @"\<(.|\r|\n)*\>", "").Trim();
var paramsBack = HttpUtility.ParseQueryString(bankResponse);

foreach (var x in paramsBack.Keys)
{
// گرفتن و بررسی پارامتر ها
}
}
که در اینجا postData اطلاعاتیست که ما قبلا بدست آوردیم و ذخیره کردیم.
متد های لازم:
private string GenerateFingerprint(string transactionKey, string login, string sequence, string timeStamp, int amount, string cureCode)
{
var key = string.Format("{0}^{1}^{2}^{3}^{4}", login, sequence, timeStamp, amount, cureCode);
var result = EncryptHMAC(transactionKey, key);
return result;
}

private string EncryptHMAC(string key, string value)
{
byte[] hmacKey = new ASCIIEncoding().GetBytes(key);
byte[] hmacData = new ASCIIEncoding().GetBytes(value);

HMACMD5 myHmacMD5 = new HMACMD5(hmacKey);

byte[] hmacHash = myHmacMD5.ComputeHash(hmacData);

string fingerprint = "";
for (int i = 0; i < hmacHash.Length; i++)
{
fingerprint += hmacHash[i].ToString("x").PadLeft(2, '0');
}
return fingerprint;
}

private string GenerateTimeStamp()
{
return ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString();
}

rana-writes
چهارشنبه 21 تیر 1391, 23:58 عصر
سلام
اول يه سوال ميشه اين كدها رو توي لوكال هم تست كرد؟
من اين كدها رو نوشتم
var webClient = new System.Net.WebClient();

string PostData = "x_description=Sample Transaction&x_login=TestMer70&x_fp_sequence=181&x_fp_timestamp=1342034110&x_amount=1000&x_currency_code=Rial&x_fp_hash=ecef36520da574a8a0b3c9dfb314660b";//x_description=value&x_login=value&x_fp_sequence=value&x_fp_timestamp=value&x_amount=value&x_currency_code=value&x_fp_hash=value";

webClient.Encoding = System.Text.UnicodeEncoding.UTF8;
webClient.Headers["Content-type"] = "application/x-www-form-urlencoded";

string bankResponse = webClient.UploadString("https://Damoon.bankmelli-iran.com/DamoonVerificationController?" + PostData, "POST", PostData);

bankResponse = System.Text.RegularExpressions.Regex.Replace(bankR esponse, @"\<(.|\r|\n)*\>", "").Trim();

string nx_trans_id = HttpUtility.ParseQueryString(bankResponse).Get("x_trans_id");


PostData رو هم دستي ست ميكنم
وقتي ميرسم به اين خط از كد
string bankResponse = webClient.UploadString("https://Damoon.bankmelli-iran.com/DamoonVerificationController?" + PostData, "POST", PostData
و مقدار bankResponse رو توي اجراي دستي تست ميكنم، تو بخش HTML Edtior صفحه بانك مياد و ميگه كه مشكلي در اجراي درخواست پيش اومده
اين مشكل از كجاست؟

دوباره كه امتحان كردم، مقدار nx_trans_id رو Not Available ميزنه
بقيه مقادير ديگه رو هم مياره.
اين يعني كارم درسته و حالا بايد اون متغير x_response_Code رو مديريت كنم؟
يا اشتباهه؟

ممنون از راهنماييتون

raziee
پنج شنبه 22 تیر 1391, 16:57 عصر
زمانی که داریم از اکانت آزمایشی استفاده میکنیم اطلاعات صحیحی نداریم.
اکانت های آزمایش فقط برای Verify کردن مقادیر ارسالی است.

rana-writes
پنج شنبه 22 تیر 1391, 17:03 عصر
پس با اين حساب يعني كارم درست بوده و ادامه ي همين رو انجام بدم و با توجه به پارامترهايي كه از بانك ميگيرم پيامهاي تاييد يا خطا رو بفرستم درسته؟

يعني اگه اين كارها رو انجام بدم تموم ميشه؟

string x_trans_id = HttpUtility.ParseQueryString(bankResponse).Get("x_trans_id");

string x_response_code = HttpUtility.ParseQueryString(bankResponse).Get("x_response_code");

int TransId = Convert.ToInt32(x_trans_id);
int ResponsCode = Convert.ToInt32(x_response_code);

if ((TransId >= 0) && (ResponsCode == 1))
{
Label1.Text = "پرداخت با موفقيت انجام شد";
//ثبت اطلاعات پرداخت
}
if (ResponsCode == 2)
Label1.Text = "پرداخت لغو شده است ";

if (ResponsCode == 3)
Label1.Text = "خطا در پرداخت";

البته فكر كنم بايد بررسيها رو كامل تر انجام بدم درسته؟