fix a bug that would allow users to cheat the stripe checkout system
This commit is contained in:
		| @ -1,8 +1,8 @@ | ||||
| import stripe | ||||
| import json | ||||
| import time | ||||
| import decimal | ||||
|  | ||||
|  | ||||
| from flask import Blueprint | ||||
| from flask import request | ||||
| from flask import current_app | ||||
| @ -80,23 +80,35 @@ def success(): | ||||
|     print("/stripe/success returned 400: missing required URL parameter session_id") | ||||
|     abort(400, "missing required URL parameter session_id") | ||||
|   else: | ||||
|     checkout_session = stripe.checkout.Session.retrieve(stripe_checkout_session_id) | ||||
|     if checkout_session and 'display_items' in checkout_session: | ||||
|       cents = checkout_session['display_items'][0]['amount'] | ||||
|       dollars = decimal.Decimal(cents)/100 | ||||
|     checkout_session_completed_events = stripe.Event.list( | ||||
|       type='checkout.session.completed', | ||||
|       created={ | ||||
|         # Check for events created in the last half hour | ||||
|         'gte': int(time.time() - (30 * 60)), | ||||
|       }, | ||||
|     ) | ||||
|  | ||||
|       #consume_stripe_checkout_session deletes the checkout session row and inserts a payment row | ||||
|       # its ok to call consume_stripe_checkout_session more than once because it only takes an action if the session exists | ||||
|       success_account = get_model().consume_stripe_checkout_session(stripe_checkout_session_id, dollars) | ||||
|       if success_account: | ||||
|         print(f"{success_account} paid ${dollars} successfully (stripe_checkout_session_id={stripe_checkout_session_id})") | ||||
|     for event in checkout_session_completed_events.auto_paging_iter(): | ||||
|       checkout_session = event['data']['object'] | ||||
|  | ||||
|     return redirect(url_for("console.account_balance")) | ||||
|       if checkout_session and 'id' in checkout_session and checkout_session['id'] == stripe_checkout_session_id: | ||||
|         cents = checkout_session['display_items'][0]['amount'] | ||||
|         dollars = decimal.Decimal(cents)/100 | ||||
|  | ||||
| # I don't think the webhook is needed | ||||
|         #consume_stripe_checkout_session deletes the checkout session row and inserts a payment row | ||||
|         # its ok to call consume_stripe_checkout_session more than once because it only takes an action if the session exists | ||||
|         success_account = get_model().consume_stripe_checkout_session(stripe_checkout_session_id, dollars) | ||||
|          | ||||
|         if success_account: | ||||
|           print(f"{success_account} paid ${dollars} successfully (stripe_checkout_session_id={stripe_checkout_session_id})") | ||||
|  | ||||
|         return redirect(url_for("console.account_balance")) | ||||
|    | ||||
|   abort(400, "this checkout session is not paid yet") | ||||
|  | ||||
| # webhook is not needed  | ||||
| # @bp.route("/webhook", methods=("POST",)) | ||||
| # def webhook(): | ||||
|  | ||||
| #   request_data = json.loads(request.data) | ||||
| #   signature = request.headers.get('stripe-signature') | ||||
| #   try: | ||||
| @ -111,8 +123,10 @@ def success(): | ||||
|  | ||||
| #       #consume_stripe_checkout_session deletes the checkout session row and inserts a payment row | ||||
| #       # its ok to call consume_stripe_checkout_session more than once because it only takes an action if the session exists | ||||
| #       get_model().consume_stripe_checkout_session(stripe_checkout_session_id, dollars) | ||||
|        | ||||
| #       success_account = get_model().consume_stripe_checkout_session(stripe_checkout_session_id, dollars) | ||||
| #       if success_account: | ||||
| #         print(f"{success_account} paid ${dollars} successfully (stripe_checkout_session_id={stripe_checkout_session_id})") | ||||
|      | ||||
| #     return jsonify({'status': 'success'}) | ||||
| #   except ValueError as e: | ||||
| #     print("/stripe/webhook returned 400: bad request", e) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user