Store Stripe payment history - php

I have integrated stripe in to my application.
Now i want to store the payment history in to my database.
Using stripe APIs, i can create new subscription as well as update that subscription.
Now say i have one subscription for one month for $20 and after few days i am updating to sixmonth for $60. So as per stripe logs it will deduct $40 while updating plan.
I want to store all these payment process along with subscription periods in to my database.
How can i do that. Is that any API for it?

You can use webhooks to get notification from Stripe whenever any event happen.
So you need to create a webhook for charge.succeeded. So that you can get notification for all the successful charges happen. You can get amount, customer data inside the event data which you can store to your DB. I assume you are already storing subscription along with customer, so that you can map subscription from customer data from event data.

Related

Stripe inactive subscription as Payment Intent

I have been following this guide to create a subscription service using Stripe's API:
https://stripe.com/docs/billing/subscriptions/build-subscriptions?ui=elements#create-subscription
Everything works, however as soon as the payment element is loaded, an inactive subscription is created due to the payment intent. As stated in the guide:
At this point the Subscription is inactive and awaiting payment
If the payment is successful, what is returned is the payment intent,
payment intent client secret, and redirect status status.
So here are my issues:
It seems terribly illogical to create an inactive subscription for every customer that visits the payment element. Let's say hypothetically I had the payment element on my landing page, my Stripe would be overwhelmed with inactive subscriptions. Even if the user reloads/revisits the payment page a new subscription is created. It just seems messy.
I want to store the active subscription ID in a database and only allow a user to subscribe once. But the response doesn't return the subscription ID, it only retuns the payment intent stuff listed above.
This just seems like not the best way to do this, am I doing something wrong?
Is there a way to get the active subscription ID with the success response?
AND/OR
Is there a way to initialize the payment element with a payment intent before creating the subscription, and then create the subscription after success?
In the beginning, the subscription is in incomplete status because it requires a payment method to pay its first invoice so that it can transition to active status. So if you want to make a subscription active upon creation, you need to specify a default_payment_method during creation.
You can use the SetupIntent API to collect a payment_method.
Create a customer
Create a SetupIntent with the customer
Use the SetupIntent's client_secret to render the PaymentElement
Call stripe.confirmSetup to confirm the SetupIntent so that the collected payment_method is attached to the customer
Now, you can pass the earlier collected payment_method as the default_payment_method when creating a subscription, and the resulting subscription will become active if the first invoice is paid successfully with the default_payment_method. You don't need to use PaymentElement in this step anymore because you already collected a payment_method through SetupIntent.

Stripe for crowdfunding

I am using stripe for crowdfunding website. Its simple to pledge card using stripe api.
When campaign meets its goal all the cards must be charged.I am using cronjobs to check if any campaigns meets its funding goal if yes then charge pledged cards.As the cards are in bulk the stripe api takes more time and php execution time limit ends.
So I choose nodejs for this purpose that sends charging requests asynchronously (that works).
I have another option to create onetime subscription of funded amount on the deadline of campaign when pledging card.
And if campaign isn't successful all the subscriptions will be deleted from stripe through cron job.
My question is whats the best approach using charging request to charge all cards if campaign succeeds or creating subscriptions when card is pledged and deleting all subscriptions in case the campaign doesn't meets its goal.
If it were me, I would:
Create a customer object on each pledge via Stripe API.
Create a card object on each pledge, attach to a customer, also via Stripe API.
Store in your local DB a record identifying the customer and card object in Stripe, and relating it to the campaign. Add a column "has_been_charged" (BOOL) = 0 (false). Add column "has_been_deleted" (BOOL) = 0 (false).
Then, on campaign completion, a manual or automatic job would verify campaign success.
If successful campaign:
Loop through each DB record WHERE has_been_charged = 0 AND campaign_id = the campaign. Do this in blocks of 100 or 500 or 1000 depenending on DB connectivity and time it takes to loop through.
During loop, retrieve card/customer object via Stripe API, create charge via Stripe API, update database column has_been_charged = 1.
Repeat loop until all charges are completed.
If unsuccessful campaign:
Loop through each DB record WHERE has_been_deleted = 0 AND campaign_id = the campaign Again, do this in blocks.
During loop, remove card object via Stripe API (and perhaps also customer object), also update database column has_been_deleted = 1.
Repeat loop until all cards have been removed.

