From 9c021ef3b1c60eafcf650ba910dd970532c5f107 Mon Sep 17 00:00:00 2001
From: Jannat Patel
Date: Fri, 4 Aug 2023 19:37:08 +0530
Subject: [PATCH] feat: razorpay order creation and checkout redirection
---
lms/lms/doctype/lms_course/lms_course.py | 56 ++++++++++++++----------
lms/www/courses/course.html | 5 +++
lms/www/courses/course.js | 32 +++++++++-----
requirements.txt | 3 +-
4 files changed, 61 insertions(+), 35 deletions(-)
diff --git a/lms/lms/doctype/lms_course/lms_course.py b/lms/lms/doctype/lms_course/lms_course.py
index d40a9adc..967d8e93 100644
--- a/lms/lms/doctype/lms_course/lms_course.py
+++ b/lms/lms/doctype/lms_course/lms_course.py
@@ -359,10 +359,35 @@ def reorder_chapter(chapter_array):
@frappe.whitelist()
-def buy_course(course):
- razorpay_key = frappe.get_single_value("LMS Settings", "razorpay_key")
- razorpay_secret = frappe.get_single_value("LMS Settings", "razorpay_secret")
+def get_payment_options(course):
+ course_details = frappe.db.get_value(
+ "LMS Course", course, ["name", "title", "currency", "course_price"], as_dict=True
+ )
+ razorpay_key = frappe.db.get_single_value("LMS Settings", "razorpay_key")
+ razorpay_secret = frappe.db.get_single_value("LMS Settings", "razorpay_secret")
+ client = get_client(razorpay_key, razorpay_secret)
+ order = create_order(client, course_details)
+
+ options = {
+ "key_id": razorpay_key,
+ "name": frappe.db.get_single_value("Website Settings", "app_name"),
+ "description": _("Payment for {0} course").format(course_details["title"]),
+ "order_id": order["id"],
+ "amount": order["amount"] * 100,
+ "currency": order["currency"],
+ "prefill": {
+ "name": frappe.db.get_value("User", frappe.session.user, "full_name"),
+ "email": frappe.session.user,
+ },
+ "callback_url": frappe.utils.get_url(
+ "/api/method/lms.lms.doctype.lms_course.lms_course.verify_payment"
+ ),
+ }
+ return options
+
+
+def get_client(razorpay_key, razorpay_secret):
if not razorpay_key and not razorpay_secret:
frappe.throw(
_(
@@ -370,30 +395,13 @@ def buy_course(course):
)
)
- create_payment_link(razorpay_key, razorpay_secret, course)
+ return razorpay.Client(auth=(razorpay_key, razorpay_secret))
-def create_payment_link(razorpy_key, razorpay_secret, course):
- client = razorpay.Client(auth=(razorpy_key, razorpay_secret))
-
- course_details = frappe.db.get_value(
- "LMS Course", course, ["title", "price_course", "currency"], as_dict=True
- )
- user_details = frappe.db.get_value(
- "User", frappe.session.user, ["full_name", "email"], as_dict=True
- )
-
- client.payment_link.create(
+def create_order(client, course_details):
+ return client.order.create(
{
- "amount": course_details.price_course,
+ "amount": course_details.course_price * 100,
"currency": course_details.currency,
- "description": "Complete your course purchase",
- "customer": {
- "name": user_details.full_name,
- "email": user_details.email,
- },
- "notify": {"sms": True, "email": True},
- "callback_url": "/api/method/lms.lms.doctype.lms_course.lms_course.verify_payment",
- "callback_method": "get",
}
)
diff --git a/lms/www/courses/course.html b/lms/www/courses/course.html
index 6035ea88..ad584ec0 100644
--- a/lms/www/courses/course.html
+++ b/lms/www/courses/course.html
@@ -281,3 +281,8 @@
{% endif %}
{% endmacro %}
+
+{%- block script %}
+{{ super() }}
+
+{% endblock %}
\ No newline at end of file
diff --git a/lms/www/courses/course.js b/lms/www/courses/course.js
index 1f78b87b..4f26b877 100644
--- a/lms/www/courses/course.js
+++ b/lms/www/courses/course.js
@@ -22,16 +22,7 @@ frappe.ready(() => {
});
$("#buy-course").click((e) => {
- e.preventDefault();
- frappe.call({
- method: "lms.lms.doctype.lms_course.lms_course.buy_course",
- args: {
- course: decodeURIComponent(
- $(e.currentTarget).attr("data-course")
- ),
- },
- callback: (data) => {},
- });
+ generate_checkout_link(e);
});
});
@@ -155,3 +146,24 @@ const submit_for_review = (e) => {
},
});
};
+
+generate_checkout_link = (e) => {
+ e.preventDefault();
+ let course = decodeURIComponent($(e.currentTarget).attr("data-course"));
+
+ if (frappe.session.user == "Guest") {
+ window.location.href = `/login?redirect-to=/courses/${course}`;
+ return;
+ }
+
+ frappe.call({
+ method: "lms.lms.doctype.lms_course.lms_course.get_payment_options",
+ args: {
+ course: course,
+ },
+ callback: (data) => {
+ let rzp1 = new Razorpay(data.message);
+ rzp1.open();
+ },
+ });
+};
diff --git a/requirements.txt b/requirements.txt
index d116dede..74bac25a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,4 +4,5 @@ markdown
beautifulsoup4
lxml
cairocffi
-html2image
\ No newline at end of file
+html2image
+razorpay
\ No newline at end of file