Reviewing uncaptured payments
By default, with Stripe you create payments in one step, and with no further action on your part the funds are sent to your bank account.
However, Stripe also supports two-step payments, often called auth and capture. If your integration uses this technique, itโs important to understand that approving a review and capturing a payment are separate actions.
Reviewing uncaptured payments in the Dashboard
When an uncaptured payment is placed in review, the Dashboard displays both a Capture button and a set of buttons to close the review by approving or refunding. (For uncaptured payments, refunding is often called โreleasingโ.)
Approving the review doesnโt automatically capture the charge. You still need to click Capture.
Using the API to automatically capture approved payments
Through the API, you can set up your integration to:
- Immediately capture payments not placed in review
- Leave payments placed in review uncaptured
- Once the review is approved, capture the payment
Immediately capture payments not placed in review
To create an uncaptured payment, set the capture behavior accordingly in the API request. On success, check the payment intentโs review attribute. If the attribute is empty, capture the charge.
Capturing a payment after a review is approved
By design, the prior step left payments in review uncaptured. In this step, use webhooks to automate the process of capturing these payments upon approval.
Start by configuring your webhooks to listen for the review.closed
event. The event data includes the review object, and the objectโs reason
attribute indicates whether the review was approved, or if it was closed for some other reason (e.g., the payment was refunded).
// Review object included in review.closed event webhook. { "id": "prv_08voh1589O8KAxCGPcIQpmkz", "object": "review", "payment_intent": "pi_1D0CsEITpIrAk4QYdrWDnbRS", "created": 1474379631, "livemode": false, "open": false, "reason": "approved" }
If reason
is approved
, capture the charge.
# Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key =
post "/my/webhook/url" do event_json = JSON.parse(request.body.read) event = Stripe::Event.retrieve(event_json["id"]) if event.type == 'review.closed' review = event.object if review.reason == 'approved' pi = Stripe::PaymentIntent.retrieve(review.payment_intent) pi.capture end end status 200 end"sk_test_4eC39HqLyjWDarjtT1zdp7dc"
To capture approved payments, the review process must be completed within seven days. Otherwise, as with any other uncaptured payment, the authorization automatically expires and the payment can no longer be captured.