【问题标题】:How to test stripe subscriptions in localhost?如何在 localhost 中测试条带订阅?
【发布时间】:2017-04-05 09:18:04
【问题描述】:

我的代码使用下面给出的代码设置条带订阅(经常性费用)

            $strtok = \Stripe\Token::create([
                     'card' => [
                     'number' => $ccNum,
                     'exp_month' => $expMonth,
                     'exp_year' => $expYear,
                     'cvc' => $cvc
                     ],
                   ]
             );
            $stripetoken = $strtok->id;
            $customer = \Stripe\Customer::create([
                   'source' => $stripetoken,
                   'email' => $email
             ]);
            $subscription = \Stripe\Subscription::create([
              'customer' => $customer->id,
              'plan' => $planId,
            ]);

如果我理解正确,则在订阅电话后立即尝试对卡进行充电。是否绝对有必要设置一个条纹网络挂钩网址来获取诸如chargeId等收费细节?我的意思是我正在测试模式下工作,我无法设置指向服务器的条带网络挂钩 url。我想在条带第一次向卡收费时以及条带随后定期对卡收费以进行测试时获取条带 ChargeId 和其他收费详细信息。我想在我的本地系统中执行此操作,该系统位于连接到网络的本地网络中。

【问题讨论】:

    标签: stripe-payments


    【解决方案1】:

    koopajah 是对的:收费卡不需要 webhook。 但是,对于其他付款来源(例如 SEPA 借记卡),收费会在几小时/几天后异步成功。在这种情况下,您的程序确实需要接收 webhook 事件。

    localhost 上接收事件:

    • 您可以按照前面的建议使用ngrok 重定向它们。

    • 或者您可以使用在localhost 上运行的假本地Stripe 服务器,例如localstripe。 安装并运行后,将您的 PHP 应用程序配置为使用 localstripe 而不是真正的 Stripe 服务器:

      \Stripe\Stripe::$apiBase = "http://localhost:8420";
      \Stripe\Stripe::setApiKey("sk_test_abcdefgh");
      

      并配置 localstripe 以将事件发送到您的应用程序。假设您的 PHP 应用程序侦听 localhost:1111/api/stripe 上的事件:

      curl localhost:8420/_config/webhooks/mywebhook1 \
        -d url=http://localhost:1111/api/stripe -d secret=whsec_yoursecret
      

    【讨论】:

      【解决方案2】:

      这里不需要 webhook。 API 请求是同步的,这意味着,在您调用 \Stripe\Subscription::create() 之后,Stripe 已经尝试向客户收费。

      如果收费成功,您将收到 Subscription object 回复,否则将收到 error

      假设收费成功,您可以立即通过 API 检索最新的收费和发票。最简单的方法是检索一个并使用expand 功能一次获取所有内容。您的代码将变为:

      $invoices = \Stripe\Invoice::all(array(
          "limit" => 1,
          "customer" => $customer->id,
          "expand" => array("data.charge")
      ));
      
      $invoice = $invoices->data[0];
      $invoiceId = $invoice->id;
      $chargeId = $invoice->charge->id;
      

      对于本地 webhook,您始终可以使用 ngrok 之类的工具自动将事件重定向到 localhost。

      【讨论】:

      • 上述代码将在订阅创建后立即获取我的第一个费用详细信息。感谢您的代码。但我还是有问题。我的服务器本质上是短暂的。如何在不设置网络挂钩的情况下获取后续几个月的后续费用(按月订阅)的费用详情?为此,我必须使用像 ngrok 这样的工具,是吗?为了每个月都使用上面的代码,我是否必须设置某种执行脚本的 cron?我不确定这对于我打算稍后使用的亚马逊 ec2 临时服务器是否可行。
      • @jai ngrok 用于在本地测试 webhook,仅此而已。您不会在这里使用 ngrok,您的代码将在服务器上运行并且始终运行。并且每当发生新费用时,invoice.payment_succeeded 事件将被发送到您的 webhook 端点,您的代码将处理该事件并自动更新您的数据库。这些都记录在 Stripe 的 webhook 和 subs 文档中:stripe.com/docs/webhooksstripe.com/docs/subscriptions/lifecycle
      • 你能告诉我如何在 docker 中使用 ngrok 吗?
      • 从未尝试过,但blog.benhall.me.uk/2015/01/… 似乎可以满足您的需求,我建议您检查一下或在谷歌上搜索一下,然后再试一试!
      【解决方案3】:

      我的意思是我正在测试模式下工作,我无法设置指向服务器的条带网络挂钩 url。

      一般来说,您可以使用http://www.ip-adress.eu/ 之类的服务来首先检索您面向公众的 IP 地址 (v4)。

      然后登录到您的路由器(地址类似于 192.168.X.Y,您可以在计算机的网络接口详细信息中查找)

      在您的路由器中设置端口转发规则,以便将特定端口范围上的流量定向到您的计算机(例如54764)。

      现在让您的 localhost 服务器运行侦听同一端口 (54764)。

      转到您的 Stripe 仪表板并确保您处于测试模式。

      为您的 IPv4 和端口组合添加 webhook URL。

      现在您应该能够在外部测试您的本地网络服务器,而无需在开发期间托管您的代码。

      (注意:这不是 Stripe 独有的,您可以使用此设置从任何外部端点与您机器上的本地网络服务器通信)

      【讨论】:

        猜你喜欢
        • 2021-08-28
        • 2015-07-02
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多