如何在不接收数据时解决致命错误,并在再次加载页面时发送数据条纹?

时间:2017-11-04 21:18:03

标签: stripe-payments

当我通过条纹发送卡片的数据进行购买时,它会显示以下信息:

成功收取50美元!

tok_1BKYfLDi3J7CIS2eVqZVeZqT

但是,当您在发送付款数据时未收到数据时会显示这些错误

  

注意:未定义的索引:第9行的C:\ xampp \ htdocs \ DesignFormStripe \ charge.php中的标记   致命错误:未捕获条纹\错误\卡:无法为C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \ stripe \ lib \ ApiRequestor.php:128中没有活动卡的客户收费API请求' req_W6Qbd7iMVHDsGS'堆栈跟踪:#0 C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \ stripe \ lib \ ApiRequestor.php(102):Stripe \ ApiRequestor :: _ specificAPIError(' {\ n" error&#34 ;:{\ n ...',402,Array,Array,Array)#1 C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \ stripe \ lib \ ApiRequestor.php(309):Stripe \ ApiRequestor - > handleErrorResponse(' {\ n"错误":{\ n ...',402,数组,数组)#2 C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \ stripe \ lib \ ApiRequestor.php(65):Stripe \ ApiRequestor-> _interpretResponse(' {\ n"错误":{\ n ...',402 ,数组)#3 C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \ stripe \ lib \ ApiResource.php(119):Stripe \ ApiRequestor-> request(' post',' / v1 / charges',Array,Array)#4 C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \ stripe \ lib \ ApiResource.php(158):Stripe \ ApiResource :: _ staticRequest(' post& #39;,' / v1 / charges',Array,NULL)C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \#5 C:\ xampp \ htdocs \ DesignFormStripe \ php \ lib \ str stripe \ lib \ ApiRequestor.php在线128

如何解决这些运行错误?

更新我的问题

使用条带文档修复以前的错误,handling errors

代码几乎以下列方式解决:

<?php
  require_once('./config.php');

  $token  = $_POST['token']; // retrieve token POST parameter to charge the card (stripeToken)


  $customer = \Stripe\Customer::create(array(
      'email' => 'customer2@example.com',
      //'email' => $_POST['stripeEmail'],
      'card'  => $token
  ));

try {
  // Use Stripe's library to make requests...

  $charge = \Stripe\Charge::create(array(
      'customer' => $customer->id,
      'amount'   => 500,
      'description' => 'Event charge',
      'currency' => 'usd'
  ));

  echo '<h1>Successfully charged $50!</h1>';
  echo "$token";

} catch(\Stripe\Error\Card $e) {
  // Since it's a decline, \Stripe\Error\Card will be caught
  $body = $e->getJsonBody();
  $err  = $body['error'];

  print('Status is:' . $e->getHttpStatus() . "\n");
  print('Type is:' . $err['type'] . "\n");
  print('Code is:' . $err['code'] . "\n");
  // param is '' in this case
  print('Param is:' . $err['param'] . "\n");
  print('Message is:' . $err['message'] . "\n");
} catch (\Stripe\Error\RateLimit $e) {
  // Too many requests made to the API too quickly
} catch (\Stripe\Error\InvalidRequest $e) {
  // Invalid parameters were supplied to Stripe's API
} catch (\Stripe\Error\Authentication $e) {
  // Authentication with Stripe's API failed
  // (maybe you changed API keys recently)
} catch (\Stripe\Error\ApiConnection $e) {
  // Network communication with Stripe failed
} catch (\Stripe\Error\Base $e) {
  // Display a very generic error to the user, and maybe send
  // yourself an email
} catch (Exception $e) {
  // Something else happened, completely unrelated to Stripe
}
?>

现在,在没有收到数据的情况下打开页面时,它会显示以下消息:

  

状态是:402类型是:card_error代码是:缺少参数是:卡消息是:无法为没有活动卡的客户收费

现在出现了一个新问题 :(

但是当再次加载页面并确认重新提交表单时,它会显示先前错误的相同消息。

我认为显示的错误是因为 Stripe 仅接受仅在收费请求时生成的令牌一次。

但是,在确认表单重新提交时,不会显示这些错误,而是显示自定义错误消息,例如: 付款请求已在进行中。

1 个答案:

答案 0 :(得分:0)

此处的问题是,您的代码需要卡片令牌tok_XXXX出现在$_POST['token']中。似乎有些情况下,在提交表单时您的表单不会发送参数,但您没有抓住它。

因此,$token为空,只是没有发送到Stripe,而且客户是在没有卡的情况下创建的。下一步是向客户收费但由于没有卡,API会返回错误。

您需要更改代码中的两件事以避免这种情况。首先,您应该确保捕获Stripe API所记录的所有错误({3}}。这个想法是你捕获异常然后在你记录结束时的详细错误时显示一个用户友好的错误消息来解决这个问题。

然后,您需要在代码的开头添加一些逻辑,以确保$_POST['token']按预期设置。如果没有,请提前离开并向客户返回错误。

最后,问题通常来自客户端的错误,您可以在不首先成功创建令牌的情况下提交表单。常见问题来自于在创建令牌或在某些浏览器上未正确初始化JS代码之前不禁用表单提交。