예제 #1
0
	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 !!!"))
예제 #2
0
	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 !!!"))
예제 #3
0
	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
		}
예제 #4
0
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))
예제 #5
0
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()
예제 #7
0
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()
예제 #8
0
    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}
예제 #9
0
    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}
예제 #10
0
	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
		}