first commit
This commit is contained in:
1
portal_stripe_payment/controllers/__init__.py
Executable file
1
portal_stripe_payment/controllers/__init__.py
Executable file
@@ -0,0 +1 @@
|
||||
from . import stripe_payment
|
||||
96
portal_stripe_payment/controllers/stripe_payment.py
Executable file
96
portal_stripe_payment/controllers/stripe_payment.py
Executable file
@@ -0,0 +1,96 @@
|
||||
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'})
|
||||
|
||||
Reference in New Issue
Block a user