Stripe - 向用户收费并通过电子邮件发送发票

Posted

技术标签:

【中文标题】Stripe - 向用户收费并通过电子邮件发送发票【英文标题】:Stripe - Charge user and send invoice via e-mail 【发布时间】:2020-04-17 01:31:02 【问题描述】:

我有一个使用 Lumen 作为后端的移动应用 (Flutter)。对于付款,我使用 Stripe SDK for php

收费成功后,我需要向用户发送发票。我理解它是这样工作的:

    在 Stripe 中创建客户 使用customer_id向客户收费 使用customer_id 创建发票项目 Stripe 将使用客户的电子邮件自动通过电子邮件发送发票

我有两个功能:

public function addCard(Request $request) 
    $user = User::find($user->id);

    if (is_null($user->stripe_id) || empty($user->stripe_id)) 

        $customer = \Stripe\Customer::create([
            "name" => $user->name,
            "email" => $user->email,
            "description" => "Test",
        ]);

        $user->stripe_id = $customer->id;

        $user->save();
    


public function charge(Request $request) 
    $charge = \Stripe\Charge::create([
        'amount' => 2000,
        'currency' => 'eur',
        'customer' => $user->stripe_id,
        'description' => 'Some description',
    ]);

    \Stripe\InvoiceItem::create([
        'customer' => $user->stripe_id,
        'amount' => 2500,
        'currency' => 'usd',
        'description' => 'One-time setup fee',
        'auto_advance' => true,
    ]);

它添加了用户,但没有信用卡详细信息。我应该传递哪些参数以便 Stripe 可以为指定用户创建卡令牌?因为它是一个移动应用程序,所以我不能为此目的使用 Stripe.js。

在调用收费函数的那一刻,我收到错误消息:

无法向没有有效卡的客户收费

这是我的第一个支付网关项目......所以非常感谢任何帮助。

【问题讨论】:

当用户输入信用卡详细信息时,您必须使用stripe.js 或 Stripe Checkout 来获取卡令牌。 我对移动SDK不熟悉,但应该有类似的东西。 【参考方案1】:

查看这篇文章 (link)。您可以发送交易收据(不是发票)

在您的情况下,我认为您需要通过以下方式从服务器传递电子邮件

stripe.paymentIntents.create(
              
                amount: 1000,
                currency: USD,
                payment_method: clonedPaymentMethod.id,
                confirmation_method: 'automatic',
                confirm: true,
                receipt_email: 'abc@cde.com',
              , 
                stripeAccount: stripeVendorAccount
              ,
              function(err, paymentIntent) 
                // asynchronously called
                const paymentIntentReference = paymentIntent;

【讨论】:

【参考方案2】:

澄清一下,Invoice 是您将发送给您的客户并要求您的客户支付发票 0 的东西。

如果您已经向您的客户收费,您将不会向您的客户发送发票,因为这最终会向您的客户收取双重费用。相反,您应该根据您创建的费用向您的客户发送receipt1。

说了这么多,

要通过 Stripe 接受客户的付款,您可以执行以下操作

1.创建一次性费用

第 1 步:创建一个代表信用卡信息的令牌。这通常涉及您的客户访问您的应用程序/网站并查看信用卡表格 您可以使用 Stripe Element,这是一个 preBuild 安全 UI,显示信用卡表单

...
...
var token = stripe.createToken(cardElement); 
...

第 2 步:获取令牌后,将其传递给您的 PHP 服务器端并调用 Stripe Charge API

// see https://stripe.com/docs/api/charges/create?lang=php#create_charge-source
    $charge = \Stripe\Charge::create([
        'amount' => 2000,
        'currency' => 'eur',
        'source' => $token->id,
        'description' => 'Some description',
    ]);

关注step by step guide 试试以上方法

2。将信用卡保存给客户并稍后向客户收费

这与案例 1 非常相似,只是现在您将卡保存给客户并向客户收费。 token 默认是一次性使用,如果您想重复使用该卡,例如您稍后要向客户收取某些订阅费用,您需要将卡保存给客户,即 Attach Card to customer,然后才能重新使用令牌/卡。

第一步:创建同上的token

...
var token = stripe.createToken(cardElement); 
...

第2步:将令牌传递给您的PHP服务器端并将卡保存给客户

// Create a new customer with the token 
// https://stripe.com/docs/api/customers/create#create_customer-source 
       $customer = \Stripe\Customer::create([
            "name" => $user->name,
            "email" => $user->email,
            "description" => "Test",
            "source" => $token->id,
        ]);


// Or you could attach it to an existing customer 
\Stripe\Customer::createSource(
  'cus_xxxx',
  [
    'source' => $token->id,
  ]
);

第 3 步:使用保存的卡向客户收费。

// When charging this customer, it will use the default card saved at step 2
    $charge = \Stripe\Charge::create([
        'amount' => 2000,
        'currency' => 'eur',
        'customer' => $customer->id, 
        'description' => 'Some description',
    ]);

关注step by step guide试试以上方法

上面显示了使用 Stripe API + Stripe Element 向客户信用卡收费的最简单方法

这只是起点。熟悉了上面的概念后,可以进一步探索 1. PaymentMethod 和 PaymentIntent 这些是 Stripe 推荐的新 API,但建立在收费 API 之上 https://stripe.com/docs/payments/accept-a-payment https://stripe.com/docs/payments/save-and-reuse

    开票 https://stripe.com/docs/billing/invoices/workflow https://stripe.com/docs/billing/invoices/create-invoice

这是一款功能强大的计费工具,可让您通过客户保存的卡向客户开具账单,或向客户发送发票以进行付款。

【讨论】:

以上是关于Stripe - 向用户收费并通过电子邮件发送发票的主要内容,如果未能解决你的问题,请参考以下文章

如何向用户添加卡并使用 Stripe 对其进行收费?

Stripe 客户门户网站在更新付款方式后立即对“逾期”发票强制重试收费

如何通过客户 ID 使用 Stripe 收费

您如何为 Stripe 结帐会话生成付费发票 PDF?

如何创建带有发票的 Stripe 订单?

Stripe 让多个客户使用相同的电子邮件地址