def validate_razorpay_credentails(self): if self.api_key and self.api_secret: try: make_get_request(url="https://api.razorpay.com/v1/payments", auth=(self.api_key, self.get_password(fieldname="api_secret", raise_exception=False))) except Exception: frappe.throw(_("Seems API Key or API Secret is wrong !!!"))
def validate_stripe_credentails(self): if self.publishable_key and self.secret_key: header = {"Authorization": "Bearer {0}".format(self.get_password(fieldname="secret_key", raise_exception=False))} try: make_get_request(url="https://api.stripe.com/v1/charges", headers=header) except Exception: frappe.throw(_("Seems Publishable Key or Secret Key is wrong !!!"))
def authorize_payment(self): """ An authorization is performed when user’s payment details are successfully authenticated by the bank. The money is deducted from the customer’s account, but will not be transferred to the merchant’s account until it is explicitly captured by merchant. """ data = json.loads(self.integration_request.data) settings = self.get_settings(data) try: resp = make_get_request("https://api.razorpay.com/v1/payments/{0}" .format(self.data.razorpay_payment_id), auth=(settings.api_key, settings.api_secret)) if resp.get("status") == "authorized": self.integration_request.update_status(data, 'Authorized') self.flags.status_changed_to = "Authorized" else: frappe.log_error(str(resp), 'Razorpay Payment not authorized') except: frappe.log_error(frappe.get_traceback()) # failed pass status = frappe.flags.integration_request.status_code redirect_to = data.get('notes', {}).get('redirect_to') or None redirect_message = data.get('notes', {}).get('redirect_message') or None if self.flags.status_changed_to == "Authorized": if self.data.reference_doctype and self.data.reference_docname: custom_redirect_to = None try: custom_redirect_to = frappe.get_doc(self.data.reference_doctype, self.data.reference_docname).run_method("on_payment_authorized", self.flags.status_changed_to) except Exception: frappe.log_error(frappe.get_traceback()) if custom_redirect_to: redirect_to = custom_redirect_to redirect_url = 'payment-success' else: redirect_url = 'payment-failed' if redirect_to: redirect_url += '?' + urlencode({'redirect_to': redirect_to}) if redirect_message: redirect_url += '&' + urlencode({'redirect_message': redirect_message}) return { "redirect_to": redirect_url, "status": status }
def capture_payment(is_sandbox=False, sanbox_response=None): """ Verifies the purchase as complete by the merchant. After capture, the amount is transferred to the merchant within T+3 days where T is the day on which payment is captured. Note: Attempting to capture a payment whose status is not authorized will produce an error. """ controller = frappe.get_doc("Razorpay Settings") for doc in frappe.get_all("Integration Request", filters={ "status": "Authorized", "integration_request_service": "Razorpay" }, fields=["name", "data"]): try: if is_sandbox: resp = sanbox_response else: data = json.loads(doc.data) settings = controller.get_settings(data) resp = make_get_request( "https://api.razorpay.com/v1/payments/{0}".format( data.get("razorpay_payment_id")), auth=(settings.api_key, settings.api_secret), data={"amount": data.get("amount")}) if resp.get('status') == "authorized": resp = make_post_request( "https://api.razorpay.com/v1/payments/{0}/capture". format(data.get("razorpay_payment_id")), auth=(settings.api_key, settings.api_secret), data={"amount": data.get("amount")}) if resp.get("status") == "captured": frappe.db.set_value("Integration Request", doc.name, "status", "Completed") except Exception: doc = frappe.get_doc("Integration Request", doc.name) doc.status = "Failed" doc.error = frappe.get_traceback() doc.save() frappe.log_error(doc.error, '{0} Failed'.format(doc.name))
def validate_payment_callback(data): def _throw(): frappe.throw(_("Invalid Subscription"), exc=frappe.InvalidStatusError) subscription_id = data.get('payload').get("subscription").get("entity").get("id") if not(subscription_id): _throw() controller = frappe.get_doc("Razorpay Settings") settings = controller.get_settings(data) resp = make_get_request("https://api.razorpay.com/v1/subscriptions/{0}".format(subscription_id), auth=(settings.api_key, settings.api_secret)) if resp.get("status") != "active": _throw()
def validate_payment_callback(data): def _throw(): frappe.throw(_("Invalid Subscription"), exc=frappe.InvalidStatusError) subscription_id = data.get('payload').get("subscription").get("entity").get("id") if not(subscription_id): _throw() controller = frappe.get_doc("midtrans Settings") settings = controller.get_settings(data) resp = make_get_request(settings.base_url +"/subscriptions/{0}".format(subscription_id), auth=(settings.client_key, settings.server_key)) if resp.get("status") != "active": _throw()
def validate_payment_callback(data): def _throw(): frappe.throw(_("Invalid Subscription"), exc=frappe.InvalidStatusError) subscription_id = data.get('payload').get("subscription").get( "entity").get("id") if not (subscription_id): _throw() controller = frappe.get_doc("Razorpay Settings") settings = controller.get_settings(data) resp = make_get_request( "https://api.razorpay.com/v1/subscriptions/{0}".format( subscription_id), auth=(settings.api_key, settings.api_secret)) if resp.get("status") != "active": _throw()
def authorize_payment(self): """ An authorization is performed when user’s payment details are successfully authenticated by the bank. The money is deducted from the customer’s account, but will not be transferred to the merchant’s account until it is explicitly captured by merchant. """ data = json.loads(self.integration_request.data) settings = self.get_settings(data) try: resp = make_get_request( "https://api.razorpay.com/v1/payments/{0}".format( self.data.razorpay_payment_id), auth=(settings.api_key, settings.api_secret)) if resp.get("status") == "authorized": 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 # razorpay refunds the amount after authorizing the card details # thus changing status to Verified self.integration_request.update_status(data, 'Completed') self.flags.status_changed_to = "Verified" else: frappe.log_error(str(resp), 'Razorpay Payment not authorized') except: frappe.log_error(frappe.get_traceback()) # failed pass status = frappe.flags.integration_request.status_code redirect_to = data.get('redirect_to') or None redirect_message = data.get('redirect_message') or None if self.flags.status_changed_to in ("Authorized", "Verified", "Completed"): if self.data.reference_doctype and self.data.reference_docname: custom_redirect_to = None try: frappe.flags.data = data custom_redirect_to = frappe.get_doc( self.data.reference_doctype, self.data.reference_docname).run_method( "on_payment_authorized", self.flags.status_changed_to) except Exception: frappe.log_error(frappe.get_traceback()) if custom_redirect_to: redirect_to = custom_redirect_to redirect_url = 'payment-success?doctype={0}&docname={1}'.format( self.data.reference_doctype, self.data.reference_docname) else: redirect_url = 'payment-failed' if redirect_to: redirect_url += '&' + urlencode({'redirect_to': redirect_to}) if redirect_message: redirect_url += '&' + urlencode( {'redirect_message': redirect_message}) return {"redirect_to": redirect_url, "status": status}
def authorize_payment(self): """ An authorization is performed when user’s payment details are successfully authenticated by the bank. The money is deducted from the customer’s account, but will not be transferred to the merchant’s account until it is explicitly captured by merchant. """ data = json.loads(self.integration_request.data) settings = self.get_settings(data) redirect_to = data.get('notes', {}).get('redirect_to') or None redirect_message = data.get('notes', {}).get('redirect_message') or None try: resp = make_get_request( "https://api.razorpay.com/v1/payments/{0}".format( self.data.razorpay_payment_id), auth=(settings.api_key, settings.api_secret)) if resp.get("status") == "authorized": self.integration_request.db_set('status', 'Authorized', update_modified=False) self.flags.status_changed_to = "Authorized" else: frappe.log_error(str(resp), 'Razorpay Payment not authorized') except: frappe.log_error(frappe.get_traceback()) # failed pass status = frappe.flags.integration_request.status_code if self.flags.status_changed_to == "Authorized": if self.data.reference_doctype and self.data.reference_docname: custom_redirect_to = None try: custom_redirect_to = frappe.get_doc( self.data.reference_doctype, self.data.reference_docname).run_method( "on_payment_authorized", self.flags.status_changed_to) except Exception: frappe.log_error(frappe.get_traceback()) if custom_redirect_to: redirect_to = custom_redirect_to redirect_url = 'payment-success' else: redirect_url = 'payment-failed' if redirect_to: redirect_url += '?' + urlencode({'redirect_to': redirect_to}) if redirect_message: redirect_url += '&' + urlencode( {'redirect_message': redirect_message}) return {"redirect_to": redirect_url, "status": status}
def authorize_payment(self): """ An authorization is performed when user’s payment details are successfully authenticated by the bank. The money is deducted from the customer’s account, but will not be transferred to the merchant’s account until it is explicitly captured by merchant. """ data = json.loads(self.integration_request.data) settings = self.get_settings(data) try: resp = make_get_request("https://api.razorpay.com/v1/payments/{0}" .format(self.data.razorpay_payment_id), auth=(settings.api_key, settings.api_secret)) if resp.get("status") == "authorized": self.integration_request.update_status(data, 'Authorized') self.flags.status_changed_to = "Authorized" elif data.get('subscription_id'): if resp.get("status") == "refunded": # if subscription start date is in future then # razorpay refunds the amount after authorizing the card details # thus changing status to Verified 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') except: frappe.log_error(frappe.get_traceback()) # failed pass status = frappe.flags.integration_request.status_code redirect_to = data.get('notes', {}).get('redirect_to') or None redirect_message = data.get('notes', {}).get('redirect_message') or None if self.flags.status_changed_to in ("Authorized", "Verified", "Completed"): if self.data.reference_doctype and self.data.reference_docname: custom_redirect_to = None try: frappe.flags.data = data custom_redirect_to = frappe.get_doc(self.data.reference_doctype, self.data.reference_docname).run_method("on_payment_authorized", self.flags.status_changed_to) except Exception: frappe.log_error(frappe.get_traceback()) if custom_redirect_to: redirect_to = custom_redirect_to redirect_url = 'payment-success?doctype={0}&docname={1}'.format(self.data.reference_doctype, self.data.reference_docname) else: redirect_url = 'payment-failed' if redirect_to: redirect_url += '&' + urlencode({'redirect_to': redirect_to}) if redirect_message: redirect_url += '&' + urlencode({'redirect_message': redirect_message}) return { "redirect_to": redirect_url, "status": status }