PDA

View Full Version : مشکل با نمونه سورس درگاه پرداخت بانک ملت



lovephp
جمعه 02 بهمن 1394, 22:28 عصر
من اسکریپت پرداخت آنلاین بانک ملت رو از یکی دو جا خریدم

اما تو همشون این موردی که میخوام بگم وجود داره

این خلاصه کدی هست که تو صفحه بازگشت از بانک باید اجرا بشه

به ساختارهای شرطی دقت کنید

مثلا تو خط 14 یک بار error رو چک میکنه خوب اگه اروری داشته باشه شرط خط 15 برقرار میشه و وارد بلاک if میشه حالا مشکل اینه که تو این بلاک دوباره چرا همون کد خط 14 اجرا میشه(آبجکت کلاینت که کاری نکرده )

در ضمن اگه شرط خط 15 برقرار باشه صددرصد خط 18 اجرا میشه و از اجرای بقیه اسکریپت خارج میشه و هیچ وقت به متد استعلام وضعیت تراکنش و بقیه چیزا نمیرسه

خواهشا دوستانی که تو این زمینه کار کردن راهنمایی کنن


<?php
$RefId = $_POST['RefId']; //RefId
$ResCode = $_POST['ResCode']; //ResCode
$SaleOrderId = $_POST['SaleOrderId']; //Order Id
$SaleReferenceId = $_POST['SaleReferenceId']; //Transaction

$client = new nusoap_client("https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl");

$result = $client->call("bpVerifyRequest", $parameters, $namespace);

if ($client->fault) {
die();
} else {
$err = $client->getError();
if ($err) {
$err = $client->getError();
if ($err) {
die();
}
$result = $client->call("bpInquiryRequest", $parameters, $namespace);

if ($client->fault) {
die();
} else {
$err = $client->getError();
if ($err) {
$err = $client->getError();
if ($err) {
die();
}
$result = $client->call("bpReversalRequest", $parameters, $namespace);
if ($client->fault) {
die();
} else {
$err = $client->getError();
if ($err) {
die();
} else {
//echo "Reversal Response is :" . $resultStr;
}
}
echo '<h2>Error</h2><pre>' . $err . '</pre>';
die();
} else {
//SETTLE REQUEST
$err = $client->getError();
if ($err) {
die();
}
$result = $client->call("bpSettleRequest", $parameters, $namespace);

if ($client->fault) {
die();
} else {
$err = $client->getError();
if ($err) {
die();
} else {
//Update Table,Save Settle Status
//Note: Successful Settle means that sale is settled.
}
//echo "Settle Response is :" $resultStr;
}
//echo "Inquiry Response is :" . $resultStr;
}
//end display the result
}
//end check for error
//Display the reeor
echo '<h2>Error</h2><pre>' . $err . '</pre>';
die();
} else {
$err = $client->getError();
if ($err) {
die();
}
$result = $client->call("bpSettleRequest", $parameters, $namespace);

if ($client->fault) {
die();
} else {
$err = $client->getError();
if ($err) {
die();
} else {
$query = "UPDATE payment ";
$query .= " SET RefId='{$RefId}',SaleRefId='{$SaleReferenceId}',Re sCode='{$ResCode}' ";
$query .= " WHERE Id='{$SaleOrderId}' ";
$user_set = mysqli_query($connection, $query);
//echo "settle Response is :" . $resultStr;
}
}
}

}


?>
<form id="form1" runat="server">

<fieldset>
<legend>نتیجه پرداخت</legend>

<div class="bankMellatLogo">
<img alt="" src="img/BM_Logo.png"/>
</div>
<?php
if ($ResCode == 0) {
?>
<img src="img/accept.png">
<?php
} else {
?>
<img src="img/notaccept.png">
<?php
}
?>
<table>
<tr>
<td>رسید پرداخت:</td>
<td>
<span><?php echo $RefId; ?></span>
</td>
</tr>
<tr>
<td>کد برگشتی از درگاه:</td>
<td>
<span><?php echo response($ResCode); ?></span>
</td>
</tr>
<tr>
<td>شماره پرداخت:</td>
<td>
<span><?php echo $SaleOrderId; ?></span>
</td>
</tr>
<tr>
<td>شماره مرجع پرداخت:</td>
<td>
<span><?php echo $SaleReferenceId; ?></span>
</td>
</tr>
</table>

</fieldset>
</form>

us1234
جمعه 02 بهمن 1394, 22:39 عصر
این موارد مشکلی در روند اجرا کد ایجاد نمیکند ولی منطق کد خراب است .
این موارد


$err = $client->getError();
if ($err) {
$err = $client->getError();
if ($err) {
die(); }


باید به این شکل شود :


$err = $client->getError();
if ($err) {
die(); }


همچنین استفاده از die برای خطا گزینه مناسبی نیست و در هنگام بروز خطا هیچ هندل مناسبی ندارد و صفحه نتیجه سفید خواهد شد ، بهتر است از بلاک های try , catch استفاده شود.

و در نهایت متد getError وقتی مقدار میگیرد که به هر دلیل نتوان به وب سرویس متصل شد ( مثلا وب سرویس بانک قطع است ... ) پس دیگه متد های بعد از آن اهمیتی ندارد .

lovephp
جمعه 02 بهمن 1394, 22:58 عصر
و در نهایت متد getError وقتی مقدار میگیرد که به هر دلیل نتوان به وب سرویس متصل شد ( مثلا وب سرویس بانک قطع است ... ) پس دیگه متد های بعد از آن اهمیتی ندارد .


ولی طبق مستندات شرکت بهپرداخت ملت گفته اگه به هر دلیلی نتونستی نتیجه متد bpVerifyRequest در زمان انجام تراکنش مطلع بشی از
متد bpInquiryRequest برای استعلام وضعیت تراکنش استفاده بشه
حالا چه موقعیه که متد bpVerifyRequest نتیجه اش نمیاد که اینکارو بکنبم
میشه روند اجرای این کد رو اصلاح کنید

lovephp
شنبه 03 بهمن 1394, 09:49 صبح
دوستانی که با درگاه بانک ملت کار کردن و تجربه دارن لطفا راهنمایی کنن:افسرده: