To verify a Paystack payment in Rails, call the Paystack verify endpoint with your PaystackService, check status, amount, and currency against your Order model, and use Order.where(reference: ref, paid: false).update_all(paid: true) for idempotent fulfillment.
# app/services/paystack_service.rb (extended)
def verify_and_fulfill(reference)
order = Order.find_by(reference: reference)
return { error: 'Order not found' } unless order
return { success: true, already_fulfilled: true } if order.paid?
result = verify_transaction(reference)
return { error: 'Verification failed' } unless result['status']
return { error: 'Payment not successful' } unless result['data']['status'] == 'success'
return { error: 'Amount mismatch' } if result['data']['amount'] != order.amount_kobo
return { error: 'Currency mismatch' } if result['data']['currency'] != order.currency
updated = Order.where(reference: reference, paid: false)
.update_all(paid: true, paid_at: Time.current)
{ success: true, already_fulfilled: updated == 0 }
end
def callback
reference = params[:reference] || params[:trxref]
return redirect_to root_path, alert: 'Missing reference' unless reference
service = PaystackService.new
result = service.verify_and_fulfill(reference)
if result[:success]
render :success
else
flash[:error] = result[:error]
render :failed
end
end
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
KES 2,999
The definitive guide to building payment systems with Paystack — from your first transaction to production-grade payment infrastructure across Africa. 9 modules, 47 lessons. Free preview available.
Start Paystack Course