| # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors |
| # For license information, please see license.txt |
| |
| import frappe |
| from frappe import _ |
| from frappe.integrations.utils import create_request_log |
| |
| from erpnext.utilities import payment_app_import_guard |
| |
| |
| def create_stripe_subscription(gateway_controller, data): |
| with payment_app_import_guard(): |
| import stripe |
| |
| stripe_settings = frappe.get_doc("Stripe Settings", gateway_controller) |
| stripe_settings.data = frappe._dict(data) |
| |
| stripe.api_key = stripe_settings.get_password(fieldname="secret_key", raise_exception=False) |
| stripe.default_http_client = stripe.http_client.RequestsClient() |
| |
| try: |
| stripe_settings.integration_request = create_request_log(stripe_settings.data, "Host", "Stripe") |
| stripe_settings.payment_plans = frappe.get_doc( |
| "Payment Request", stripe_settings.data.reference_docname |
| ).subscription_plans |
| return create_subscription_on_stripe(stripe_settings) |
| |
| except Exception: |
| stripe_settings.log_error("Unable to create Stripe subscription") |
| return { |
| "redirect_to": frappe.redirect_to_message( |
| _("Server Error"), |
| _( |
| "It seems that there is an issue with the server's stripe configuration. In case of failure, the amount will get refunded to your account." |
| ), |
| ), |
| "status": 401, |
| } |
| |
| |
| def create_subscription_on_stripe(stripe_settings): |
| with payment_app_import_guard(): |
| import stripe |
| |
| items = [] |
| for payment_plan in stripe_settings.payment_plans: |
| plan = frappe.db.get_value("Subscription Plan", payment_plan.plan, "product_price_id") |
| items.append({"price": plan, "quantity": payment_plan.qty}) |
| |
| try: |
| customer = stripe.Customer.create( |
| source=stripe_settings.data.stripe_token_id, |
| description=stripe_settings.data.payer_name, |
| email=stripe_settings.data.payer_email, |
| ) |
| |
| subscription = stripe.Subscription.create(customer=customer, items=items) |
| |
| if subscription.status == "active": |
| stripe_settings.integration_request.db_set("status", "Completed", update_modified=False) |
| stripe_settings.flags.status_changed_to = "Completed" |
| |
| else: |
| stripe_settings.integration_request.db_set("status", "Failed", update_modified=False) |
| frappe.log_error(f"Stripe Subscription ID {subscription.id}: Payment failed") |
| except Exception: |
| stripe_settings.integration_request.db_set("status", "Failed", update_modified=False) |
| stripe_settings.log_error("Unable to create Stripe subscription") |
| |
| return stripe_settings.finalize_request() |