我正在测试使用PHP动态创建的基本PayPal按钮表单,并在页面加载后短暂延迟后通过JS提交到沙箱。大约一半的时间它工作正常,大约一半的时间PayPal响应500错误。当我收到错误时,我可以返回浏览器并让它重新提交完全相同的表单,此时,它有时会有效并且有时会出错。
任何想法都将不胜感激。这可能是某种cookie问题吗?我已经向PayPal提交了一张票 - 还没有回复。谢谢!
编辑:这是相关代码。这是一个Drupal 8站点,这是一个使用Form API的自定义模块,用于多步骤表单。调用buildForm()
(然后validateForm()
),然后调用submitForm()
。这种情况下的流程在“步骤3”构建之后开始。客户点击“付款”,并调用submitForm()
。
public function buildForm(array $form, FormStateInterface $form_state) {
...
//'step' 3
...
//'step' 4 is just to redirect to PayPal
elseif ($form_state->get('step') == 4) {
//prints in main form content area
$form['redirecting'] = array(
'#type' => 'html_tag',
'#tag' => 'div',
'#value' => $this->t('Redirecting to PayPal...'),
);
}
...
}
public function submitForm(array &$form, FormStateInterface $form_state) {
...
//called after 'step' 3
//gets id of record just inserted into database
$paypal_invoice = $query->execute()->fetchField();
$paypal_item_name = '[name of item]';
$paypal_amount = $form_state->getValue('amount');
$token = bin2hex(openssl_random_pseudo_bytes(16));
$paypal_html =
'<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top" id="paypal_form">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="______________">
<input type="hidden" name="lc" value="US">
<input type="hidden" name="invoice" value="' . $paypal_invoice . '">
<input type="hidden" name="item_name" value="' . $paypal_item_name . '">
<input type="hidden" name="amount" value="' . $paypal_amount . '">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="no_shipping" value="1">
<input type="hidden" name="rm" value="1">
<input type="hidden" name="return" value="http://__________________">
<input type="hidden" name="cancel_return" value="http://______________?cancel=1&token=' . $token . '">
<input type="hidden" name="currency_code" value="USD">
</form>
<script type="text/javascript">
window.onload = setTimeout(function() {
document.getElementById("paypal_form").submit();
}, 4000);
</script>';
//make sure html tags are evaluated
$rendered_message = \Drupal\Core\Render\Markup::create($paypal_html);
//string will be added to message area of form when 'step' 4 is loaded with buildForm()
drupal_set_message($rendered_message);
$form_state->set(['step'], 4);
...
}
答案 0 :(得分:0)
回答我自己的问题以防其他人:这是PayPal沙箱问题。
我在PayPal网站上生成了一个等效的按钮表单,在我的代码之外多次将其提交到沙箱,并且出现了类似的间歇性500错误。
然后我将代码中的引用切换为实时PayPal信息,多次运行(未完成交易),并且没有错误。
所以关于沙盒配置的一些东西与实时配置不同并导致这个(可能是内存问题?)。这绝不是一个独特的情况,因此令人沮丧的PayPal并没有记录沙盒的限制。但很高兴看起来可以继续。
编辑:这是PayPal的回复确认。
我们发现PayPal Sandbox存在一些问题,这些问题间歇性地导致有效请求因500内部服务器错误而失败。我们的开发人员正在解决此问题,我会在问题完全解决后更新您。
请注意,此问题仅影响沙盒环境。没有注意到生产环境。
进一步编辑:从PayPal更新。
感谢您耐心等待我们追踪沙盒环境不稳定的根源。
PayPal工程师已解决导致频繁发生内部服务器错误的问题。但是,他们表示所有请求都应该转到https://www.sandbox.paypal.com/域。如果您的集成发送到https://sandbox.paypal.com(没有www),那么您可能仍会遇到一些延迟。如果是这种情况,请更新您的集成,以包含www。