Commit 26951636 by Solo Group

cc

1 parent d5170a73
kode,path,nama,status,type kode,path,nama,status,type
api-merchant-home,/api/merchant/home,Api Merchant Home,1,0 api-merchant-home,/api/merchant/home,Api Merchant Home,1,0
api-merchant,/api/merchant,Api Merchant,1,1 api-merchant,/api/merchant,Api Merchant,1,1
api-vendor-notify,/api/vendor/{name}/notify,Api Vendor Notify,1,0
api-merchant-register,/api/merchant/register,Api Merchant Payment,1,0 api-merchant-register,/api/merchant/register,Api Merchant Payment,1,0
api-merchant-payment,/api/merchant/payment,Api Merchant Payment,1,0 api-merchant-payment,/api/merchant/payment,Api Merchant Payment,1,0
api-vendor-notify,/api/vendor/{name}/notify,Api Vendor Notify,1,0
api-vendor-callback,/api/vendor/{name}/callback,Api Vendor Callback,1,0
api-merchant-list,/api/merchant/list,Test Api Merchant,1,0 api-merchant-list,/api/merchant/list,Test Api Merchant,1,0
api-merchant-add,/api/merchant/add,Add Api Merchant,1,0 api-merchant-add,/api/merchant/add,Add Api Merchant,1,0
......
...@@ -12,7 +12,7 @@ from ..tools import JsonRpcInvoiceFoundError, JsonRpcError ...@@ -12,7 +12,7 @@ from ..tools import JsonRpcInvoiceFoundError, JsonRpcError
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def build_request(typ, vendor_produk, partner_log=None): def build_request(typ, vendor_produk, partner_log=None, **kwargs):
# produk_id = values['produk_id'] # produk_id = values['produk_id']
# vendor_id = values['vendor_id'] # vendor_id = values['vendor_id']
# bill_no = values['destination'] # bill_no = values['destination']
...@@ -28,7 +28,7 @@ def build_request(typ, vendor_produk, partner_log=None): ...@@ -28,7 +28,7 @@ def build_request(typ, vendor_produk, partner_log=None):
log.info("Module: %s Pckgs: %s" % (modul, pckgs)) log.info("Module: %s Pckgs: %s" % (modul, pckgs))
modul = '.' + modul modul = '.' + modul
modules = import_module(modul, pckgs) modules = import_module(modul, pckgs)
cls_module = modules.Vendor(vendor_produk, partner_log) cls_module = modules.Vendor(vendor_produk, partner_log, **kwargs)
cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if cls: if cls:
result = cls() result = cls()
......
...@@ -6,25 +6,88 @@ from opensipkd.base.models import Partner, flush_row ...@@ -6,25 +6,88 @@ from opensipkd.base.models import Partner, flush_row
from opensipkd.base.tools.api import (auth_from_rpc, from opensipkd.base.tools.api import (auth_from_rpc,
JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError, JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError,
JsonRpcParameterNotFound) JsonRpcParameterNotFound)
from opensipkd.base.views import BaseView
from opensipkd.pasar.models import Produk, PartnerProduk from opensipkd.pasar.models import Produk, PartnerProduk
from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, PartnerLog, PartnerPay from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, PartnerLog, PartnerPay
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
from pyramid_rpc.jsonrpc import jsonrpc_method from pyramid_rpc.jsonrpc import jsonrpc_method
from ..tools import JsonRpcInvoiceFoundError, JsonRpcError from ..tools import JsonRpcInvoiceFoundError, JsonRpcError, get_settings
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def save_partner_pay(values, vendor_produk): def save_partner_pay(values, vendor_produk, row=None):
partner_pay = PartnerPay() if not row:
partner_pay.from_dict(values) row = PartnerPay()
partner_pay.vendor_id = vendor_produk.partner_id
partner_pay.produk_id = vendor_produk.produk.id
flush_row(partner_pay)
return partner_pay
row.from_dict(values)
row.vendor_id = vendor_produk.partner_id
row.produk_id = vendor_produk.produk.id
flush_row(row)
return row
def build_register(vendor_produk, partner_log=None):
return build_request('register', vendor_produk, partner_log) def build_register(vendor_produk, partner_log=None, **kwargs):
return build_request('register', vendor_produk, partner_log, **kwargs)
def set_register_values(dat, customer):
billing = dat["customer"]
deliver_to = dat["deliver_to"]
server = dat["server"]
produk = 'produk' in dat and dat["produk"] or ''
values = dict(
customer_id=customer.id,
# id_pel=dat['id_pel'],
cart=produk or '{}',
cust_inv_no=dat["invoice_no"],
amt_sell=dat['amount'],
notes=dat['description'],
inv_cust_nm=billing['name'],
inv_cust_phone=billing['phone'],
inv_cust_email=billing['email'],
inv_cust_city=billing['city'],
inv_cust_state=billing['state'],
inv_cust_pos=billing['post_code'],
inv_cust_country=billing['country'],
inv_cust_addr=billing['address'],
inv_cust_agent=billing['agent'],
inv_cust_ip=billing['ip'],
inv_cust_session=billing['session_id'],
domain=server['domain'],
server_ip=server['ip'],
description=dat['description'],
delivery_addr=deliver_to['address'],
delivery_city=deliver_to['city'],
delivery_country=deliver_to['country'],
delivery_nm=deliver_to['name'],
delivery_phone=deliver_to['phone'],
delivery_pos=deliver_to['post_code'],
delivery_state=deliver_to['state'],
fee=dat['fee'],
vat=dat['vat'],
req_dt=dat['req_dt'],
req_tm=dat['req_tm'],
inv_time_stamp=dat['time_stamp'] or '',
# va
inv_valid_date='valid_date' in dat and dat['valid_date'] or '',
inv_valid_time='valid_time' in dat and dat['valid_time'] or '',
inv_cust_va='cust_va' in dat and dat['cust_va'] or '',
# m_ref_no=dat['m_ref_no'] or '',
# notax_amt=dat['notax_amt'],
# pay_valid_dt=dat['pay_valid_dt'],
# pay_valid_tm=dat['pay_valid_tm'],
# out
# tx_id=dat['tx_id'],
# trans_dt=dat['trans_dt'],
# trans_tm=dat['trans_tm'],
)
return values
@jsonrpc_method(method='register', endpoint='api-merchant') @jsonrpc_method(method='register', endpoint='api-merchant')
...@@ -57,11 +120,13 @@ def register(request, data, **kwargs): ...@@ -57,11 +120,13 @@ def register(request, data, **kwargs):
i = 0 i = 0
if not data: if not data:
raise JsonRpcParameterNotFound raise JsonRpcParameterNotFound
is_list = type(data) == list is_list = type(data) == list
data = is_list and data or [data] data = is_list and data or [data]
customer = Partner.query_user(user).first() customer = Partner.query_user(user).first()
if not customer: if not customer:
raise JsonRpcCustomerNotFoundError raise JsonRpcCustomerNotFoundError
r_data = [] r_data = []
log.info("%s Payment Request: %s" % (customer.kode, data)) log.info("%s Payment Request: %s" % (customer.kode, data))
for dat in data: for dat in data:
...@@ -72,72 +137,51 @@ def register(request, data, **kwargs): ...@@ -72,72 +137,51 @@ def register(request, data, **kwargs):
dat['code'] = -1 dat['code'] = -1
else: else:
inv_no = dat["invoice_no"] inv_no = dat["invoice_no"]
produk = 'produk' in dat and dat["produk"] or '' row = PartnerPay.query().filter_by(cust_inv_no=inv_no).first()
# todo cek apakah invoice sudah ada atau belum if row and row.status>0:
ar_invoice = PartnerPay.query().filter_by(cust_inv_no=inv_no).first()
if ar_invoice:
raise JsonRpcInvoiceFoundError() raise JsonRpcInvoiceFoundError()
vendor_kd = "vendor_kd" in dat and dat["vendor_kd"] or None
produk_kd = 'denom' in dat and dat['denom'] or None produk_kd = 'denom' in dat and dat['denom'] or None
vendor_produk = get_vendor_produk(produk_kd) vendor_produk = get_vendor_produk(produk_kd, vendor_kd=vendor_kd)
if not vendor_produk: if not vendor_produk:
raise JsonRpcProdukNotFoundError raise JsonRpcProdukNotFoundError
values = dict( values = set_register_values(dat, customer)
customer_id=customer.id, credit_card = "credit_card" in dat and dat["credit_card"] or {}
id_pel=dat['id_pel'], if credit_card:
cart=produk or '{}', values.update(dict(
cust_inv_no=inv_no, instmnt_mon = 'instmnt_mon' in credit_card and credit_card['instmnt_mon'] or '',
amt_sell=dat['amount'], instmnt_type = 'instmnt_type' in credit_card and credit_card['instmnt_type'] or '',
notes=dat['goods_nm'], recurr_opt = 'recurr_opt' in credit_card and credit_card['recurr_opt'] or 0,
inv_cust_nm=dat['cust_nm'], card_no = 'card_no' in credit_card and credit_card['card_no'] or 0,
inv_cust_phone=dat['cust_phone'], ))
inv_cust_email=dat['cust_email'], ccard = (dict(
inv_cust_city=dat['cust_city'], card_cvv=credit_card["card_cvv"],
inv_cust_state=dat['cust_state'], card_exp=credit_card["card_exp"],
inv_cust_pos=dat['cust_pos'], card_name=credit_card["card_name"]
inv_cust_country=dat['cust_country'], ))
inv_cust_addr=dat['cust_addr'], else:
domain=dat['domain'], ccard = None
server_ip=dat['server_ip'],
inv_cust_agent=dat['cust_agent'], va = "va" in dat and dat["va"] or {}
inv_cust_ip=dat['cust_ip'], if va:
inv_cust_session=dat['cust_session_id'], values.update(dict(
description=dat['description'], inv_valid_date='valid_date' in va and va['valid_date'] or '',
delivery_addr=dat['delivery_addr'], inv_valid_time='valid_time' in va and va['valid_time'] or '',
delivery_city=dat['delivery_city'], inv_cust_va='fix_acct_id' in va and va['fix_acct_id'] or '',
delivery_country=dat['delivery_country'], ))
delivery_nm=dat['delivery_nm'],
delivery_phone=dat['delivery_phone'], ar_invoice = save_partner_pay(values, vendor_produk, row)
delivery_pos=dat['delivery_pos'], result = build_register(vendor_produk, ar_invoice, ccard=ccard)
delivery_state=dat['delivery_state'], #table payment di update lagi
fee=dat['fee'],
vat=dat['vat'],
req_dt=dat['req_dt'],
req_tm=dat['req_tm'],
inv_time_stamp=dat['time_stamp'] or '',
# va
inv_valid_date='valid_date' in dat and dat['valid_date'] or '',
inv_valid_time='valid_time' in dat and dat['valid_time'] or '',
inv_cust_va='cust_va' in dat and dat['cust_va'] or '',
# cc
instmnt_mon='instmnt_mon' in dat and dat['instmnt_mon'] or '',
instmnt_type='instmnt_type' in dat and dat['instmnt_type'] or '',
recurr_opt='recurr_opt' in dat and dat['recurr_opt'] or 0,
# m_ref_no=dat['m_ref_no'] or '',
# notax_amt=dat['notax_amt'],
# pay_valid_dt=dat['pay_valid_dt'],
# pay_valid_tm=dat['pay_valid_tm'],
# out
# tx_id=dat['tx_id'],
# trans_dt=dat['trans_dt'],
# trans_tm=dat['trans_tm'],
)
ar_invoice = save_partner_pay(values, vendor_produk)
result = build_register(vendor_produk, ar_invoice)
dat.update(result["f_result"]) dat.update(result["f_result"])
if "form" in result:
dat.update(dict(form=result["form"]))
# request.environ["application"]="text/html"
# request.response()
# return request.response
r_data.append(dat) r_data.append(dat)
...@@ -146,6 +190,34 @@ def register(request, data, **kwargs): ...@@ -146,6 +190,34 @@ def register(request, data, **kwargs):
return data return data
class ViewData(BaseView):
@view_config(route_name='api-merchant-payment',
renderer='templates/form-clean.pt')
def view_form(self):
# request = self.req
# flash = request.session.flash
# print(">>>>>", request.environ)
# print(">>>>", request.POST, request)
# if request.POST:
# data = dict(request.POST.items())
# if "tXid" in "data":
# row = PartnerPay.query_id(data["tXid"]).first()
# if not row:
# flash('Pembayaran tidak ditemukan', "error")
# return dict()
# vendor = row.vendor
# produk_vendor = PartnerProduk.query()\
# .filter_by(partner_id=row.vendor_id,
# produk_id = row.produk_id,)\
# .first()
#
# else:
# flash('Method POST Required', "error")
# return dict()
settings = get_settings()
url = settings["np_url"]+'/payment'
return HTTPFound(url)
# @jsonrpc_method(method='advice', endpoint='api-merchant') # @jsonrpc_method(method='advice', endpoint='api-merchant')
# def advice(request, data): # def advice(request, data):
# """ # """
...@@ -397,3 +469,4 @@ def register(request, data, **kwargs): ...@@ -397,3 +469,4 @@ def register(request, data, **kwargs):
# data[i]=r_data # data[i]=r_data
# i += 1 # i += 1
# return data # return data
...@@ -8,6 +8,7 @@ import xmltodict ...@@ -8,6 +8,7 @@ import xmltodict
from agratek.api.merchant.views.vendor import sha256 from agratek.api.merchant.views.vendor import sha256
from opensipkd.base.models import Partner, flush_row from opensipkd.base.models import Partner, flush_row
from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config from pyramid.view import view_config
from ..tools import get_settings, get_jsonrpc from ..tools import get_settings, get_jsonrpc
...@@ -31,10 +32,13 @@ def update_harga(p, k, v): ...@@ -31,10 +32,13 @@ def update_harga(p, k, v):
return True return True
def callback_merchant(order): def purchase_notify(order):
# Callback to merchant # Callback to merchant
invoice = order.invoice if hasattr(order, "customer_id"):
customer = invoice.customer customer = order.customer
else:
invoice = order.invoice
customer = invoice.customer
if customer and customer.website: if customer and customer.website:
url = customer.website url = customer.website
...@@ -69,6 +73,27 @@ def callback_merchant(order): ...@@ -69,6 +73,27 @@ def callback_merchant(order):
except: except:
pass pass
def payment_notify(order):
customer = order.customer
if customer and customer.website:
url = customer.website
users = customer.users
typ = "PAYMENT"
key = order.cust_inv_no + users.user_name + users.api_key + typ
signature = sha256(key)
data = dict(
invoice_no=order.cust_inv_no,
signature=signature,
type=typ
)
data.update(order.notify["result"])
js = get_jsonrpc(method="notify", params=dict(data=data))
log.info("Notify: %s %s" % (url, js))
try:
requests.post(url, data=js, timeout=20)
except:
pass
def proses_np(data): def proses_np(data):
# todo: # todo:
...@@ -78,22 +103,29 @@ def proses_np(data): ...@@ -78,22 +103,29 @@ def proses_np(data):
@view_config(route_name='api-vendor-notify', renderer='json') @view_config(route_name='api-vendor-notify', renderer='json')
def api_vendor_notify(request): def api_vendor_notify(request):
vendor_nm = request.matchdict['name'] vendor_nm = request.matchdict['name']
if vendor_nm == "odeo": data = json.loads(request.text)
data = json.loads(request.text)
elif vendor_nm == "np":
data = json.loads(request.text)
modul = '.notify' modul = '.notify'
pckgs = 'agratek.api.merchant.views.{}'.format(vendor_nm) pckgs = 'agratek.api.merchant.views.{}'.format(vendor_nm)
moduls = import_module(modul, pckgs) moduls = import_module(modul, pckgs)
typ = 'proses' typ = 'proses'
# moduls(data)
cls = hasattr(moduls, typ) and getattr(moduls, typ) or None cls = hasattr(moduls, typ) and getattr(moduls, typ) or None
if cls: if cls:
order = cls(data) order = cls(data)
@view_config(route_name='api-vendor-callback')
def api_vendor_callback(request):
vendor_nm = request.matchdict['name']
modul = '.callback'
pckgs = 'agratek.api.merchant.views.{}'.format(vendor_nm)
moduls = import_module(modul, pckgs)
typ = 'callback'
cls = hasattr(moduls, typ) and getattr(moduls, typ) or None
if cls:
cb = cls(request)
return HTTPFound(cb)
@view_config(route_name='api-vendor-test', renderer="string") @view_config(route_name='api-vendor-test', renderer="string")
def vendor_test(request): def vendor_test(request):
params = request.params params = request.params
......
from _sha256 import sha256
import logging
from agratek.api.merchant.views.notify_vendor import purchase_notify, update_harga
from opensipkd.base import get_settings
from opensipkd.base.models import Partner, flush_row
from opensipkd.pasar.models import H2hArInvoiceDet
from opensipkd.pasar.models.produk import PartnerPay
log = logging.getLogger(__name__)
def callback(request):
data = dict(request.POST.items())
tx_id = data["tXid"]
if tx_id:
row = PartnerPay.query_txid(tx_id).first()
return row.callback_url
from _sha256 import sha256 from _sha256 import sha256
import logging import logging
from agratek.api.merchant.views.notify_vendor import callback_merchant, update_harga from agratek.api.merchant.views.notify_vendor import purchase_notify, update_harga, payment_notify
from opensipkd.base import get_settings from opensipkd.base import get_settings
from opensipkd.base.models import Partner, flush_row from opensipkd.base.models import Partner, flush_row
from opensipkd.pasar.models import H2hArInvoiceDet from opensipkd.pasar.models import H2hArInvoiceDet
from opensipkd.pasar.models.produk import PartnerPay
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def proses(data): def proses(data):
# todo:
"""
change settig from odeo to np
"""
settings = get_settings() settings = get_settings()
mid = 'odeo_mid' in settings and settings["odeo_mid"] or None mid = 'np_mid' in settings and settings["np_mid"] or None
key = 'odeo_key' in settings and settings["odeo_key"] or None key = 'np_key' in settings and settings["np_key"] or None
partner = Partner.query_kode("ODEO").first() partner = Partner.query_kode("NP").first()
status = str(data["status"]) status = str(data["status"])
if status == "BROADCAST_NEW_PRICE": amount = data["amt"]
signature = sha256("{mid}{key}{status}".format( tx_id = data["tXid"]
mid=mid, key=key, status=status)) merchant_token = data["merchantToken"]
ref_no = data["referenceNo"]
signature = sha256("{mid}{tx_id}{amount}{key}"\
.format(mid=mid, key=key, amount=str(amount),
tx_id=tx_id))
if merchant_token!=signature:
return
if signature != data["signature"]: pay = PartnerPay.query_txid(tx_id).filter(cust_inv_no=ref_no).first()
log.info("Signature Vendor Different") if not pay:
log.info("local %s, vendor %s" % (signature, data["signature"])) return
return dict(error="Signature different")
new_price = data["new_prices"] result=dict()
for k in new_price: pay.notify= dict(response=data,
v = new_price[k] result=result)
update_harga(partner, k, v) pay.status = 1
return dict(success=True) flush_row(pay)
payment_notify(pay)
else: return pay
order_id = str(data["order_id"])
signature = sha256("{order_id}{mid}{key}{status}".format(
order_id=order_id, mid=mid, key=key, status=status))
if signature != data["signature"]:
log.info("Signature Vendor Different")
log.info("local %s, vendor %s" % (signature, data["signature"]))
return dict(error="Signature Different")
order = H2hArInvoiceDet.query() \
.filter(H2hArInvoiceDet.vendor_id == partner.id,
H2hArInvoiceDet.vend_inv_no == str(order_id)).first()
if order: """
if status == "COMPLETED": Common Parameter for Notification
order.status = 1
else:
order.status = -3
order.notify = dict(post=data)
if "sn" in data and data["sn"]:
order.serial_number = data["sn"]
else:
message = 'message' in data and data["message"] or ""
if message:
loc = message.find("SN: ")
if loc>-1:
sn = message[loc+4:loc+28]
order.serial_number=sn
flush_row(order) Parameter Type Size Description
# todo: add to customer notify table tXid N 30 Transaction ID
# todo: create cron for notify merchantToken AN 255 Merchant Token
# proses jika status 1 notify ada isinya tapi belum ada field result referenceNo N 40 Merchant Order No
# todo: create cron torecurring order to other vendor payMethod N 2 Payment method. Refer Code at Here
# jika status = -2 proses vendor yang lain amt N 12 Payment amount
callback_merchant(order) transDt N 8 Transaction date
return order transTm N 6 Transaction time
currency N 3 Currency
goodsNm N 100 Goods name
billingNm N 30 Billing name
matchCl N 1 Payment amount match flag. Refer Code at Here
status AN 1 Deposit Status
0: Deposit
1: Reversal
Additional Parameter for Credit Card Notification
Parameter Type Size Description
authNo N 10 Approval number
IssueBankCd A 4 Issue bank code. Refer Code at Here
IssueBankNm A Issue bank name.
acquBankCd A Acquire bank code. Refer Code at Here
acquBankNm A Acquire bank name.
cardNo AN 20 Card no with masking
cardExpYymm N Card expiry (YYMM)
instmntMon N 2 Installment month
instmntType N 2 Installment Type. Refer Code at Here
preauthToken AN 255 Preauth Token
recurringToken AN 255 Recurring token
ccTransType AN 2 Credit card transaction type
1: Normal
2: Recurring
3: Pre-auth
4: Captured
vat N 12 Vat number
fee N 12 service fee
notaxAmt N 12 tax free amount
Additional Parameter for Virtual Account Notification
Parameter Type Size Description
bankCd N 4 Bank Code. Refer Code at Here
vacctNo N 16 Bank Virtual Account number
vacctValidDt N 8 VA expiry date
vacctValidTm N 6 VA expiry time
depositDt N Deposit date
depositTm N Deposit time
Additional Parameter for Others Payment Method Notification
Parameter Type Size Description
mitraCd A 4 Mitra Code. Refer Code at Here
payNo N 12 Pay number to mitra
payValidDt N 8 CVS expiry date
payValidTm N 6 CVS expiry time
receiptCode ANS 20 Authorization number
mRefNo AN 18 Bank reference No
depositDt N Deposit date
depositTm N Deposit time
"""
from _sha256 import sha256 from _sha256 import sha256
import logging import logging
from agratek.api.merchant.views.notify_vendor import callback_merchant, update_harga from agratek.api.merchant.views.notify_vendor import purchase_notify, update_harga
from opensipkd.base import get_settings from opensipkd.base import get_settings
from opensipkd.base.models import Partner, flush_row from opensipkd.base.models import Partner, flush_row
from opensipkd.pasar.models import H2hArInvoiceDet from opensipkd.pasar.models import H2hArInvoiceDet
...@@ -64,5 +64,5 @@ def proses(data): ...@@ -64,5 +64,5 @@ def proses(data):
# proses jika status 1 notify ada isinya tapi belum ada field result # proses jika status 1 notify ada isinya tapi belum ada field result
# todo: create cron torecurring order to other vendor # todo: create cron torecurring order to other vendor
# jika status = -2 proses vendor yang lain # jika status = -2 proses vendor yang lain
callback_merchant(order) purchase_notify(order)
return order return order
"""
Module proses:
Save
Invoice To Vendor
Invoice To Customer
"""
import hashlib
import json
import logging
import re
from datetime import datetime
from importlib import import_module
import colander
import requests
import xmltodict
from deform import widget, Form, ValidationFailure
# from opensipkd.pasar.models import PartnerLog
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
from . import BaseView # , save_file_upload
from ..models import (DBSession, flush_row, Partner, PartnerProduk)
from ..models import (Produk, ProdukKategori)
from ..tools import (btn_next, date_from_str, get_settings, btn_reset,
btn_inquiry, btn_advice, btn_payment)
log = logging.getLogger(__name__)
from ..views import deferred_vendor, deferred_customer, deferred_produk
def build_request(typ, values):
produk_id = values['produk_id']
vendor_id = values['vendor_id']
# bill_no = values['destination']
# customer_id = 'customer_id' in values and values['customer_id'] or None
# cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None
vendor_product = PartnerProduk.query() \
.join(Produk, PartnerProduk.produk_id == Produk.id) \
.filter(PartnerProduk.partner_id == vendor_id,
PartnerProduk.produk_id == produk_id).first()
if not vendor_product:
return dict(data=dict(error='Data Tidak Ditemukan'))
modules = import_module('.' + vendor_product.modules, 'agratek.api.merchant.views')
cls_module = modules.Vendor(vendor_product, values=values)
cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if cls:
data = cls()
result = dict(data=data)
result["f_request"] = cls_module.request
result["f_response"] = cls_module.response
result["url"] = cls_module.url
else:
result = dict(data=dict(error='Fungsi %s tidak ada' % typ,
code=9999))
return result
class AddSchema(colander.Schema):
customer_id = colander.SchemaNode(
colander.Integer(), title='Payment Type',
oid="customer_id", widget=deferred_customer)
cust_inv_no = colander.SchemaNode(
colander.String(), title='No Invoice',
missing=colander.drop,
oid="destination")
produk_id = colander.SchemaNode(
colander.Integer(), title='Payment Type',
oid="produk_id", widget=deferred_produk)
amount = colander.SchemaNode(
colander.Integer(), title='Jumlah',
oid="amount")
vendor_id = colander.SchemaNode(
colander.Integer(), title='Vendor',
missing = colander.drop,
oid="vendor_id", widget=deferred_vendor)
card_no = colander.SchemaNode(
colander.String(), title='No. Kartu',
missing=colander.drop,
oid="card_no")
card_exp = colander.SchemaNode(
colander.String(), title='Expire (YYMM)',
missing=colander.drop,
widget = widget.TextInputWidget(min_len=4, max_len=4),
oid="card_exp")
card_cvv = colander.SchemaNode(
colander.String(), title='Valid',
missing=colander.drop,
widget=widget.TextInputWidget(min_len=3, max_len=3),
oid="card_cvv")
f_result = colander.SchemaNode(
colander.String(), title='Result to Merchant',
missing=colander.drop,
oid="f_result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_request = colander.SchemaNode(
colander.String(), title='Request',
missing=colander.drop,
oid="f_request",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_response = colander.SchemaNode(
colander.String(), title='Response',
missing=colander.drop,
oid="f_response",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
class EditSchema(AddSchema):
id = colander.SchemaNode(
colander.Integer(), title='ID',
missing=colander.drop,
oid="id", widget=widget.HiddenWidget())
def form_validator(form, value):
pass
def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator)
schema = schema.bind(vendor=Produk.get_vendor_payment_list(),
produk=Produk.get_payment_list(),
customer=Partner.get_customer_list())
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
buttons = (btn_inquiry, btn_reset)
return Form(schema, buttons=buttons)
def route_list(request):
return HTTPFound(location=request.route_url('simkel-permohonan'))
def save(values, row):
if not row:
row = PartnerLog()
row.create_uid = values['uid']
row.created = datetime.now()
else:
row.update_uid = values['uid']
row.updated = datetime.now()
row.from_dict(values)
flush_row(row)
return row
def save_request(request, values, row=None):
values['tgl_lahir'] = date_from_str(values['tgl_lahir'])
values['uid'] = request.user.id
row = save(values, row)
request.session.flash('Data %s Berhasil disimpan' % values['nama'])
return row
form_params_edit = dict(scripts="""
$(document).ready(function(){
$(".tanggal").datepicker({format:"dd-mm-yyyy"});
$(".tanggal").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
form_params_view = dict(scripts="""
$(document).ready(function(){
$("#nip_penerima, #nopel").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
def query_id(request):
id = request.matchdict['id']
return PartnerProduk.query_id(id)
class ViewHome(BaseView):
@view_config(route_name='api-payment-doc',
permission="api-payment",
renderer='templates/payment_doc.pt')
def view_merchant_doc(self):
return dict()
@view_config(route_name='api-payment-add',
permission="api-payment-add",
renderer='templates/form.pt')
def view_home(self):
request = self.req
session = self.ses
form = get_form(request, AddSchema, (btn_inquiry, btn_payment, btn_advice, btn_next))
settings = get_settings()
if request.POST:
controls = request.POST.items()
try:
c = form.validate(controls)
except ValidationFailure as e:
form.set_appstruct(e.cstruct)
return dict(form=form, params=form_params_edit)
values = dict(c.items())
result = None
if 'inquiry' in request.POST:
result = build_request('inquiry', values)
# if product_kd == "crc" or product_kd[:3]=="EWL":
# return HTTPFound('api-cc-form', params=result["params"])
elif 'payment' in request.POST:
result = build_request('payment', values)
elif 'advice' in request.POST:
result = build_request('advice', values)
elif 'info' in request.POST:
result = build_request('info', values)
if result and 'data' in result and result["data"]:
data = result['data']
values['f_request'] = 'f_request' in result \
and json.dumps(result['f_request'], indent=4) or ''
values['f_response'] = 'f_response' in result \
and json.dumps(result['f_response'], indent=4) or ''
values['f_result'] = 'data' in result \
and json.dumps(result['data'], indent=4) or ''
values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
values['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
if 'error' in data and data['error']:
session.flash(data['error'], 'error')
else:
session.flash("No Result Data")
form.render(values)
return dict(form=form, params=form_params_view)
values = dict(card_no="5409120028181901",
card_exp="2012",
card_cvv="111",
amount=1000,
produk_id=51,
cust_inv_no="123456789")
form.render(values)
return dict(form=form, params=form_params_edit)
def sha256(hash_string):
return hashlib.sha256(hash_string.encode()).hexdigest()
def proses_nice_pay(request):
pass
...@@ -18,12 +18,15 @@ ...@@ -18,12 +18,15 @@
<span class="menu-item-parent">Biller Invoice</span> <span class="menu-item-parent">Biller Invoice</span>
</a> </a>
</li> </li>
<!--
<li> <li>
<a href="${request._host}/api/vendor/list"> <a href="${request._host}/api/vendor/list">
<i class="fa fa-lg fa-fw fa-home"></i> <i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">List Vendor Invoice</span> <span class="menu-item-parent">List Vendor Invoice</span>
</a> </a>
</li> </li>
<li> <li>
<a href="${request._host}/api/payment/add"> <a href="${request._host}/api/payment/add">
<i class="fa fa-lg fa-fw fa-home"></i> <i class="fa fa-lg fa-fw fa-home"></i>
...@@ -37,6 +40,22 @@ ...@@ -37,6 +40,22 @@
<span class="menu-item-parent">List Payment</span> <span class="menu-item-parent">List Payment</span>
</a> </a>
</li> </li>
-->
<li>
<a href="${request._host}/api/merchant/register">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Test Payment</span>
</a>
</li>
<li>
<a href="${request._host}/api/integrated/add">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Integrated Test</span>
</a>
</li>
<li> <li>
<a href="${request._host}/api/integrated/add"> <a href="${request._host}/api/integrated/add">
<i class="fa fa-lg fa-fw fa-home"></i> <i class="fa fa-lg fa-fw fa-home"></i>
......
<html metal:use-macro="load: base-no-menu.pt">
</html>
...@@ -22,9 +22,9 @@ class Vendor(VendorClass): ...@@ -22,9 +22,9 @@ class Vendor(VendorClass):
VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det) VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det)
# id_pel, customer_id, cust_trx, row # id_pel, customer_id, cust_trx, row
settings = get_settings() settings = get_settings()
self.mid = 'test_mid' in settings and settings['odeo_mid'] or None self.mid = 'test_mid' in settings and settings['test_mid'] or None
self.key = 'test_key' in settings and settings['odeo_key'] or None self.key = 'test_key' in settings and settings['test_key'] or None
self.url = 'test_url' in settings and settings['odeo_url'] or None self.url = 'test_url' in settings and settings['test_url'] or None
key = ":".join([self.mid, self.key]).encode() key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key).decode() self.auth = base64.b64encode(key).decode()
...@@ -356,3 +356,7 @@ class Vendor(VendorClass): ...@@ -356,3 +356,7 @@ class Vendor(VendorClass):
# self.amt_sell = result["total"] # self.amt_sell = result["total"]
result['rincian'] = rincian result['rincian'] = rincian
return result return result
# def payment(self):
# url = "{}/payment".format(self.url)
# return HTTPFound(url)
import base64
from opensipkd.base.tools import get_random_number
from pyramid.view import view_config
import logging
log = logging.getLogger(__name__)
"""
test-purchase http://server/api/test/prepaid/purchase
"""
def validate_header(request):
env = request.environ
# http_header = env["HTTP_HEADER"]
# log.info(env)
# if 'HTTP_AUTHORIZATION' not in env:
# log.info("HTTP_AUTHORIZATION tidak ditemukan")
# return
#
# auth = env['HTTP_AUTHORIZATION'].split()
# log.info(auth)
# if len(auth) < 2 or auth[0] != "Bearer":
# log.info('Error Auth')
# return
#
# key = ":".join(['agratek', '4444444']).encode()
# key_encoded = base64.b64encode(key).decode()
# log.info(key_encoded)
# if auth[1] != key_encoded:
# return
return True
def anauthorized(request):
request.response.status = 401
result = {
"status": "UNAUTHORIZED",
"data": {
"errors": [
"Unauthorized"
]
},
"message": ""
}
return result
def bad_request(request, message=None):
if not message:
message = "Paramter(s) Expected"
request.response.status = 400
result = {
"status": "BAD_REQUEST",
"data": {
"errors": [
"ERROR_MESSAGE_1",
"ERROR_MESSAGE_2",
"ERROR_MESSAGE_ETC"
]
},
"message": message
}
return result
def produk_not_found(request):
return bad_request(request, "Prduk Not Found")
# @view_config(route_name='test-purchase', renderer='json', request_method="POST")
def view_test_purchase(request):
denom=""
if denom[:2] == "CC":
tx_id = get_random_number(32)
return {
'resultCd': '0000',
'resultMsg': 'SUCCESS',
'tXid': 'AGRATEK{}'.format(tx_id),
'referenceNo': '2669739141972781',
'payMethod': '01',
'amt': ' 10000',
'transDt': '20190906',
'transTm': '110857',
'description': 'Transaction Description',
'bankCd': None,
'vacctNo': None,
'mitraCd': None,
'payNo': None,
'currency': None,
'goodsNm': None,
'billingNm': None,
'vacctValidDt': None,
'vacc tValidTm': None,
'payValidDt': None,
'payValidTm': None,
'requestURL': None
}
return produk_not_found(request)
# @view_config(route_name='test-order', renderer='json', request_method="GET")
# def view_test_pln_pre(request):
# if not validate_header(request):
# return anauthorized(request)
# matchdict = request.matchdict
# id = "id" in matchdict and matchdict["id"] or ""
# return {
# "order_id": 123,
# "name": "Telkomsel 5",
# "msisdn": "08xx",
# "serial_number": "XXX",
# "status": "COMPLETED",
# "price": 5000
# }
...@@ -353,6 +353,32 @@ def view_test_postpaid(request): ...@@ -353,6 +353,32 @@ def view_test_postpaid(request):
}, },
"message": "" "message": ""
} }
elif denom[:2] == "CC":
tx_id = get_random_number(32)
return {
'resultCd': '0000',
'resultMsg': 'SUCCESS',
'tXid': 'AGRATEK{}'.format(tx_id),
'referenceNo': '2669739141972781',
'payMethod': '01',
'amt': ' 10000',
'transDt': '20190906',
'transTm': '110857',
'description': 'Transaction Description',
'bankCd': None,
'vacctNo': None,
'mitraCd': None,
'payNo': None,
'currency': None,
'goodsNm': None,
'billingNm': None,
'vacctValidDt': None,
'vacc tValidTm': None,
'payValidDt': None,
'payValidTm': None,
'requestURL': None
}
return produk_not_found(request) return produk_not_found(request)
# @view_config(route_name='test-order', renderer='json', request_method="GET") # @view_config(route_name='test-order', renderer='json', request_method="GET")
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!