John_Shelby
Saving incoming data from Stripe
Hello everyone,
I am trying to create a payment gateway using Stripe. My solution is based on this tutorial.
I think I have everything set up well, but I’m not sure if Stripe is returning the required data that I would like to store in a database and work with afterwards.
In the tutorial, after a successful payment is made in the terminal after the stripe listen command, the following is the output:
However, my output looks like this:
If the return values from webhook are correct anyway, which I’m not sure. How should I continue to work with them within the handle event to save them?
Thanks to IO.inspect I was expecting some data in the terminal, where for example %Stripe.Event{type: "invoice.paid"}
defmodule MyAppWeb.StripeHandler do
import MyAppWeb.Gettext
@behaviour Stripe.WebhookHandler
@impl true
def handle_event(%Stripe.Event{type: "invoice.paid"} = event) do
IO.inspect(gettext("Payment Success"))
IO.inspect(event)
:ok
end
end
I have added the handler in the endpoint
plug Stripe.WebhookPlug,
at: "/webhook/stripe",
handler: MyAppWeb.StripeHandler,
secret: {Application, :get_env, [:stripity_stripe, :stripe_webhook_secret]}
It’s about storing data like customer_id, emai, etc that I can see in the payment in my Stripe account.
I am still a newbie and this is my first attempt at a payment gateway. Thanks a lot for any advice.
Have a nice day. ![]()
Marked As Solved
John_Shelby
UPDATE:
The answer is that the data are sent back to the application.
Alternatively, ngrok can also be used.
Fot test you will need 3 terminals open:
- In the first terminal, ensure the Stripe CLI listener is running (
stripe listen --forward-to localhost:4000/webhook/stripe) - In the second terminal, ensure your app is running (
mix phx.server). Remember you may need to runsource .envin the terminal first - In the third terminal, execute
stripe trigger checkout.session.completed.
I am replacing step three by going through and filling in the data directly in the application.
My handle event for saving to the database now looks like this:
@impl true
def handle_event(%Stripe.Event{type: "invoice.paid"} = event) do
IO.inspect(gettext("Payment Success"))
IO.inspect(event)
%{customer: customer_id, customer_email: email, amount_paid: amount} = event.data.object
Purchases.create_customer(%{
email: email,
stripe_customer_id: customer_id,
amount: amount
})
{:ok, "success"}
end
Practically the whole issue with a link to a sample application is available in the tutorial at this link.










