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

0aydgbwb  于 2022-11-21  发布在  PHP
关注(0)|答案(2)|浏览(357)

我有一个移动的应用程序(Flutter),它使用Lumen作为后端。对于支付,我使用PHP的Stripe SDK。
充值成功后需要给用户发发票,我理解是这样的:
1.在条带中创建客户
1.使用customer_id向客户收费
1.使用customer_id创建发票项目

  1. 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来实现此目的。
在调用收费函数时,我收到错误消息:
无法向没有活动卡的客户收费
这是我的第一个项目与支付网关...所以任何帮助是真的很感激。

woobm2wo

woobm2wo1#

需要说明的是,Invoice是您发送给客户并要求客户支付发票0的内容。
如果您已经向客户收费,您将不会向客户发送发票,因为这将导致向客户重复收费。相反,您应该向客户发送一张receipt1发票,以支付您创建的费用。
说了这么多,
要通过Stripe接受客户的付款,您可以执行以下操作

1.创建一次性费用

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

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

第2步:获得令牌后,将其传递给PHP服务器端并调用StripeCharge 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,
  ]
);

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

// 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来尝试上述操作
上面显示了使用StripeAPI + StripeElement向客户信用卡收费的最简单方法
这只是一个起点,在熟悉了上述概念之后,您可以进一步了解1. PaymentMethod和PaymentIntent这些是Stripe推荐的新API,但构建在收费API https://stripe.com/docs/payments/accept-a-paymenthttps://stripe.com/docs/payments/save-and-reuse之上
1.开具发票
这是一个功能强大的计费工具,它允许您对您的客户帐单要么在他们保存的卡或发送发票给您的客户支付.

ffscu2ro

ffscu2ro2#

检查这篇文章(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;

相关问题