97 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| import json
 | |
| from datetime import datetime
 | |
| from odoo.addons.rest_api.controllers.main import *
 | |
| from odoo import http, tools, _, SUPERUSER_ID
 | |
| import stripe
 | |
| 
 | |
| import logging
 | |
| 
 | |
| _logger = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| class StripePayment(http.Controller):
 | |
|     @http.route('/api/stripe/create-checkout-session', methods=['POST'], type='http', csrf=False, auth='none', cors=rest_cors_value)
 | |
|     @check_permissions
 | |
|     def create_checkout_session(self, **kw):
 | |
|         cr, uid = request.cr, request.session.uid
 | |
|         api_key = request.env(cr, uid)['ir.config_parameter'].sudo().get_param('stripe_secret_api_key')
 | |
|         saas_portal_url = request.env(cr, uid)['ir.config_parameter'].sudo().get_param('portal_url', 'https://saas.vercel.app')
 | |
|         pscs = request.env(cr, uid)['portal.stripe.checkout.session']
 | |
| 
 | |
|         if not api_key:
 | |
|             return error_response_400__invalid_object_id()
 | |
|         stripe.api_key = api_key
 | |
|         try:
 | |
|             body = json.loads(request.httprequest.data)
 | |
|         except Exception as e:
 | |
|             _logger.error(e)
 | |
|             return error_response_400__invalid_object_id()
 | |
| 
 | |
|         if body.get('plan_id'):
 | |
| 
 | |
|             user = request.env(cr, uid)['res.users'].browse([uid])
 | |
|             partner = user.partner_id
 | |
| 
 | |
|             plan = request.env(cr, uid)['saas.package'].sudo().search([('id', '=', body.get('plan_id'))])
 | |
|             if plan and plan.stripe_product_id:
 | |
|                 try:
 | |
|                     checkout_session = stripe.checkout.Session.create(
 | |
|                         line_items=[
 | |
|                             {
 | |
|                                 'price': plan.stripe_product_id,
 | |
|                                 'quantity': 1,
 | |
|                             },
 | |
|                         ],
 | |
|                         client_reference_id=uid,
 | |
|                         mode='subscription',
 | |
|                         success_url=str(saas_portal_url) + '/payment/success?session_id={CHECKOUT_SESSION_ID}',
 | |
|                         cancel_url=str(saas_portal_url) + '/payment/canceled',
 | |
|                         customer_email=partner.email if partner.email and not partner.related_stripe_id else None,
 | |
|                         customer=partner.related_stripe_id if partner.related_stripe_id else None,
 | |
|                     )
 | |
|                     pscs.sudo().create({'name': datetime.now(), 'session_id': checkout_session.id, 'user_id': uid})
 | |
|                     return successful_response(200, {'redirect_url': checkout_session.url})
 | |
|                 except Exception as e:
 | |
|                     _logger.error(e)
 | |
|                     return error_response_400__invalid_object_id()
 | |
| 
 | |
|         return error_response_400__invalid_object_id()
 | |
| 
 | |
| 
 | |
| 
 | |
|     @http.route('/api/stripe/webhooks', methods=['POST'], type='json', csrf=False, auth='public', cors='*')
 | |
|     # @check_permissions
 | |
|     def stripe_webhook(self, **kw):
 | |
|         event = None
 | |
|         stripe_signature = request.httprequest.headers.get('Stripe-Signature')
 | |
| 
 | |
|         cr, uid = request.cr, request.session.uid
 | |
|         endpoint_secret = request.env(cr, uid)['ir.config_parameter'].sudo().get_param('stripe_endpoint_secret')
 | |
| 
 | |
|         if not stripe_signature or not endpoint_secret:
 | |
|             return json.dumps({'error': 'stripe signature or endpoint secret not found'})
 | |
| 
 | |
|         payload = request.httprequest.data
 | |
| 
 | |
|         try:
 | |
|             event = stripe.Webhook.construct_event(payload, stripe_signature, endpoint_secret)
 | |
| 
 | |
|             if event.get('type') == 'checkout.session.completed':
 | |
|                 pscs = request.env(cr, uid)['portal.stripe.checkout.session']
 | |
|                 pscs.with_delay().post_session_completion_tasks(session=json.loads(payload))  #<<<-------------
 | |
|                 # pscs.post_session_completion_tasks(session=json.loads(payload))
 | |
| 
 | |
|                 return json.dumps({'response': 'Success! Creating Subscription... '})
 | |
| 
 | |
| 
 | |
|         except ValueError as e:
 | |
|             # Invalid payload
 | |
|             _logger.error(e)
 | |
|             return json.dumps({'error': 'ValueError occurred'})
 | |
|         except stripe.error.SignatureVerificationError as e:
 | |
|             # Invalid signature
 | |
|             _logger.error(e)
 | |
|             return json.dumps({'error': 'Unable to verify Signature'})
 | |
|         return json.dumps({'error': 'Unknown Error Occurred'})
 | |
| 
 |