odoo-saas-kubernetes/portal_stripe_payment/controllers/stripe_payment.py

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'})