|
|
@@ -180,6 +180,33 @@ class RazorpaySettings(Document): |
|
|
|
integration_request = create_request_log(kwargs, "Host", "Razorpay") |
|
|
|
return get_url("./integrations/razorpay_checkout?token={0}".format(integration_request.name)) |
|
|
|
|
|
|
|
def create_order(self, **kwargs): |
|
|
|
# Creating Orders https://razorpay.com/docs/api/orders/ |
|
|
|
|
|
|
|
# convert rupees to paisa |
|
|
|
kwargs['amount'] *= 100 |
|
|
|
|
|
|
|
# Create integration log |
|
|
|
integration_request = create_request_log(kwargs, "Host", "Razorpay") |
|
|
|
|
|
|
|
# Setup payment options |
|
|
|
payment_options = { |
|
|
|
"amount": kwargs.get('amount'), |
|
|
|
"currency": kwargs.get('currency', 'INR'), |
|
|
|
"receipt": kwargs.get('receipt'), |
|
|
|
"payment_capture": kwargs.get('payment_capture') |
|
|
|
} |
|
|
|
if self.api_key and self.api_secret: |
|
|
|
try: |
|
|
|
order = make_post_request("https://api.razorpay.com/v1/orders", |
|
|
|
auth=(self.api_key, self.get_password(fieldname="api_secret", raise_exception=False)), |
|
|
|
data=payment_options) |
|
|
|
order['integration_request'] = integration_request.name |
|
|
|
return order # Order returned to be consumed by razorpay.js |
|
|
|
except Exception: |
|
|
|
frappe.log(frappe.get_traceback()) |
|
|
|
frappe.throw(_("Could not create razorpay order")) |
|
|
|
|
|
|
|
def create_request(self, data): |
|
|
|
self.data = frappe._dict(data) |
|
|
|
|
|
|
@@ -213,6 +240,10 @@ class RazorpaySettings(Document): |
|
|
|
self.integration_request.update_status(data, 'Authorized') |
|
|
|
self.flags.status_changed_to = "Authorized" |
|
|
|
|
|
|
|
if resp.get("status") == "captured": |
|
|
|
self.integration_request.update_status(data, 'Completed') |
|
|
|
self.flags.status_changed_to = "Completed" |
|
|
|
|
|
|
|
elif data.get('subscription_id'): |
|
|
|
if resp.get("status") == "refunded": |
|
|
|
# if subscription start date is in future then |
|
|
@@ -222,14 +253,6 @@ class RazorpaySettings(Document): |
|
|
|
self.integration_request.update_status(data, 'Completed') |
|
|
|
self.flags.status_changed_to = "Verified" |
|
|
|
|
|
|
|
if resp.get("status") == "captured": |
|
|
|
# if subscription starts immediately then |
|
|
|
# razorpay charge the actual amount |
|
|
|
# thus changing status to Completed |
|
|
|
|
|
|
|
self.integration_request.update_status(data, 'Completed') |
|
|
|
self.flags.status_changed_to = "Completed" |
|
|
|
|
|
|
|
else: |
|
|
|
frappe.log_error(str(resp), 'Razorpay Payment not authorized') |
|
|
|
|
|
|
@@ -329,6 +352,63 @@ def capture_payment(is_sandbox=False, sanbox_response=None): |
|
|
|
doc.error = frappe.get_traceback() |
|
|
|
frappe.log_error(doc.error, '{0} Failed'.format(doc.name)) |
|
|
|
|
|
|
|
|
|
|
|
@frappe.whitelist(allow_guest=True) |
|
|
|
def get_api_key(): |
|
|
|
controller = frappe.get_doc("Razorpay Settings") |
|
|
|
return controller.api_key |
|
|
|
|
|
|
|
@frappe.whitelist(allow_guest=True) |
|
|
|
def get_order(doctype, docname): |
|
|
|
# Order returned to be consumed by razorpay.js |
|
|
|
doc = frappe.get_doc(doctype, docname) |
|
|
|
try: |
|
|
|
# Do not use run_method here as it fails silently |
|
|
|
return doc.get_razorpay_order() |
|
|
|
except AttributeError: |
|
|
|
frappe.log_error(frappe.get_traceback(), _("Controller method get_razorpay_order missing")) |
|
|
|
frappe.throw(_("Could not create Razorpay order. Please contact Administrator")) |
|
|
|
|
|
|
|
@frappe.whitelist(allow_guest=True) |
|
|
|
def order_payment_success(integration_request, params): |
|
|
|
"""Called by razorpay.js on order payment success, the params |
|
|
|
contains razorpay_payment_id, razorpay_order_id, razorpay_signature |
|
|
|
that is updated in the data field of integration request |
|
|
|
|
|
|
|
Args: |
|
|
|
integration_request (string): Name for integration request doc |
|
|
|
params (string): Params to be updated for integration request. |
|
|
|
""" |
|
|
|
params = json.loads(params) |
|
|
|
integration = frappe.get_doc("Integration Request", integration_request) |
|
|
|
|
|
|
|
# Update integration request |
|
|
|
integration.update_status(params, integration.status) |
|
|
|
integration.reload() |
|
|
|
|
|
|
|
data = json.loads(integration.data) |
|
|
|
controller = frappe.get_doc("Razorpay Settings") |
|
|
|
|
|
|
|
# Update payment and integration data for payment controller object |
|
|
|
controller.integration_request = integration |
|
|
|
controller.data = frappe._dict(data) |
|
|
|
|
|
|
|
# Authorize payment |
|
|
|
controller.authorize_payment() |
|
|
|
|
|
|
|
@frappe.whitelist(allow_guest=True) |
|
|
|
def order_payment_failure(integration_request, params): |
|
|
|
"""Called by razorpay.js on failure |
|
|
|
|
|
|
|
Args: |
|
|
|
integration_request (TYPE): Description |
|
|
|
params (TYPE): error data to be updated |
|
|
|
""" |
|
|
|
frappe.log_error(params, 'Razorpay Payment Failure') |
|
|
|
params = json.loads(params) |
|
|
|
integration = frappe.get_doc("Integration Request", integration_request) |
|
|
|
integration.update_status(params, integration.status) |
|
|
|
|
|
|
|
def convert_rupee_to_paisa(**kwargs): |
|
|
|
for addon in kwargs.get('addons'): |
|
|
|
addon['item']['amount'] *= 100 |
|
|
@@ -382,4 +462,4 @@ def validate_payment_callback(data): |
|
|
|
_throw() |
|
|
|
|
|
|
|
def handle_subscription_notification(doctype, docname): |
|
|
|
call_hook_method("handle_subscription_notification", doctype=doctype, docname=docname) |
|
|
|
call_hook_method("handle_subscription_notification", doctype=doctype, docname=docname) |