2012-07-16 104 views
0

我正在使用第三方提供商接受信用卡付款,要求通过表单发布数据,但是我传递的数据来自数据库,而不是来自用户填写表格。PHP替换为Javascript表单自动提交和重定向

目前,我通过使用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当然可以发布数据,但它期望得到回应。提交表单时,数据会发布到页面,但该页面随后会加载到浏览器中。一旦数据发布,用户需要被带到第三方提供商页面(使用发布的值,所以我不能简单地做一个重定向)。

+0

你为什么不能直接发帖?只需在您的表单中包含这些隐藏字段... – ManseUK 2012-07-16 16:03:02

+0

我明白您的要求的方式,我会看到一个页面假装来自付款处理器,但实际上来自您的网站。这肯定会吓到我...... – fvu 2012-07-16 16:03:04

+0

如果你看看其他通过第三方进行支付处理的网站(即几乎所有人,除了真正的大网站),你会发现他们都以这种方式工作 - 因为支付卡公司需要它。如果您在您的网站上进行信用卡付款,请确保您采用符合PCI标准的方式进行付款。如果你试图绕过它,当卡公司发现时,你会发现自己失去了你的商家账户。 – Spudley 2012-07-16 16:17:42

回答

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" ; 

上面的代码是对页面上的一个按钮。会发生什么情况是:按下按钮,当前页面从[产品购买]变为[预先批准],并打开新页面,获得焦点并转交给付款提供商。

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