Add code to subscribe user to recurring subscriptions
This commit is contained in:
parent
9c210ae2e4
commit
c2514cd5b5
1 changed files with 52 additions and 7 deletions
|
@ -10,6 +10,7 @@ from pyotp import TOTP
|
|||
from config import etcd_client as client, logging, APP_PORT
|
||||
from stripe_utils import StripeUtils
|
||||
from uuid import uuid4
|
||||
import time
|
||||
|
||||
app = Flask(__name__)
|
||||
api = Api(app)
|
||||
|
@ -37,6 +38,20 @@ def check_otp(name, realm, token):
|
|||
)
|
||||
return response.status_code
|
||||
|
||||
def get_plan_id_from_product(product):
|
||||
plan_id = "ucloud-v1-"
|
||||
plan_id += product["name"].strip().replace(' ', '-') + "-"
|
||||
plan_id += product["type"]
|
||||
return plan_id
|
||||
|
||||
def get_order_id():
|
||||
order_id_kv = client.get("/v1/last_order_id")
|
||||
if order_id_kv:
|
||||
order_id = int(order_id_kv.value) + 1
|
||||
else:
|
||||
order_id = config("INIT_ORDER_ID")
|
||||
client.put("/v1/last_order_id", order_id)
|
||||
return "OR-{}".format(order_id)
|
||||
|
||||
class ListProducts(Resource):
|
||||
@staticmethod
|
||||
|
@ -255,18 +270,48 @@ class ProductOrder(Resource):
|
|||
logging.debug("Product {} is recurring payment".format(
|
||||
product_obj["name"])
|
||||
)
|
||||
plan_id = get_plan_id_from_product(product_obj)
|
||||
res = stripe_utils.get_or_create_stripe_plan(
|
||||
stripe_plan_id=plan_id, amount=product_obj["price"],
|
||||
name=plan_id
|
||||
)
|
||||
if res["response_object"]:
|
||||
logging.debug("Obtained plan {}".format(plan_id))
|
||||
subscription_res = stripe_utils.subscribe_customer_to_plan(
|
||||
stripe_customer.id,
|
||||
[{"plan": plan_id}]
|
||||
)
|
||||
subscription_obj = subscription_res["response_object"]
|
||||
if (subscription_obj is None
|
||||
or subscription_obj.status != 'active'):
|
||||
logging.error("Could not create subscription")
|
||||
if subscription_obj is None:
|
||||
logging.error("subscription_obj is None")
|
||||
else:
|
||||
logging.error("subscription status is NOT active")
|
||||
logging.error("Detail = {}".format(
|
||||
subscription_res["error"]
|
||||
))
|
||||
return { "message": "Error subscribing to plan. "
|
||||
"Details: {}".format(
|
||||
subscription_res["error"]) }, 400
|
||||
else:
|
||||
logging.debug("Created subscription successfully")
|
||||
order_obj = {
|
||||
"order_id": get_order_id(),
|
||||
"ordered_at": int(time.time()),
|
||||
"product": product_obj,
|
||||
}
|
||||
return {"message": "Order successful",
|
||||
"order_details": order_obj}, 200
|
||||
else:
|
||||
logging.error("Could not create plan {}".format(plan_id))
|
||||
|
||||
elif product_obj['type'] == "one-time":
|
||||
logging.debug(
|
||||
"Product {} is one-time "
|
||||
"payment".format(product_obj["type"])
|
||||
)
|
||||
|
||||
|
||||
|
||||
# If charge successful, create an order object
|
||||
|
||||
# Else handle unsuccessful cases with grace
|
||||
|
||||
except KeyError as key_error:
|
||||
logging.error("Key error occurred")
|
||||
logging.error(str(key_error))
|
||||
|
|
Loading…
Reference in a new issue