奇怪的Laravel / Stripe / Cartalyst错误,其中一个电荷使用相同的Stripe令牌随机运行两次

时间:2018-12-17 11:42:11

标签: android laravel stripe-payments cartalyst

我创建了一个Android移动应用,该应用集成了Stripe以接受卡付款。在我的Android应用程序中,我将一堆参数发送到Laravel API,其中一个参数是Stripe令牌。

10次中有9次,我的服务器将按预期处理。它将使用Stripe-Cartalyst创建一个收费对象并创建一个收费,假设没有抛出异常(例如卡信息不正确或服务器错误),我的api随后将成功处理付款并在其中插入一些内容一个数据库,之后它将返回201 HTTP状态代码给客户端,然后我在Android端处理它。

我遇到的错误(或我做错了的事情)是随机发生的。有时,我的API会从Stripe抛出未捕获的异常,解释令牌(加密的Stripe卡详细信息),只能使用一次。我已经在Android端进行了一些调试,可以验证我在发送令牌的位置仅发出了1个HTTP请求,并在Laravel API上进行了一些登录,并发现了一些奇怪的情况。

我发现的东西 在API上,我将过程的一些关键时刻打印到了日志文件中。

  1. 打印令牌变量。
  2. 进入try块以创建充电对象时。
  3. 如果在Android应用上选择了“发送”(可能是毫无意义的日志)。
  4. 检查一些项目(这是从Android应用程序传递的数组。
  5. 收费结束后,在将201返回给客户之前,打印某种成功消息。

然后在大约20/30的命令发生后,我重新创建该错误,这是发生的过程:

首先,在Android应用上,发送了以下令牌(并打印到控制台);

  

tok_1DiK0uKIdjSiVG8mn8CV2iim

检查后,此HTTP请求仅触发一次,因此我认为这不是Android问题。

接下来,在API日志文件上,发生了以下事情:

  

2018-12-17 11:11:56] local.DEBUG:令牌:tok_1DiK0uKIdjSiVG8mn8CV2iim   [2018-12-17 11:11:56] local.DEBUG:创建条纹电荷

     

[2018-12-17 11:11:59]本地。调试:令牌:tok_1DiK0uKIdjSiVG8mn8CV2iim

     

[2018-12-17 11:11:59]本地。调试:创建条纹电荷

     

[2018-12-17 11:12:00]本地。错误:当前还有另一个   使用此Stripe令牌进行中的请求(这可能意味着您   点击两次,其他费用仍在处理中):   tok_1DiK0uKIdjSiVG8mn8CV2iim。如果不能再次使用此令牌   充电成功。” {“例外”:“ [对象]   (Cartalyst \ Stripe \ Exception \ MissingParameterException(代码:400):   当前有另一个使用此Stripe令牌的进行中请求   (这可能意味着您单击了两次,而其他费用仍   正在执行):tok_1DiK0uKIdjSiVG8mn8CV2iim。此令牌不能是   如果收费成功,则再次使用。”在   /home/rbfs6nkk73qi/api/prototype/vendor/cartalyst/stripe/src/Exception/Handler.php:123)   [stacktrace]

     

[2018-12-17 11:12:00]本地。调试:交货单

     

[2018-12-17 11:12:00]本地。调试:检查单个项目

     

[2018-12-17 11:12:00]本地。调试:卡交付-通过下订单   Android V0.5应用程序

这表明从我列出的1-5的步骤中,API的确完成了:1、2、1、2,错误,3、4、5。

我完全不知道为什么我的API会随机运行两次。我在下面粘贴了我的API的相关部分,以查看是否存在明显的错误。感谢任何帮助。

我尝试过的最后一件事:我尝试在创建$token充电对象之后直接将null变量设置为$stripe,这让我想知道这是否是{ {1}}。

Cartalyst bug

1 个答案:

答案 0 :(得分:0)

进一步调试后,找到了解决方案。原来,我在Android端使用的HTTP库Volley多次发送了请求。

将Volley请求设置为重试0次似乎已解决了该问题:

MyStringRequest.setRetryPolicy(new DefaultRetryPolicy(0,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));