diff --git a/app/api/helpers/payment.py b/app/api/helpers/payment.py index 5c1d503b89..3eddcfb74d 100644 --- a/app/api/helpers/payment.py +++ b/app/api/helpers/payment.py @@ -3,6 +3,7 @@ import paypalrestsdk import requests import stripe +import omise from forex_python.converter import CurrencyRates from app.api.helpers.cache import cache @@ -243,3 +244,29 @@ def charge_source(order_identifier): source=order.order_notes, ) return charge + + +class OmisePaymentsManager(object): + """ + Class to manage Omise Payments + """ + + @staticmethod + def charge_payment(order_identifier, token): + if get_settings()['app_environment'] == Environment.PRODUCTION: + omise.api_secret = get_settings()['omise_test_secret'] + omise.api_public = get_settings()['omise_test_public'] + else: + omise.api_secret = get_settings()['omise_test_secret'] + omise.api_public = get_settings()['omise_test_public'] + order = safe_query(db, Order, 'identifier', order_identifier, 'identifier') + charge = omise.Charge.create( + amount=int(round(order.amount)), + currency=order.event.payment_currency, + card=token, + metadata={ + "order_id": str(order_identifier), + "status": True + }, + ) + return charge diff --git a/app/api/orders.py b/app/api/orders.py index 66a08eebec..2c0d933f58 100644 --- a/app/api/orders.py +++ b/app/api/orders.py @@ -1,6 +1,7 @@ from datetime import datetime - from flask import request, jsonify, Blueprint, url_for, redirect +import omise +import logging from flask_jwt import current_identity as current_user from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship @@ -33,7 +34,7 @@ from app.models.order import Order, OrderTicket, get_updatable_fields from app.models.ticket_holder import TicketHolder from app.models.user import User -from app.api.helpers.payment import AliPayPaymentsManager +from app.api.helpers.payment import AliPayPaymentsManager, OmisePaymentsManager order_misc_routes = Blueprint('order_misc', __name__, url_prefix='/v1') @@ -499,3 +500,32 @@ def alipay_return_uri(order_identifier): return jsonify(status=False, error='Charge object failure') except TypeError: return jsonify(status=False, error='Source object status error') + + +@order_misc_routes.route('/orders//omise-checkout', methods=['POST', 'GET']) +def omise_checkout(order_identifier): + """ + Charging the user and returning payment response for Omise Gateway + :param order_identifier: + :return: JSON response of the payment status. + """ + token = request.form.get('omiseToken') + order = safe_query(db, Order, 'identifier', order_identifier, 'identifier') + order.status = 'completed' + save_to_db(order) + try: + charge = OmisePaymentsManager.charge_payment(order_identifier, token) + print(charge.status) + except omise.errors.BaseError as e: + logging.error(f"""OmiseError: {repr(e)}. See https://www.omise.co/api-errors""") + return jsonify(status=False, error="Omise Failure Message: {}".format(str(e))) + except Exception as e: + logging.error(repr(e)) + if charge.failure_code is not None: + logging.warning("Omise Failure Message: {} ({})".format(charge.failure_message, charge.failure_code)) + return jsonify(status=False, error="Omise Failure Message: {} ({})". + format(charge.failure_message, charge.failure_code)) + else: + logging.info(f"Successful charge: {charge.id}. Order ID: {order_identifier}") + + return redirect(make_frontend_url('orders/{}/view'.format(order_identifier))) diff --git a/requirements/common.txt b/requirements/common.txt index 9d69bf0d28..77fd178253 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -7,6 +7,7 @@ Flask-Login~=0.4 Flask-Scrypt~=0.1.3 Flask-JWT~=0.3.2 flask-celeryext~=0.3 +omise~=0.8.1 requests-oauthlib~=0.8 icalendar~=3.12 requests[security]~=2.22