majid_darab
جمعه 31 تیر 1390, 01:18 صبح
با سلام و درود خدمت دوستان محترم :
مدتی ست که دارم روی دروازه پرداخت بانک سامان کار می کنم و می خواستم در مورد چنه نکته از دوستان راهنمایی بگیرم.
(لازم به ذکر است که هنوز هیچ قراردادی فی مابین منعقد نشده است و دارم local زمینه ی لازم پس از عقد قرارداد رو آماده می کنم)
مورد اول در مورد verify کردن می باشد ...
خوب پس از افزودن وب سرویس مورد نظر به پروژه با آدرس زیر :
https://acquirer.sb24.com/ref-payment/ws/ReferencePayment?WSDL
و پس از چک شدن آدرس بالا و ذخیره وب سرویس یک سری interface و class از طریق آن شناسایی گردید.
سوال اول :
به منظور verify کردن از کدام کلاس باید استفاده کرد ؟
پس از import کردن وب سرویس مورد نظر با using من سعی کردم یک نمونه از کلاس زیر بسازم و متد verifyTransaction رو فراخوانی کنم:
PaymentIFClient svc = new PaymentIFClient();
آیا از کلاس درست استفاده کرده ام؟
به منظور تست آن از طریق سیستم local پارامترهای لازم رو به بانک پاس دادم و در بازگست به سایت خودم در خط بالا به ارور زیر خوردم :
Could not find default endpoint element that references contract 'SB24Service.PaymentIF' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element
سوال دوم :
پس از اینکه مشکل بالا حل گردید ، سوال بعد اینه که چرا چند تا متد verify در کلاس مورد نظر گنجانده شده است؟
سوال سوم :
در یکی از قسمت های فروم مشکلی در رابطه با آی پی سایت طرف قرارداد مطرح شده بود ...
با تعریف شدن این آی پی از طرف بانک چگونه می توان سایت رو روی local هم بررسی کرد ؟
سوال چهارم :
آیا مرجع کاملی در مورد خطاهای بانک سامان در دات نت وجود دارد ؟
منظورم اینه که من در pdf موجود در شرکت پرداخت الکترونیک هیچ نمونه کدی در این رابطه ندیدم - آیا پس از عقد قرارداد pdf دیگری به طرف داده می شود؟
راستش بیشتر کدهای مورد نظر در این باره را نوشته ام ...
ولی در میان کدهای php موجود برای این دروازه پرداخت منطق های مختلفی رو در مورد این خطاها دیدم و لذا یه ریزه در مورد آنها مردد هستم
آیا کدهای زیر از نظر دوستان تایید می شوند ؟
if (state.Equals("OK"))
{
double svc_result = svc.verifyTransaction(refNum, merchantID);
if ((int)svc_result > 0)
{
if ((int)svc_result == orderValue)
{
paymentResponse.Successful = true;
paymentResponse.ResponseCode = 0;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با موفّقیّت انجام شد.";
paymentResponse.Transaction_ID = refNum;
}
else if ((int)svc_result < orderValue)
{
paymentResponse.Successful = true;
paymentResponse.ResponseCode = 1;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با موفّقیّت انجام شد." + "<br />" + "امّا بنا به دلیلی مبلغ واریزی شما کمتر از مبلغ فاکتور می باشد." + "<br />" + "لطفاً با مدیر وب سایت تماس حاصل فرمایید.";
paymentResponse.Transaction_ID = refNum;
}
else
{
paymentResponse.Successful = true;
paymentResponse.ResponseCode = 2;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با موفّقیّت انجام شد.";
paymentResponse.Transaction_ID = refNum;
}
}
else
{
paymentResponse.Successful = false;
paymentResponse.ResponseCode = (int)svc_result;
paymentResponse.ResponseMessage_en = string.Empty;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با مشکل روبرو شد." + "<br />" + GetVerifyTransactionErrorDescription(paymentRespon se.ResponseCode);
paymentResponse.Transaction_ID = refNum;
}
}
else
{
paymentResponse.Successful = false;
paymentResponse.ResponseCode = -255;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) انجام نشد." + "<br />" + GetStateErrorDescription(state);
paymentResponse.Transaction_ID = refNum; //ظاهراً در اینجا این مقدار وجود نخواهد داشت
}
return paymentResponse;
و اما دو متد مورد نظر :
private string GetVerifyTransactionErrorDescription(int Message_ID)
{
string meaning = string.Empty;
switch (Message_ID)
{
case -1:
{
meaning = "خطای داخلی شبکه مالی.";
break;
}
case -2:
{
meaning = "سپردهها برابر نیستند.";
break;
}
case -3:
{
meaning = "ورودیها حاوی کارکترهای غیرمجاز میباشند.";
break;
}
case -4:
{
meaning = "کد پذیرنده و یا کلمه عبور آن اشتباه است.";
break;
}
case -5:
{
meaning = "Database Exception.";
break;
}
case -6:
{
meaning = "سند قبلاً برگشت کامل یافته است.";
break;
}
case -7:
{
meaning = "رسید دیجیتالی تهی است.";
break;
}
case -8:
{
meaning = "طول ورودی ها بیشتر از حد مجاز است.";
break;
}
case -9:
{
meaning = "وجود کاراکترهای غیرمجاز در مبلغ برگشتی.";
break;
}
case -10:
{
meaning = "رسید دیجیتالی به صورت Base64 نیست (حاوی کارکترهای غیرمجاز است).";
break;
}
case -11:
{
meaning = "طول ورودی ها کمتر از حد مجاز است.";
break;
}
case -12:
{
meaning = "مبلغ برگشتی منفی است.";
break;
}
case -13:
{
meaning = "مبلغ برگشتی برای برگشت جزئی بیش از مبلغ برگشت نخورده رسیده دیجیتالی است.";
break;
}
case -14:
{
meaning = "چنین تراکنشی تعریف نشده است.";
break;
}
case -15:
{
meaning = "مبلغ برگشتی بصورت اعشاری داده شده است.";
break;
}
case -16:
{
meaning = "خطای داخلی سیستم.";
break;
}
case -17:
{
meaning = "برگشت زدن جزئی تراکنشی که با کارتی غیر از بانک سامان انجام شده است.";
break;
}
case -18:
{
meaning = "IP Address پذیرنده نامعتبر است.";
break;
}
}
return meaning;
}
private string GetStateErrorDescription(string State_Message)
{
string meaning = string.Empty;
switch (State_Message)
{
case "Canceled By User":
{
meaning = "تراکنش توسط خریدار کنسل شده است.";
break;
}
case "Invalid Amount":
{
meaning = "مبلغ سند برگشتی ، از مبلغ تراکنش اصلی بیشتر است.";
break;
}
case "Invalid Transaction":
{
meaning = "درخواست برگشت یک تراکنش رسیده است ، در حالی که تراکنش اصلی پیدا نمی شود.";
break;
}
case "Invalid Card Number":
{
meaning = "شماره کارت اشتباه است.";
break;
}
case "Expired Card Pick Up":
{
meaning = "از تاریخ انقضای کارت گذشته است و کارت دیگر معتبر نیست.";
break;
}
case "Allowable PIN Tries Exceeded Pick Up":
{
meaning = "رمز کارت (PIN) 3 مرتبه اشتباه وارد شده است ، در نتیجه کارت غیر فعّال خواهد شد.";
break;
}
case "Incorrect PIN":
{
meaning = "خریدار رمز کارت (PIN) را اشتباه وارد کرده است.";
break;
}
case "Exceeds Withdrawal Amount Limit":
{
meaning = "مبلغ بیش از سقف برداشت می باشد.";
break;
}
case "Transaction Cannot Be Completed":
{
meaning = "تراکنش Authorize شده است ( شماره PIN و PAN درست هستند) ولی امکان سند خوردن وجود ندارد.";
break;
}
case "Response Received Too Late":
{
meaning = "تراکنش در شبکه بانکی Timeout خورده است.";
break;
}
case "Suspected Fraud Pick Up":
{
meaning = "خریدار یا فیلد CVV2 و یا فیلد ExpDate را اشتباه زده است. ( یا اصلا وارد نکرده است)";
break;
}
case "No Sufficient Funds":
{
meaning = "موجودی به اندازی کافی در حساب وجود ندارد.";
break;
}
case "Issuer Down Slm":
{
meaning = "سیستم کارت بانک صادر کننده در وضعیّت عملیّاتی نیست.";
break;
}
case "TME Error":
{
meaning = "کلیه خطاهای دیگر بانکی باعث ایجاد چنین خطایی می گردد.";
break;
}
}
return meaning;
}
سوال پنجم :
بانک سامان در هر تراکنش چند درصد و از حساب کی کم می کند ؟
آیا در دیتابیس مبلغ مورد نظر را با این کسر در نظر می گیرند و یا اینکه مبلغ اولیه ی تراکنش باید در دیتابیس درج گردد ؟
با تشکر از توجه شما دوستان عزیز و گرامی
مجید داراب
مدتی ست که دارم روی دروازه پرداخت بانک سامان کار می کنم و می خواستم در مورد چنه نکته از دوستان راهنمایی بگیرم.
(لازم به ذکر است که هنوز هیچ قراردادی فی مابین منعقد نشده است و دارم local زمینه ی لازم پس از عقد قرارداد رو آماده می کنم)
مورد اول در مورد verify کردن می باشد ...
خوب پس از افزودن وب سرویس مورد نظر به پروژه با آدرس زیر :
https://acquirer.sb24.com/ref-payment/ws/ReferencePayment?WSDL
و پس از چک شدن آدرس بالا و ذخیره وب سرویس یک سری interface و class از طریق آن شناسایی گردید.
سوال اول :
به منظور verify کردن از کدام کلاس باید استفاده کرد ؟
پس از import کردن وب سرویس مورد نظر با using من سعی کردم یک نمونه از کلاس زیر بسازم و متد verifyTransaction رو فراخوانی کنم:
PaymentIFClient svc = new PaymentIFClient();
آیا از کلاس درست استفاده کرده ام؟
به منظور تست آن از طریق سیستم local پارامترهای لازم رو به بانک پاس دادم و در بازگست به سایت خودم در خط بالا به ارور زیر خوردم :
Could not find default endpoint element that references contract 'SB24Service.PaymentIF' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element
سوال دوم :
پس از اینکه مشکل بالا حل گردید ، سوال بعد اینه که چرا چند تا متد verify در کلاس مورد نظر گنجانده شده است؟
سوال سوم :
در یکی از قسمت های فروم مشکلی در رابطه با آی پی سایت طرف قرارداد مطرح شده بود ...
با تعریف شدن این آی پی از طرف بانک چگونه می توان سایت رو روی local هم بررسی کرد ؟
سوال چهارم :
آیا مرجع کاملی در مورد خطاهای بانک سامان در دات نت وجود دارد ؟
منظورم اینه که من در pdf موجود در شرکت پرداخت الکترونیک هیچ نمونه کدی در این رابطه ندیدم - آیا پس از عقد قرارداد pdf دیگری به طرف داده می شود؟
راستش بیشتر کدهای مورد نظر در این باره را نوشته ام ...
ولی در میان کدهای php موجود برای این دروازه پرداخت منطق های مختلفی رو در مورد این خطاها دیدم و لذا یه ریزه در مورد آنها مردد هستم
آیا کدهای زیر از نظر دوستان تایید می شوند ؟
if (state.Equals("OK"))
{
double svc_result = svc.verifyTransaction(refNum, merchantID);
if ((int)svc_result > 0)
{
if ((int)svc_result == orderValue)
{
paymentResponse.Successful = true;
paymentResponse.ResponseCode = 0;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با موفّقیّت انجام شد.";
paymentResponse.Transaction_ID = refNum;
}
else if ((int)svc_result < orderValue)
{
paymentResponse.Successful = true;
paymentResponse.ResponseCode = 1;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با موفّقیّت انجام شد." + "<br />" + "امّا بنا به دلیلی مبلغ واریزی شما کمتر از مبلغ فاکتور می باشد." + "<br />" + "لطفاً با مدیر وب سایت تماس حاصل فرمایید.";
paymentResponse.Transaction_ID = refNum;
}
else
{
paymentResponse.Successful = true;
paymentResponse.ResponseCode = 2;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با موفّقیّت انجام شد.";
paymentResponse.Transaction_ID = refNum;
}
}
else
{
paymentResponse.Successful = false;
paymentResponse.ResponseCode = (int)svc_result;
paymentResponse.ResponseMessage_en = string.Empty;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) با مشکل روبرو شد." + "<br />" + GetVerifyTransactionErrorDescription(paymentRespon se.ResponseCode);
paymentResponse.Transaction_ID = refNum;
}
}
else
{
paymentResponse.Successful = false;
paymentResponse.ResponseCode = -255;
paymentResponse.ResponseMessage_en = state;
paymentResponse.ResponseMessage_fa = "تراکنش (پرداخت) انجام نشد." + "<br />" + GetStateErrorDescription(state);
paymentResponse.Transaction_ID = refNum; //ظاهراً در اینجا این مقدار وجود نخواهد داشت
}
return paymentResponse;
و اما دو متد مورد نظر :
private string GetVerifyTransactionErrorDescription(int Message_ID)
{
string meaning = string.Empty;
switch (Message_ID)
{
case -1:
{
meaning = "خطای داخلی شبکه مالی.";
break;
}
case -2:
{
meaning = "سپردهها برابر نیستند.";
break;
}
case -3:
{
meaning = "ورودیها حاوی کارکترهای غیرمجاز میباشند.";
break;
}
case -4:
{
meaning = "کد پذیرنده و یا کلمه عبور آن اشتباه است.";
break;
}
case -5:
{
meaning = "Database Exception.";
break;
}
case -6:
{
meaning = "سند قبلاً برگشت کامل یافته است.";
break;
}
case -7:
{
meaning = "رسید دیجیتالی تهی است.";
break;
}
case -8:
{
meaning = "طول ورودی ها بیشتر از حد مجاز است.";
break;
}
case -9:
{
meaning = "وجود کاراکترهای غیرمجاز در مبلغ برگشتی.";
break;
}
case -10:
{
meaning = "رسید دیجیتالی به صورت Base64 نیست (حاوی کارکترهای غیرمجاز است).";
break;
}
case -11:
{
meaning = "طول ورودی ها کمتر از حد مجاز است.";
break;
}
case -12:
{
meaning = "مبلغ برگشتی منفی است.";
break;
}
case -13:
{
meaning = "مبلغ برگشتی برای برگشت جزئی بیش از مبلغ برگشت نخورده رسیده دیجیتالی است.";
break;
}
case -14:
{
meaning = "چنین تراکنشی تعریف نشده است.";
break;
}
case -15:
{
meaning = "مبلغ برگشتی بصورت اعشاری داده شده است.";
break;
}
case -16:
{
meaning = "خطای داخلی سیستم.";
break;
}
case -17:
{
meaning = "برگشت زدن جزئی تراکنشی که با کارتی غیر از بانک سامان انجام شده است.";
break;
}
case -18:
{
meaning = "IP Address پذیرنده نامعتبر است.";
break;
}
}
return meaning;
}
private string GetStateErrorDescription(string State_Message)
{
string meaning = string.Empty;
switch (State_Message)
{
case "Canceled By User":
{
meaning = "تراکنش توسط خریدار کنسل شده است.";
break;
}
case "Invalid Amount":
{
meaning = "مبلغ سند برگشتی ، از مبلغ تراکنش اصلی بیشتر است.";
break;
}
case "Invalid Transaction":
{
meaning = "درخواست برگشت یک تراکنش رسیده است ، در حالی که تراکنش اصلی پیدا نمی شود.";
break;
}
case "Invalid Card Number":
{
meaning = "شماره کارت اشتباه است.";
break;
}
case "Expired Card Pick Up":
{
meaning = "از تاریخ انقضای کارت گذشته است و کارت دیگر معتبر نیست.";
break;
}
case "Allowable PIN Tries Exceeded Pick Up":
{
meaning = "رمز کارت (PIN) 3 مرتبه اشتباه وارد شده است ، در نتیجه کارت غیر فعّال خواهد شد.";
break;
}
case "Incorrect PIN":
{
meaning = "خریدار رمز کارت (PIN) را اشتباه وارد کرده است.";
break;
}
case "Exceeds Withdrawal Amount Limit":
{
meaning = "مبلغ بیش از سقف برداشت می باشد.";
break;
}
case "Transaction Cannot Be Completed":
{
meaning = "تراکنش Authorize شده است ( شماره PIN و PAN درست هستند) ولی امکان سند خوردن وجود ندارد.";
break;
}
case "Response Received Too Late":
{
meaning = "تراکنش در شبکه بانکی Timeout خورده است.";
break;
}
case "Suspected Fraud Pick Up":
{
meaning = "خریدار یا فیلد CVV2 و یا فیلد ExpDate را اشتباه زده است. ( یا اصلا وارد نکرده است)";
break;
}
case "No Sufficient Funds":
{
meaning = "موجودی به اندازی کافی در حساب وجود ندارد.";
break;
}
case "Issuer Down Slm":
{
meaning = "سیستم کارت بانک صادر کننده در وضعیّت عملیّاتی نیست.";
break;
}
case "TME Error":
{
meaning = "کلیه خطاهای دیگر بانکی باعث ایجاد چنین خطایی می گردد.";
break;
}
}
return meaning;
}
سوال پنجم :
بانک سامان در هر تراکنش چند درصد و از حساب کی کم می کند ؟
آیا در دیتابیس مبلغ مورد نظر را با این کسر در نظر می گیرند و یا اینکه مبلغ اولیه ی تراکنش باید در دیتابیس درج گردد ؟
با تشکر از توجه شما دوستان عزیز و گرامی
مجید داراب