Can I charge a variable amount to Stripe as a subscription?

I want to use the Stripe API to bill users every month for an amount they specify. It appears that Stripe does not allow websites to create a subscription without first setting up a plan for it manually, restricting what people can bill themselves for to predesignated amounts.
What is the best way to do this?
You can! Before we talk more about how this works in practice, make sure you understand when an invoice is open for modification.
Subscribing your customer to a new plan, or updating your customer's existing subscription
If you are subscribing your customer to a plan via the API, you won't be able to add any custom fees after the initial invoice is created since it will be immediately closed. This means you'll need to setup any custom amounts before the initial invoice is created. You can do this in one of two ways:
Set the account_balance when creating a customer or updating a customer's subscription.
Create any invoice items before your customer is subscribed to the plan, and then create the subscription via an update customer subscription call.
In either case, we'll pull the account balance or any outstanding invoice items into the initial invoice, so your customer will still be charged for the setup fees. These are essentially one-time charges that you are combining with the subscription's recurring charges. Since these are being added to the invoice total, only a single charge is being created.
Subscription renewals
The account balance and invoice items are simply one-time adjustments to your customer's account, so they won't be automatically applied each month. If your service uses metered billing or needs to add custom amounts for taxes or other dynamic costs, then you will need to create invoice items every month.
To get started, just use webhooks to listen for the invoice.created event. Whenever an invoice is open for modification, your webhook endpoint can create an invoice item that references the existing invoice's ID. We'll automatically pull this amount into the invoice total before charging your customer, approximately an hour after the invoice's creation.
Link:
https://support.stripe.com/questions/metered-subscription-billing

Authorize ARB subscription payment

I am creating a subscription using Authorize.net ARB API. I can see in my account, where the subscription is created.
Its a very simple subscription, where a user would be paying $100 every month. I would like to know, if the user would be billed at the time of creation of the subscription ?
My understanding is that, he would be billed only from next month ? Any idea, how to bill the customer from the time the subscription is created ?
Thanks
ARBCreateSubscriptionRequest has parameter "startDate" where you can set date the subscription begins.
If first price should be different from monthly payments you can also set parameter "trialAmount" for first payment
All information you can find here
http://www.authorize.net/support/ARB_guide.pdf
You should always charge the first subscription payment using the AIM API. The AIM API will process immediately and act as a verification for the credit card. You will know immediately if a card is invalid and before you create the subscription. If you schedule a payment to process the same day the subscription is created it does not process immediately. That process later that night. If the credit card is invalid you lose the opportunity to have the user correct it because they are no longer present at your website.

Storing Recurring Payment information in Database using Paypal pro

I want to make an online enrollment system using Paypal pro API. I want to have an option to pay tuition fee in an installment using Credit card. To do this , I am creating Recurring Payment profile using Paypal Pro. I am able to successfully create the recurring payment profile & store initial payment information into database.
Now When the next recurring payment happens, I want to store the the payment information into my database with some identity parameters such as Payee Id , PayeeEmail , PayeeEnrolledDepartmentId.
I have heard about IPN(Instant payment notification) Service in Paypal pro. But the main problem is , When i Create Recurring profile for the first time, I would like to send some Identity parameter such as Id, Email etc so that when the next time the IPN script is executed , I am able to recognize & store payment information with the correct identification.
How can I do this ? Please assist me with some useful techniques or codes.
When PayPal creates the profile, it will create and associate a profile ID with the buyer. You could use this as a unique identifying value. If you are wanting to pass over your own, you could pass over something in the description "DESC" variable.

Categories