feat: razorpay order creation and checkout redirection
This commit is contained in:
@@ -359,10 +359,35 @@ def reorder_chapter(chapter_array):
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def buy_course(course):
|
def get_payment_options(course):
|
||||||
razorpay_key = frappe.get_single_value("LMS Settings", "razorpay_key")
|
course_details = frappe.db.get_value(
|
||||||
razorpay_secret = frappe.get_single_value("LMS Settings", "razorpay_secret")
|
"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:
|
if not razorpay_key and not razorpay_secret:
|
||||||
frappe.throw(
|
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):
|
def create_order(client, course_details):
|
||||||
client = razorpay.Client(auth=(razorpy_key, razorpay_secret))
|
return client.order.create(
|
||||||
|
|
||||||
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(
|
|
||||||
{
|
{
|
||||||
"amount": course_details.price_course,
|
"amount": course_details.course_price * 100,
|
||||||
"currency": course_details.currency,
|
"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",
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -281,3 +281,8 @@
|
|||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
{%- block script %}
|
||||||
|
{{ super() }}
|
||||||
|
<script src="https://checkout.razorpay.com/v1/checkout.js"></script>
|
||||||
|
{% endblock %}
|
||||||
@@ -22,16 +22,7 @@ frappe.ready(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$("#buy-course").click((e) => {
|
$("#buy-course").click((e) => {
|
||||||
e.preventDefault();
|
generate_checkout_link(e);
|
||||||
frappe.call({
|
|
||||||
method: "lms.lms.doctype.lms_course.lms_course.buy_course",
|
|
||||||
args: {
|
|
||||||
course: decodeURIComponent(
|
|
||||||
$(e.currentTarget).attr("data-course")
|
|
||||||
),
|
|
||||||
},
|
|
||||||
callback: (data) => {},
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -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();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ markdown
|
|||||||
beautifulsoup4
|
beautifulsoup4
|
||||||
lxml
|
lxml
|
||||||
cairocffi
|
cairocffi
|
||||||
html2image
|
html2image
|
||||||
|
razorpay
|
||||||
Reference in New Issue
Block a user