使用JavaScript提交PayPal按钮时出现间歇性500错误

时间:2017-04-24 23:16:55

标签: paypal paypal-sandbox drupal-8

我正在测试使用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);
    ...
}

1 个答案:

答案 0 :(得分:0)

回答我自己的问题以防其他人:这是PayPal沙箱问题。

我在PayPal网站上生成了一个等效的按钮表单,在我的代码之外多次将其提交到沙箱,并且出现了类似的间歇性500错误。

然后我将代码中的引用切换为实时PayPal信息,多次运行(未完成交易),并且没有错误。

所以关于沙盒配置的一些东西与实时配置不同并导致这个(可能是内存问题?)。这绝不是一个独特的情况,因此令人沮丧的PayPal并没有记录沙盒的限制。但很高兴看起来可以继续。

编辑:这是PayPal的回复确认。

  

我们发现PayPal Sandbox存在一些问题,这些问题间歇性地导致有效请求因500内部服务器错误而失败。我们的开发人员正在解决此问题,我会在问题完全解决后更新您。

     

请注意,此问题仅影响沙盒环境。没有注意到生产环境。

进一步编辑:从PayPal更新。

  

感谢您耐心等待我们追踪沙盒环境不稳定的根源。

     

PayPal工程师已解决导致频繁发生内部服务器错误的问题。但是,他们表示所有请求都应该转到https://www.sandbox.paypal.com/域。如果您的集成发送到https://sandbox.paypal.com(没有www),那么您可能仍会遇到一些延迟。如果是这种情况,请更新您的集成,以包含www。