api.py 6.16 KB
import base64
import hashlib
import hmac
import sys
from datetime import datetime

from pyramid_rpc.jsonrpc import JsonRpcError

LIMIT = 1000
CODE_OK = 0
MSG_OK = 'Data Submitted'

import logging

log = logging.getLogger(__name__)

class JsonRpcOtherError(JsonRpcError):
    code = -32604
    message = 'Other Error'

# error terkait database
class JsonRpcNotImplementedError(JsonRpcError):
    code = -40000
    message = "Method Not Implemented"


class JsonRpcDbUrlNotFoundError(JsonRpcError):
    code = -40001
    message = "DB URL Connection Not Found"


class JsonRpcDbConnectionError(JsonRpcError):
    code = -40002
    message = "DB Connection Not Found"


class JsonRpcDataNotFoundError(JsonRpcError):
    code = -40003
    message = "Error Data Not Found"


class JsonRpcDataFoundError(JsonRpcError):
    code = -40004
    message = "Error Data Found"


# error terkait authentication dan authorization
class JsonRpcInvalidLoginError(JsonRpcError):
    code = -41001
    message = "Invalid RPC User/Password"


class JsonRpcInvalidNikError(JsonRpcError):
    code = -41002
    message = 'NIK Tidak Valid'


class JsonRpcNikFoundError(JsonRpcError):
    code = -41003
    message = 'NIK Sudah Ada'


class JsonRpcMobileFoundError(JsonRpcError):
    code = -41004
    message = 'No HP Sudah Digunakan'


class JsonRpcInvalidMobileError(JsonRpcError):
    code = -41004
    message = 'No HP Tidak Valid'


class JsonRpcInvalidDataError(JsonRpcError):
    code = -41005
    message = 'Data Tidak Valid'


class JsonRpcEmailFoundError(JsonRpcError):
    code = -41006
    message = 'e-mail Sudah Digunakan'


class JsonRpcInvalidEmailError(JsonRpcError):
    code = -41007
    message = 'e-mail Tidak Valid'


class JsonRpcMailError(JsonRpcError):
    code = -41008
    message = 'Gagal autentikasi mail server'


class JsonRpcUserFoundError(JsonRpcError):
    code = -41009
    message = 'User sudah digunakan'


class JsonRpcRegisterFailError(JsonRpcError):
    code = -41010
    message = 'Gagal Registrasi User'


class JsonRpcProfileFailError(JsonRpcError):
    code = -41011
    message = 'Gagal Update Profile'


class JsonRpcGetPasswordError(JsonRpcError):
    code = -41012
    message = 'Gagal Request Password'


class JsonRpcUserNotFoundError(JsonRpcError):
    code = -41013
    message = 'User Tidak Ada'


class JsonRpcInvalidTimeError(JsonRpcError):
    code = -41014
    message = 'Periksa Date Time Server'


class JsonRpcPermissionError(JsonRpcError):
    code = -41015
    message = 'Hak Akses dibatasi'


# error terkait transaksi
class JsonRpcInvalidInvoiceError(JsonRpcError):
    code = -50001
    message = 'Invalid No Bayar'


class JsonRpcBankNotFoundError(JsonRpcError):
    code = -51001
    message = 'Bank Not Found'


class JsonRpcBillNotFoundError(JsonRpcError):
    code = -52001
    message = 'Bill Not Found'


# class JsonRpcDataNotFoundError(JsonRpcError):
#     code = -52001
#     message = 'Data Not Found'


class JsonRpcBillAllreadyPaidError(JsonRpcError):
    code = -52002
    message = 'Bill Allready Paid'


class JsonRpcBillDifferentError(JsonRpcError):
    code = -52003
    message = 'Bill Amount Different'


class JsonRpcNtbNotFoundError(JsonRpcError):
    code = -53001
    message = 'NTB Not Found'


class JsonRpcNtbNotValidError(JsonRpcError):
    code = -53002
    message = 'NTB Not Valid'


# Reversal Message
class JsonRpcPaymentNotFoundError(JsonRpcError):
    code = -54001
    message = 'Payment Not Found'


class JsonRpcPaymentNotOwnerError(JsonRpcError):
    code = -54002
    message = 'Not Your Payment'


class JsonRpcPaymentOpenError(JsonRpcError):
    code = -54003
    message = 'Payment Open'


class JsonRpcReversedError(JsonRpcError):
    code = -54004
    message = 'Payment Reversed'


class JsonRpcReversalError(JsonRpcError):
    code = -54005
    message = 'Cannot Reversed'


class JsonRpcPaymentFoundError(JsonRpcError):
    code = -54006
    message = 'Payment Found with same invoice and ntb'


# Biller Status
class JsonRpcBillerNotFoundError(JsonRpcError):
    code = -55001
    message = 'Biller Not Found'


class JsonRpcBillerNetworkError(JsonRpcError):
    code = -55002
    message = 'Biller Network unrecognized'


class JsonRpcBillerError(JsonRpcError):
    code = -55000
    message = 'Biller Other Error'


class JsonRpcProdukNotFoundError(JsonRpcError):
    code = -56001
    message = 'Produk  Not Found'


# Biller Status
class JsonRpcCaNotRegisteredError(JsonRpcError):
    code = -56001
    message = 'CA Not Registered'


def custom_error(code, message):
    cls = JsonRpcError()
    cls.code = code
    cls.message = message
    return cls


begin_unix_time = datetime(1970, 1, 1)


def get_seconds(current_time=None):
    """
    Digunakan untuk menghitung jumlah detik sampai dengan waktu sekarang
    :param current_time: optional waktu yang akan dihitung
    :return:
    """

    if not current_time:
        current_time = datetime.utcnow()
    durasi = current_time - begin_unix_time
    return int(durasi.total_seconds())


def json_rpc_header(userid, password, key=None):
    """

    Digunakan untuk membuat header autentikasi saat akan mengirim request

    :param userid: string,
    :param password: string,
    :param key: optional string berisi kode enkripsi
    :return: {
        userid string,
        signature=string,
        key=string
        }

    """

    if not key:
        key = str(get_seconds())
    value = '&'.join([str(userid), str(key)])
    password = str(password)
    signature = hmac.new(key=str.encode(password), msg=str.encode(value),
                         digestmod=hashlib.sha256).digest()

    if sys.version < '3':
        encoded_signature = base64.encodestring(signature).replace('\n', '')
    else:
        encoded_signature = base64.encodebytes(signature).decode().replace('\n', '')
    return dict(userid=userid, signature=encoded_signature, key=key)


##############################
# Web Service Authentication #
##############################
lima_menit = 300