PHP替换Javascript表单自动提交和重定向

时间:2012-07-16 16:00:14

标签: php post curl payment-gateway

我正在使用第三方提供商进行信用卡付款,需要通过表单发布数据,但我传递的数据来自数据库而非来自填写表单的用户。

目前,我通过使用JavaScript自动提交的页面来解决这个问题,但是,虽然这有效,但它看起来并不专业。有没有办法让PHP发布到一个页面,然后在浏览器中加载?

<body onload="document.form1.submit()">
<form method="post" action="https://payment.provider.com/Servlet" id="form1" name="form1" target="_top">
    <input type="hidden" name="TRANSACTION_ID" value="<?php echo $transid; ?>" />
    <input type="hidden" name="AMOUNT" value="<?php echo $amount; ?>" />
    <input type="hidden" name="TERMINAL_ID" value="T04_000000000005" />
    <input type="submit" value="Click if not redirected" name="submitButton" />
</form>
</body>

我知道cURL当然可以发布数据但是它需要响应。提交表单时,数据会发布到页面,但该页面会在浏览器中加载。发布数据后,需要将用户带到第三方提供商页面(使用发布的值,因此我不能简单地进行重定向)。

1 个答案:

答案 0 :(得分:0)

是的,我找到了解决方法。

在我发现这个解决方案的过程中,我也遇到了一个新发现。如果您使用计时器打开新页面,Chrome会阻止该页面。如果您使用按钮打开新页面,则Chrome不会阻止它。

以下是我提出的解决方案:

/** This is the script that will redraw current screen and submit to bank. */
echo '<script>'."\n" ;
echo 'function serverNotifySelected()'."\n" ;
echo '{'."\n" ;
echo '    window.open(\'\', \'BankPaymentScreen\');'."\n" ;
echo '    document.forms[\'bank_form\'].submit();'."\n" ;
echo '    document.forms[\'server_responder\'].submit();'."\n" ;
echo '}'."\n" ;
echo '</script>'."\n" ;

/** This form will be opened in a new window called BankPaymentScreen. */
echo '<form action="https://www.sandbox.bank.com/cgi-bin/webscr" name="bank_form" method="post" target="BankPaymentScreen">'."\n" ;
echo '<input type="hidden" name="cmd" value="_s-xclick">'."\n" ;
echo '<input type="hidden" name="custom" value="'.$transaction_start.'">'."\n" ;
echo '<input type="hidden" name="hosted_button_id" value="'.$single_product->hosted_button_id.'">'."\n" ;
echo '<table>'."\n" ;
echo '    <tr>'."\n";
echo '        <td><input type="hidden" name="'.$single_product->hide_name_a.'" value="'.$single_product->hide_value_a.'">Local</td>'."\n" ;
echo '    </tr>'."\n" ;
echo '    <tr>'."\n" ;
echo '        <td>'."\n" ;
echo '        <input type="hidden" name="'.$single_product->hide_name_b.'" value="'.$single_product->hide_value_b.'" />'.$single_product->short_desc.' $'.$adj_price.' USD'."\n" ;
echo '        </td>'."\n" ;
echo '    </tr>'."\n" ;
echo '</table>'."\n" ;
echo '<input type="hidden" name="currency_code" value="USD">'."\n" ;
echo '</form>'."\n" ;

/** This form will redraw the current page for approval. */
echo '<form action="ProductApprove.php" name="server_responder" method="post" target="_top">'."\n" ;
echo '<input type="hidden" name="trans" value="'.$transaction_start.'">'."\n" ;
echo '<input type="hidden" name="prod_id" value="'.$this->product_id.'">'."\n" ;
echo '</form>'."\n" ;

/** No form here just an input and a button.  onClick will handle all the forms */
echo '<input type="image" src="https://www.sandbox.bank.com/en_US/i/btn/btn_purchaseimmediateCC_LG.gif" border="0" alt="This Bank - The safer, easier way to pay!" onclick="serverNotifySelected()">'."\n" ;
echo '<img alt="" border="0" src="https://www.sandbox.bank.com/en_US/i/scr/pixel.gif" width="1" height="1">'."\n" ;

以上代码适用于页面上的一个按钮。会发生什么:按下按钮,当前页面从[产品到购买]变为[预批准]并打开一个新页面,获得焦点,然后传递给付款服务提供商。

这样,当用户完成支付提供商,并且用户只关闭支付提供商的窗口,并且不使用[返回您的网站]按钮时,您的网站已准备好并等待预先 - 批准屏幕!