harunB10
harunB10

Reputation: 5207

Stripe - Charge user and send invoice via e-mail

I have a mobile app (Flutter) which uses Lumen as backend. For payments I use Stripe SDK for PHP.

I need to send an invoice to user after successful charge. I understood it works this way:

  1. Create customer in Stripe
  2. Charge customer using customer_id
  3. Create invoice item using customer_id
  4. Stripe will automatically send an invoice via email using customer's email

I have two functions:

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,
    ]);
}

It adds user but without credit card details. Which arguments should I pass so that Stripe can create card token for specified user? Since it's a mobile app I cannot use Stripe.js for this purpose.

At the moment when the charge function is called I get the error message:

Cannot charge a customer that has no active card

This is my first project with payment gateway... So any help is really appreciated.

Upvotes: 0

Views: 3284

Answers (2)

M4trix Dev
M4trix Dev

Reputation: 2274

Check this article (link). You can send the receipt of the transaction (not the invoice)

In your case I think you need pass the email from the server with the following

stripe.paymentIntents.create(
              {
                amount: 1000,
                currency: USD,
                payment_method: clonedPaymentMethod.id,
                confirmation_method: 'automatic',
                confirm: true,
                receipt_email: '[email protected]',
              }, {
                stripeAccount: stripeVendorAccount
              },
              function(err, paymentIntent) {
                // asynchronously called
                const paymentIntentReference = paymentIntent;

Upvotes: 0

wsw
wsw

Reputation: 861

Just to clarify, an Invoice is something you would send to your customer and ask your customer to pay for the invoice 0 .

If you've already charged your customer, you will NOT send invoice to your customer because this will end up double charging your customer. Instead, you should send a receipt 1 to your customer on the charge you've created.

Saying all that,

To accept a payment from a customer, through Stripe, you could do the following

1. Create one-time charge

Step 1: create a token representing the credit card information. This normally involves your customer goes to your app/website and see a credit card form You could use Stripe Element which is a preBuild secure UI showing a credit card form

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

Step 2: After you get the token, pass it your PHP server side and call 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',
    ]);

Follow step by step guide to try the above

2. Save a credit card to a customer and charge the customer later

This is very similar to case 1, except now you are saving a card to the customer and charge the customer. token by default is single use only, if you want to reuse the card e.g. you are charging the customer later for some subscriptions, you will need to save the card to the customer aka Attach Card to customer before you can re-use the token/card.

Step 1: create a token same as above

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

Step 2: Pass the token your PHP server side and save the card to the customer

// 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,
  ]
);

Step 3: Charge the customer with the saved card.

// 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',
    ]);

Follow step by step guide to try the above

The above shows the simplest way to charge to a customer credit card using Stripe API + Stripe Element

This is just the starting point. After you are familiar with the above concept, you could explore more on 1. PaymentMethod and PaymentIntent These are the new APIs Stripe recommend but built on top of charges API https://stripe.com/docs/payments/accept-a-payment https://stripe.com/docs/payments/save-and-reuse

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

This is powerful billing tool which allows you to bill your customer either on their saved card or sending an invoice to your customer to pay.

Upvotes: 0

Related Questions