我正在测试使用PHP动态创建的基本PayPal按钮表单,并在页面加载后短暂延迟后将JS提交给Sandbox。大约有一半的时间工作正常,大约一半的时间贝宝(PayPal(响应500个错误。当我遇到错误时,我可以返回浏览器,让其重新提交完全相同的形式,此时,它有时有时可以起作用,有时会出现错误。
任何想法都将不胜感激。这可能是某种饼干问题吗?我已经提交了贝宝的票 - 尚未回复。谢谢!
编辑:这是相关代码。这是一个Drupal 8站点,它是在自定义模块中使用多个步骤表单的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 = DrupalCoreRenderMarkup::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);
...
}
回答我自己的问题,以防其他人:这是贝宝(Paypal(沙盒问题。
我在PayPal网站上生成了同等按钮表格,在我的代码外无数次提交给沙箱,并获得了类似的间歇性500个错误。
然后,我将代码中的参考转换为实时PayPal信息,多次运行(无需完成交易(,并且没有错误。
因此,关于沙盒配置有一些与实时配置不同的,并引起此(也许是内存问题?(。这一定不能是独特的情况,因此令人沮丧的贝宝(Paypal(不会用沙盒记录限制。但是很高兴继续前进。
编辑:这是PayPal的回应确认。
我们意识到贝宝沙盒中的某些问题,这些问题间歇地导致有效的请求在500内部服务器错误中失败。我们的开发人员正在处理此问题,当问题已完全解决后,我将向您更新。
请注意,此问题仅影响沙箱环境。没有对生产环境的影响。
进一步编辑:paypal的更新。
感谢您的耐心配合
PayPal工程师解决了导致频繁内部服务器错误的问题。但是,他们表示所有请求都应访问https://www.sandbox.paypal.com/域。如果您的集成将发送到https://sandbox.paypal.com(无www(,那么您仍然可能会遇到一些延迟。请更新您的集成,如果是您的情况,请包括www。