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

时间:2019-12-27 00:03:35

标签: php flutter stripe-payments lumen

我有一个使用Lumen作为后端的移动应用程序(Flutter)。付款时,我使用Stripe SDK for PHP。

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

  1. 在Stripe中创建客户
  2. 使用customer_id
  3. 向客户收费
  4. 使用customer_id创建发票项目
  5. 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。

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

  

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

这是我的第一个使用支付网关的项目...因此,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

如果您已经向客户收费,则不会将发票发送给客户,因为这最终会使您的客户加倍收费。相反,您应该根据自己创建的费用向客户发送receipt 1

说了所有

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

1。创建一次性费用

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

...
...
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,然后才能重新使用令牌/卡。

步骤1:创建与上面相同的令牌

...
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

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

此功能强大的计费工具,可让您使用已保存的卡或向客户发送发票进行付款来向客户收费。

答案 1 :(得分:0)

查看本文(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;