Commit e02d3541 by Solo Group

va

1 parent 1685e45b
...@@ -2,6 +2,8 @@ kode,path,nama,status,type ...@@ -2,6 +2,8 @@ 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-merchant-register,/api/merchant/register,Api Merchant Payment,1,0 api-merchant-register,/api/merchant/register,Api Merchant Payment,1,0
api-merchant-register-callback,/api/merchant/register/callback,Api Merchant Payment Callback,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-notify,/api/vendor/{name}/notify,Api Vendor Notify,1,0
api-vendor-callback,/api/vendor/{name}/callback,Api Vendor Callback,1,0 api-vendor-callback,/api/vendor/{name}/callback,Api Vendor Callback,1,0
......
from opensipkd.base.tools.api import * from opensipkd.base.tools.api import *
from opensipkd.base.tools.buttons import * from opensipkd.base.tools.buttons import *
from opensipkd.base.tools import * from opensipkd.base.tools import *
from pyramid.compat import string_types
from pyramid.encode import url_quote, urlencode
from pyramid.url import QUERY_SAFE
def get_qs(_query):
if isinstance(_query, string_types):
qs = '?' + url_quote(_query, QUERY_SAFE)
else:
qs = '?' + urlencode(_query, doseq=True)
return qs
\ No newline at end of file \ No newline at end of file
import logging import logging
from importlib import import_module from importlib import import_module
from agratek.api.merchant.views.api_merchant import get_vendor_produk, build_request import colander
from agratek.api.merchant.views.api_merchant import get_vendor_produk
from deform import widget, Form
from opensipkd.base.models import Partner, flush_row 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,
...@@ -12,11 +14,39 @@ from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, Partner ...@@ -12,11 +14,39 @@ from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, Partner
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config 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, get_settings from ..tools import JsonRpcInvoiceFoundError, JsonRpcError, get_settings, get_qs
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def build_request(typ, vendor_produk, partner_log=None, **kwargs):
# 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
pckgs = 'agratek.api.merchant.views'
moduls = vendor_produk.modules.split('.')
if len(moduls) > 1:
pckg = ".".join(moduls[:-1])
pckgs = ".".join([pckgs, pckg])
moduls = moduls[-1:]
modul = moduls[0]
log.info("Module: %s Pckgs: %s" % (modul, pckgs))
modul = '.' + modul
modules = import_module(modul, pckgs)
cls_module = modules.Vendor(vendor_produk, partner_log, **kwargs)
cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if cls:
result = cls()
else:
message = "Module %s Not Found" % vendor_produk.modules
log.info(message)
result = dict(message=message,
code=9999)
return result
def save_partner_pay(values, vendor_produk, row=None): def save_partner_pay(values, vendor_produk, row=None):
if not row: if not row:
row = PartnerPay() row = PartnerPay()
...@@ -28,8 +58,12 @@ def save_partner_pay(values, vendor_produk, row=None): ...@@ -28,8 +58,12 @@ def save_partner_pay(values, vendor_produk, row=None):
return row return row
def build_register(vendor_produk, partner_log=None, **kwargs): def build_register(vendor_produk, partner_pay=None, **kwargs):
return build_request('register', vendor_produk, partner_log, **kwargs) return build_request('register', vendor_produk, partner_pay, **kwargs)
def build_payment(vendor_produk, partner_pay=None, **kwargs):
return build_request('payment', vendor_produk, partner_pay, **kwargs)
def set_register_values(dat, customer): def set_register_values(dat, customer):
...@@ -40,7 +74,7 @@ def set_register_values(dat, customer): ...@@ -40,7 +74,7 @@ def set_register_values(dat, customer):
values = dict( values = dict(
customer_id=customer.id, customer_id=customer.id,
# id_pel=dat['id_pel'], # id_pel=dat['id_pel'],
cart=produk or '{}', cart=produk or {},
cust_inv_no=dat["invoice_no"], cust_inv_no=dat["invoice_no"],
amt_sell=dat['amount'], amt_sell=dat['amount'],
notes=dat['description'], notes=dat['description'],
...@@ -92,30 +126,6 @@ def set_register_values(dat, customer): ...@@ -92,30 +126,6 @@ def set_register_values(dat, customer):
@jsonrpc_method(method='register', endpoint='api-merchant') @jsonrpc_method(method='register', endpoint='api-merchant')
def register(request, data, **kwargs): def register(request, data, **kwargs):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
denom: string,
id_pel:string
inv_no: string optional
}
:param token:
user_token
:return:
{
product_nm:string,
denom: string,
id_pel:string
inv_no: string optional
denom:string,
harga:integer,
admin:integer,
discount:integer,
total:integer,
status:success/pending/failed
"""
user = auth_from_rpc(request) user = auth_from_rpc(request)
i = 0 i = 0
if not data: if not data:
...@@ -138,29 +148,26 @@ def register(request, data, **kwargs): ...@@ -138,29 +148,26 @@ def register(request, data, **kwargs):
else: else:
inv_no = dat["invoice_no"] inv_no = dat["invoice_no"]
row = PartnerPay.query().filter_by(cust_inv_no=inv_no).first() row = PartnerPay.query().filter_by(cust_inv_no=inv_no).first()
if row and row.status>0: if row and row.status > 0:
raise JsonRpcInvoiceFoundError() raise JsonRpcInvoiceFoundError()
vendor_kd = "vendor_kd" in dat and dat["vendor_kd"] or None 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
print(produk_kd, vendor_kd)
vendor_produk = get_vendor_produk(produk_kd, vendor_kd=vendor_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 = set_register_values(dat, customer) values = set_register_values(dat, customer)
credit_card = "credit_card" in dat and dat["credit_card"] or {} credit_card = "credit_card" in dat and dat["credit_card"] or {}
if credit_card: if credit_card:
values.update(dict( values.update(dict(
instmnt_mon = 'instmnt_mon' in credit_card and credit_card['instmnt_mon'] or '', instmnt_mon='instmnt_mon' in credit_card and credit_card['instmnt_mon'] or '',
instmnt_type = 'instmnt_type' in credit_card and credit_card['instmnt_type'] or '', instmnt_type='instmnt_type' in credit_card and credit_card['instmnt_type'] or '',
recurr_opt = 'recurr_opt' in credit_card and credit_card['recurr_opt'] or 0, recurr_opt='recurr_opt' in credit_card and credit_card['recurr_opt'] or 0,
card_no = 'card_no' in credit_card and credit_card['card_no'] or 0,
))
ccard = (dict(
card_cvv=credit_card["card_cvv"],
card_exp=credit_card["card_exp"],
card_name=credit_card["card_name"]
)) ))
ccard = None
else: else:
ccard = None ccard = None
...@@ -173,15 +180,13 @@ def register(request, data, **kwargs): ...@@ -173,15 +180,13 @@ def register(request, data, **kwargs):
)) ))
ar_invoice = save_partner_pay(values, vendor_produk, row) ar_invoice = save_partner_pay(values, vendor_produk, row)
result = build_register(vendor_produk, ar_invoice, ccard=ccard) build_register(vendor_produk, ar_invoice, ccard=ccard)
#table payment di update lagi dat.update(ar_invoice.inquiry["result"])
# if "form" in result:
dat.update(result["f_result"]) # dat.update(dict(form=result["form"]))
if "form" in result: # # request.environ["application"]="text/html"
dat.update(dict(form=result["form"])) # # request.response()
# request.environ["application"]="text/html" # # return request.response
# request.response()
# return request.response
r_data.append(dat) r_data.append(dat)
...@@ -190,283 +195,95 @@ def register(request, data, **kwargs): ...@@ -190,283 +195,95 @@ def register(request, data, **kwargs):
return data return data
class ResultSchema(colander.Schema):
code = colander.SchemaNode(
colander.String(),
widget=widget.TextInputWidget(readonly=True)
)
message = colander.SchemaNode(
colander.String(),
widget=widget.TextInputWidget(readonly=True)
)
def form_result(request, values):
schema = ResultSchema()
schema.request = request
buttons = ('ok',)
form = Form(schema, buttons=buttons)
form.render(values)
return dict(form=form, params=dict(scripts=""))
class ViewData(BaseView): class ViewData(BaseView):
@view_config(route_name='api-merchant-payment', @view_config(route_name='api-merchant-payment',
renderer='templates/form-clean.pt') renderer='templates/form-clean.pt')
def view_form(self): def view_api_merchant_payment(self):
# request = self.req request = self.req
# flash = request.session.flash data = request.POST and dict(request.POST.items()) or dict(request.GET.items())
# print(">>>>>", request.environ) log.info("Merchant payment request: {}".format(data))
# print(">>>>", request.POST, request) tx_id = data["tx_id"]
# if request.POST: cust_inv_no = data["invoice_no"]
# data = dict(request.POST.items()) invoice_det = PartnerPay.query_txid(tx_id) \
# if "tXid" in "data": .filter_by(cust_inv_no=cust_inv_no).first()
# row = PartnerPay.query_id(data["tXid"]).first() if not invoice_det:
# if not row: code = 55
# flash('Pembayaran tidak ditemukan', "error") values = dict(code=code,
# return dict() message="Payment Not Found")
# vendor = row.vendor return form_result(request, values)
# produk_vendor = PartnerProduk.query()\
# .filter_by(partner_id=row.vendor_id, vendor_produk = PartnerProduk.get_produk(invoice_det.vendor_id,
# produk_id = row.produk_id,)\ invoice_det.produk_id).first()
# .first() pckgs = 'agratek.api.merchant.views'
# moduls = vendor_produk.modules.split('.')
# else: if len(moduls) > 1:
# flash('Method POST Required', "error") pckg = ".".join(moduls[:-1])
# return dict() pckgs = ".".join([pckgs, pckg])
moduls = moduls[-1:]
settings = get_settings() modul = moduls[0]
url = settings["np_url"]+'/payment'
return HTTPFound(url) log.info("Payment Module: %s Pckgs: %s" % (modul, pckgs))
# @jsonrpc_method(method='advice', endpoint='api-merchant') modul = '.' + modul
# def advice(request, data): modules = import_module(modul, pckgs)
# """ cls_module = modules.Vendor(vendor_produk, invoice_det)
# Digunakan untuk mendapatkan daftar produk typ = "payment"
# :param request: cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
# :param data: if cls:
# { result = cls(data)
# denom: string, # headers = {"Content-type": "application/x-www-form-urlencoded"}
# id_pel:string if result:
# inv_no: string optional return dict(form=result["form"])
# } # qs = get_qs(result['_query'])
# :param token: # url = "{}{}".format(result['url'], qs)
# user_token # headers = result["headers"]
# :return: # # return form_result(request, result)
# { # return HTTPFound(url, headers=headers)
# product_nm:string, else:
# denom: string, code = 55
# id_pel:string values = dict(code=code,
# inv_no: string optional message="Payment Not Found")
# denom:string, return form_result(request, values)
# harga:integer,
# admin:integer, code = 99
# discount:integer, values = dict(code=code,
# total:integer, message="Parameter Expected")
# status:success/pending/failed return form_result(request, values)
# """
# user = auth_from_rpc(request)
# i = 0
# is_list = type(data) == list
# data = is_list and data or [data]
# customer = Partner.query_user(user).first()
# if not customer:
# raise JsonRpcCustomerNotFoundError
# r_data = []
# for dat in data:
# if "invoice_no" not in dat:
# dat["status"] = "FAILED"
# dat["message"] = "Parameter tidak lengkap"
# else:
# inv_no = dat["invoice_no"]
# invoice = H2hArInvoice.query() \
# .filter_by(cust_inv_no=inv_no,
# customer_id=customer.id).first()
# if not invoice:
# dat["status"] = "FAILED"
# dat["message"] = "Invoice %s Tidak Ditemukan" % inv_no
# else:
# qry = H2hArInvoiceDet.query().filter_by(ar_invoice_id=invoice.id)
# r_prod = []
# if "produk" in dat:
# prods = []
# for p in dat["produk"]:
# row = qry.join(Produk, Produk.id == H2hArInvoiceDet.produk_id) \
# .filter(Produk.kode == p["denom"],
# H2hArInvoiceDet.id_pel == p["id_pel"]).first()
# if not row:
# status = "FAILED"
# message = "Produk tidak ada"
# p.update(dict(status=status,
# message=message))
# else:
# status = row.status == -1 and 'PENDING' or row.status == 1 and 'SUCCESS' \
# or row.status == -2 and 'PENDING' or "FAILED"
# p.update(dict(
# subtotal=(row.amt_sell or 0) + (row.discount or 0),
# discount=row.discount or 0,
# total=row.amt_sell,
# status=status,
# serial_number=row.serial_number or "", )
# )
# r_prod.append(p)
# else:
# for p in qry.all():
# produk = Produk.query(). \
# filter(Produk.id == p.produk_id).first()
# status = p.status == -1 and 'PENDING' or p.status == 1 and 'SUCCESS' \
# or p.status == -2 and 'PENDING' or "FAILED"
# r_prod.append(dict(denom=produk.kode,
# id_pel=p.id_pel,
# subtotal=(p.amt_sell or 0) + (p.discount or 0),
# discount=p.discount or 0,
# total=p.amt_sell,
# status=status,
# serial_number=p.serial_number or "", )
# )
# dat["produk"] = r_prod
# r_data.append(dat)
# i += 1
# data = is_list and r_data or r_data[0]
# return data
#
# @jsonrpc_method(method='payment', endpoint='api-merchant')
# def payment(request, token, data):
# """
# Digunakan untuk mendapatkan daftar produk
# :param request:
# :param data:
# {
# denom: string,
# id_pel:string
# inv_no: string optional
# }
# :param token:
# user_token
# :return:
# {
# product_nm:string,
#
# denom: string,
# id_pel:string
# inv_no: string optional
# denom:string,
# harga:integer,
# admin:integer,
# discount:integer,
# total:integer,
# status:success/pending/failed 00/01/02
# """
# user = auth_from_rpc(request, token)
# i = 0
# dat = data is list and data or [data]
# costumer = Partner.query_user(user)
# for dat in data:
# produk_kd = 'denom' in dat and dat['denom'] or None
# if not produk_kd :
# raise JsonRpcProdukNotFound(message="Produk harus diisi")
#
# produk = Produk.query_kode(produk_kd).first()
# if not produk:
# raise JsonRpcProdukNotFound(message="Produk %s tidak ditemukan" % produk_kd)
#
# # todo: search product lowest price
# vend_kd = 'ODEO'
#
# qry = PartnerProduk.query() \
# .filter(Partner.kode == vend_kd) \
# .filter(Produk.kode == produk_kd).first()
#
# r_data = dat
# r_data.update(dict(data=result))
# data[i] = r_data
# i += 1
# return data
#
#
# @jsonrpc_method(method='get_product', endpoint='api-merchant')
# def get_product(request, token, data ):
# """
# Digunakan untuk mendapatkan daftar produk
# :param request:
# :param data:
# {
# product_kd: string, //optional
# page:integer, //optional
# length:integer, //optional
# category:string, //optional
# search:string //optional
# }
# :return: [
# {
# product_kd:string,
# product_nm:string,
# harga:integer
# }
#
# ]
# """
# auth_from_rpc(request)
# i =0
# qry = DepartemenProduk.query() \
# .filter(Departemen.kode == '100000')
# for dat in data:
# page = 'page' in dat and dat['page'] or 1
# length = 'length' in dat and dat['length'] or 5
# product_kd = 'product_kd' in dat and dat['product_kd'] or None
# search = 'search' in dat and dat['search'] or None
# category = 'category' in dat and dat['category'] or None
# if product_kd :
# rst = qry.join(Produk).filter(Produk.kode == product_kd)
# elif search:
# rst = qry.join(Produk).filter(Produk.nama.ilike("".join(['%',search,'%' ])))
# elif category:
# rst = qry.join(Produk).join(ProdukKategori) \
# .filter(ProdukKategori.nama.ilike("".join(['%', category, '%'])))
# else:
# rst = qry
#
# rst = rst.limit(length).offset((page-1)*length)
# result = []
# for row in rst.all():
# result.append(dict(product_kd=row.produk.kode,
# produk_nm=row.produk.nama,
# harga=row.harga ))
# r_data = dat
# r_data.update(dict(data=result))
# data[i]=r_data
# i += 1
# return data
#
# @jsonrpc_method(method='get_biaya', endpoint='api-merchant')
# def get_biaya(request, data, token=None):
# """
# Digunakan untuk mencari methode pembayaran dan biaya layanan
# :param request:
# :param data:
# {
# biaya_kd: string,
# harga:integer,
# cname:string,
# cid:string,
# cvv:string, optional
# }
# :param token:
# user_token
# :return:
# {
# product_kd:string,
# product_nm:string,
# harga:integer
# }
# """
#
# user = auth_from_rpc(request, token)
# i =0
# qry = DepartemenProduk.query() \
# .filter(Departemen.kode == '100000')
# for dat in data:
# product_kd = 'biaya_kd' in dat and dat['biaya_kd'] or None
# cid = 'cid' in dat and dat['cid'] or None
# if not product_kd :
# raise JsonRpcParameterNotFound(message='Paramter product_kd wajib di isi')
#
# rst = qry.join(Produk).filter(Produk.kode == product_kd)
# result = []
# for row in rst.all():
# if row.is_cid and not cid:
# raise JsonRpcParameterNotFound(message="Parameter cid wajib di isi")
# if row.produk.fixed:
# harga = row.harga
# else:
# harga = dat['harga']*row.harga
#
# result.append(dict(biaya_kd=row.produk.kode,
# produk_nm=row.produk.nama,
# harga=harga))
#
# r_data = dat
# r_data.update(dict(data=result))
# data[i]=r_data
# i += 1
# return data
@view_config(route_name='api-vendor-callback', renderer="templates/form-clean.pt")
def api_vendor_callback(request):
data = request.POST and dict(request.POST.items()) or dict(request.GET.items())
print(data)
vendor_nm = request.matchdict['name']
modul = '.callback'
pckgs = 'agratek.api.merchant.views.{}'.format(vendor_nm)
moduls = import_module(modul, pckgs)
typ = 'proses'
log.info("Pckgs: {} Modul:{} typ {}".format(pckgs, modul, typ))
cls = hasattr(moduls, typ) and getattr(moduls, typ) or None
print(dir(cls))
if cls:
result = cls(data)
if result:
return dict(form=result["form"])
qs =get_qs(data)
return HTTPFound(location=request.route_url("api-merchant-register-callback", _query=qs))
return dict(form="<h1>ERROR</h1>")
\ No newline at end of file \ No newline at end of file
...@@ -3,6 +3,7 @@ import socket ...@@ -3,6 +3,7 @@ import socket
from datetime import datetime, timedelta from datetime import datetime, timedelta
import colander import colander
from colander import string_types
from deform import widget, Form, ValidationFailure, Button from deform import widget, Form, ValidationFailure, Button
from opensipkd.base import get_host from opensipkd.base import get_host
from opensipkd.base.models import Partner, flush_row from opensipkd.base.models import Partner, flush_row
...@@ -10,11 +11,13 @@ from opensipkd.base.views import BaseView ...@@ -10,11 +11,13 @@ from opensipkd.base.views import BaseView
from opensipkd.pasar.models import Produk, PartnerLog, PartnerProduk, H2hArInvoice, H2hArInvoiceDet from opensipkd.pasar.models import Produk, PartnerLog, PartnerProduk, H2hArInvoice, H2hArInvoiceDet
from opensipkd.pasar.models.views import (deferred_produk, deferred_vendor, from opensipkd.pasar.models.views import (deferred_produk, deferred_vendor,
deferred_customer) deferred_customer)
from pyramid.encode import url_quote, urlencode
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from pyramid.url import QUERY_SAFE
from pyramid.view import view_config from pyramid.view import view_config
from requests import Response from requests import Response
from ..tools import get_settings, btn_purchase, ymd, hms, json_rpc_header, get_random_number from ..tools import get_settings, btn_purchase, ymd, hms, json_rpc_header, get_random_number, get_qs
from ..tools import btn_inquiry, btn_reset, btn_payment, btn_advice, btn_next, btn_register, btn_cancel from ..tools import btn_inquiry, btn_reset, btn_payment, btn_advice, btn_next, btn_register, btn_cancel
from .api_merchant import build_request, qry_vendor_produk, save_partner_log from .api_merchant import build_request, qry_vendor_produk, save_partner_log
...@@ -132,7 +135,6 @@ pay_valid_dt Y N 8 20170313 expiry date (YYYYMMDD) (Payloan) ...@@ -132,7 +135,6 @@ pay_valid_dt Y N 8 20170313 expiry date (YYYYMMDD) (Payloan)
pay_valid_tm Y N 6 135959 expiry time (HH24MISS) (Payloan) pay_valid_tm Y N 6 135959 expiry time (HH24MISS) (Payloan)
""" """
payment_methods = [ payment_methods = [
('01', 'Credit Card'), ('01', 'Credit Card'),
('02', 'Virtual Account (VA)'), ('02', 'Virtual Account (VA)'),
...@@ -203,26 +205,6 @@ $(document).ready(function(){ ...@@ -203,26 +205,6 @@ $(document).ready(function(){
class RegisterSchema(colander.Schema): class RegisterSchema(colander.Schema):
# time_stamp Y N 14 API Request Date
# i_mid Y AN 10 Merchant Id
# currency Y AN 3 currency
# merchant_token Y AN 255 merchantToken
# pay_method = colander.SchemaNode(
# colander.String(),
# widget=widget.SelectWidget(values=payment_methods)
# )
# denom = colander.SchemaNode(
# colander.String(),
# default='CRC',
# widget=widget.TextInputWidget(attributes={'maxlength': 100})
# )
# id_pel = colander.SchemaNode(
# colander.String(),
# default='123456789',
# widget=widget.TextInputWidget(attributes={'maxlength': 100})
# )
produk_id = colander.SchemaNode( produk_id = colander.SchemaNode(
colander.Integer(), title='Produk', colander.Integer(), title='Produk',
oid="produk_id", widget=deferred_produk) oid="produk_id", widget=deferred_produk)
...@@ -325,12 +307,6 @@ class RegisterSchema(colander.Schema): ...@@ -325,12 +307,6 @@ class RegisterSchema(colander.Schema):
missing=colander.drop, missing=colander.drop,
widget=widget.TextInputWidget(attributes={'maxlength': 50}) widget=widget.TextInputWidget(attributes={'maxlength': 50})
) )
# db_process_url Y AN 255 Payment Notification url (Async notification)
# db_proses_url = colander.SchemaNode(
# colander.String(),
# default='https://merchant.com/notification',
# widget=widget.TextInputWidget(attributes={'maxlength': 255})
# )
vat = colander.SchemaNode( vat = colander.SchemaNode(
colander.Integer(), colander.Integer(),
default=0, default=0,
...@@ -351,38 +327,6 @@ class RegisterSchema(colander.Schema): ...@@ -351,38 +327,6 @@ class RegisterSchema(colander.Schema):
default='Transaction Description', default='Transaction Description',
widget=widget.TextInputWidget(attributes={'maxlength': 255}) widget=widget.TextInputWidget(attributes={'maxlength': 255})
) )
# req_domain = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# widget=widget.TextInputWidget(attributes={'maxlength': 100})
# )
# req_server_ip = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# widget=widget.TextInputWidget(attributes={'maxlength': 128})
# )
# req_client_ver = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# widget=widget.TextInputWidget(attributes={'maxlength': 50})
# )
# user_ip = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# default='127.0.0.1',
# widget=widget.TextInputWidget(attributes={'maxlength': 128})
# )
# user_session_id = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# widget=widget.TextInputWidget(attributes={'maxlength': 255})
# )
# user_agent = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# widget=widget.TextInputWidget(attributes={'maxlength': 255})
# )
user_language = colander.SchemaNode( user_language = colander.SchemaNode(
colander.String(), colander.String(),
missing=colander.drop, missing=colander.drop,
...@@ -391,55 +335,26 @@ class RegisterSchema(colander.Schema): ...@@ -391,55 +335,26 @@ class RegisterSchema(colander.Schema):
) )
cart_data = colander.SchemaNode( cart_data = colander.SchemaNode(
colander.String(), colander.String(),
# default="""{ default="""{
# "count": "2", "count": "2",
# "item": [ "item": [
# { {
# "img_url": "http://img.aaa.com/ima1.jpg", "img_url": "http://img.aaa.com/ima1.jpg",
# "goods_name": "Item 1 Name", "goods_name": "Item 1 Name",
# "goods_detail": "Item 1 Detail", "goods_detail": "Item 1 Detail",
# "goods_amt": "700" "goods_amt": "700"
# }, },
# { {
# "img_url": "http://img.aaa.com/ima2.jpg", "img_url": "http://img.aaa.com/ima2.jpg",
# "goods_name": "Item 2 Name", "goods_name": "Item 2 Name",
# "goods_detail": "Item 2 Detail", "goods_detail": "Item 2 Detail",
# "goods_amt": "300" "goods_amt": "300"
# } }
# ] ]
# }""", }""",
default="{}", # default="{}",
widget=widget.TextAreaWidget(attributes={'maxlength': 4000}) widget=widget.TextAreaWidget(attributes={'maxlength': 4000})
) )
# CC
# VA
# bank_cd = colander.SchemaNode(
# colander.String(),
# default='CENA',
# widget=widget.TextInputWidget(attributes={'maxlength': 4})
# )
# # (E - Wallet, CVS, Payloan)
# mitra_cd = colander.SchemaNode(
# colander.String(),
# widget=widget.TextInputWidget()
# )
# m_ref_no = colander.SchemaNode(
# colander.String(),
# widget=widget.TextInputWidget(attributes={'maxlength': 18})
# )
# pay_valid_dt = colander.SchemaNode(
# colander.String(),
# widget=widget.TextInputWidget(attributes={'maxlength': 8})
# )
# # expire date(YYYYMMDD)(Payloan)
# pay_valid_tm = colander.SchemaNode(
# colander.String(),
# widget=widget.TextInputWidget(attributes={'maxlength': 6})
# )
# expiry time(HH24MISS)(Payloan)
class EditSchema(RegisterSchema): class EditSchema(RegisterSchema):
id = colander.SchemaNode( id = colander.SchemaNode(
...@@ -509,18 +424,18 @@ class CCardPayment(colander.Schema): ...@@ -509,18 +424,18 @@ class CCardPayment(colander.Schema):
callback_url = colander.SchemaNode( callback_url = colander.SchemaNode(
colander.String(), colander.String(),
#default = "{}/api/merchant/agratek/callback".format(get_host()), default="{}/api/merchant/register/callback".format("https://server"),
default="http://merchant.com/callback",
widget=widget.TextInputWidget(max_len=255) widget=widget.TextInputWidget(max_len=255)
) )
class VAPayment(colander.Schema): class VAPayment(colander.Schema):
valid_date = colander.SchemaNode( valid_date = colander.SchemaNode(
colander.String(), colander.String(),
default=(datetime.now() + timedelta(days=1)).strftime('%Y%m%d'), default=(datetime.now() + timedelta(days=1)).strftime('%Y%m%d'),
widget=widget.TextInputWidget(attributes={'maxlength': 8}) widget=widget.TextInputWidget(attributes={'maxlength': 8})
) )
valid_time= colander.SchemaNode( valid_time = colander.SchemaNode(
colander.String(), colander.String(),
default=datetime.now().strftime('%H%M%S'), default=datetime.now().strftime('%H%M%S'),
widget=widget.TextInputWidget(attributes={'maxlength': 6}) widget=widget.TextInputWidget(attributes={'maxlength': 6})
...@@ -531,6 +446,7 @@ class VAPayment(colander.Schema): ...@@ -531,6 +446,7 @@ class VAPayment(colander.Schema):
widget=widget.TextInputWidget(attributes={'maxlength': 40}) widget=widget.TextInputWidget(attributes={'maxlength': 40})
) )
class VAResult(colander.Schema): class VAResult(colander.Schema):
vacct_no = colander.SchemaNode( vacct_no = colander.SchemaNode(
colander.String(), colander.String(),
...@@ -545,6 +461,7 @@ class VAResult(colander.Schema): ...@@ -545,6 +461,7 @@ class VAResult(colander.Schema):
widget=widget.TextInputWidget(readonly=True) widget=widget.TextInputWidget(readonly=True)
) )
class CPPayment(colander.Schema): class CPPayment(colander.Schema):
""" """
clickPayNo Y N 16 ClickPay number clickPayNo Y N 16 ClickPay number
...@@ -552,30 +469,32 @@ class CPPayment(colander.Schema): ...@@ -552,30 +469,32 @@ class CPPayment(colander.Schema):
clickPayToken Y N 6 Code response from token clickPayToken Y N 6 Code response from token
merchantToken Y AN 255 merchantToken merchantToken Y AN 255 merchantToken
callBackUrl Y AN 255 Payment result forward url (on browser) callBackUrl Y AN 255 Payment result forward url (on browser)
""" """
click_pay_no = colander.SchemaNode( cp_no = colander.SchemaNode(
colander.String(), colander.String(),
missing=colander.drop, missing=colander.drop,
default="1234567890123456",
widget=widget.TextInputWidget(max_len=16) widget=widget.TextInputWidget(max_len=16)
) )
item3 = colander.SchemaNode( item3 = colander.SchemaNode(
colander.String(), colander.String(),
default="1234567890123456",
missing=colander.drop, missing=colander.drop,
widget=widget.TextInputWidget(max_len=3) widget=widget.TextInputWidget(max_len=3)
) )
click_pay_token = colander.SchemaNode( cp_token = colander.SchemaNode(
colander.String(), colander.String(),
default="123456",
missing=colander.drop, missing=colander.drop,
widget=widget.TextInputWidget(max_len=6) widget=widget.TextInputWidget(max_len=6)
) )
callback_url = colander.SchemaNode( callback_url = colander.SchemaNode(
colander.String(), colander.String(),
#default = "{}/api/merchant/agratek/callback".format(get_host()), default="{}/api/merchant/register/callback".format("https://server"),
default="http://merchant.com/callback",
widget=widget.TextInputWidget(max_len=255) widget=widget.TextInputWidget(max_len=255)
) )
class WLPayment(colander.Schema): class WLPayment(colander.Schema):
m_ref_no = colander.SchemaNode( m_ref_no = colander.SchemaNode(
colander.String(), colander.String(),
...@@ -584,23 +503,24 @@ class WLPayment(colander.Schema): ...@@ -584,23 +503,24 @@ class WLPayment(colander.Schema):
) )
callback_url = colander.SchemaNode( callback_url = colander.SchemaNode(
colander.String(), colander.String(),
#default = "{}/api/merchant/agratek/callback".format(get_host()), default="{}/api/merchant/register/callback".format("https://server"),
default="http://merchant.com/callback",
widget=widget.TextInputWidget(max_len=255) widget=widget.TextInputWidget(max_len=255)
) )
class CVSPayment(colander.Schema): class CVSPayment(colander.Schema):
valid_date = colander.SchemaNode( valid_date = colander.SchemaNode(
colander.String(), colander.String(),
default=(datetime.now() + timedelta(days=1)).strftime('%Y%m%d'), default=(datetime.now() + timedelta(days=1)).strftime('%Y%m%d'),
widget=widget.TextInputWidget(attributes={'maxlength': 8}) widget=widget.TextInputWidget(attributes={'maxlength': 8})
) )
valid_time= colander.SchemaNode( valid_time = colander.SchemaNode(
colander.String(), colander.String(),
default=datetime.now().strftime('%H%M%S'), default=datetime.now().strftime('%H%M%S'),
widget=widget.TextInputWidget(attributes={'maxlength': 6}) widget=widget.TextInputWidget(attributes={'maxlength': 6})
) )
class CVSResult(colander.Schema): class CVSResult(colander.Schema):
pay_no = colander.SchemaNode( pay_no = colander.SchemaNode(
colander.String(), colander.String(),
...@@ -619,11 +539,11 @@ class CVSResult(colander.Schema): ...@@ -619,11 +539,11 @@ class CVSResult(colander.Schema):
class PLPayment(colander.Schema): class PLPayment(colander.Schema):
callback_url = colander.SchemaNode( callback_url = colander.SchemaNode(
colander.String(), colander.String(),
#default = "{}/api/merchant/agratek/callback".format(get_host()), default="{}/api/merchant/register/callback".format("https://server"),
default="http://merchant.com/callback",
widget=widget.TextInputWidget(max_len=255) widget=widget.TextInputWidget(max_len=255)
) )
def form_validator(form, value): def form_validator(form, value):
pass pass
...@@ -645,8 +565,13 @@ def route_register(request): ...@@ -645,8 +565,13 @@ def route_register(request):
btn_proses = Button('proses', title='Proses', css_class="btn-warning") btn_proses = Button('proses', title='Proses', css_class="btn-warning")
def set_data(request, denom, dat): def set_data(request, denom, dat):
env = request.environ env = request.environ
produk = json.loads(dat['cart_data'])
if type(produk)!=dict:
produk = {}
return dict( return dict(
time_stamp=datetime.now().strftime('%Y%m%d%H%M%S'), time_stamp=datetime.now().strftime('%Y%m%d%H%M%S'),
denom=denom, denom=denom,
...@@ -686,9 +611,10 @@ def set_data(request, denom, dat): ...@@ -686,9 +611,10 @@ def set_data(request, denom, dat):
post_code=dat['billing_post_cd'], post_code=dat['billing_post_cd'],
country=dat['billing_country'], country=dat['billing_country'],
), ),
produk=json.loads(dat['cart_data']), produk=produk,
) )
def payment(request, data, form=None): def payment(request, data, form=None):
row = Produk.query_id(data['produk_id']).first() row = Produk.query_id(data['produk_id']).first()
denom = row and row.kode or '' denom = row and row.kode or ''
...@@ -697,21 +623,23 @@ def payment(request, data, form=None): ...@@ -697,21 +623,23 @@ def payment(request, data, form=None):
elif denom[:2] == 'VA': elif denom[:2] == 'VA':
form = get_form(request, VAPayment, (btn_cancel, btn_proses)) form = get_form(request, VAPayment, (btn_cancel, btn_proses))
elif denom[:2] == 'CP': elif denom[:2] == 'CP':
form = get_form(request, CPPayment, (btn_cancel,)) form = get_form(request, CPPayment, (btn_cancel, btn_proses))
elif denom[:2] == 'WL': elif denom[:2] == 'WL':
form = get_form(request, WLPayment, (btn_cancel,)) form = get_form(request, WLPayment, (btn_cancel, btn_proses))
elif denom[:3] == 'CVS': elif denom[:3] == 'CVS':
form = get_form(request, CVSPayment, (btn_cancel, btn_proses)) form = get_form(request, CVSPayment, (btn_cancel, btn_proses))
elif denom[:2] == 'PL': elif denom[:2] == 'PL':
form = get_form(request, PLPayment, (btn_cancel, btn_proses)) form = get_form(request, PLPayment, (btn_cancel, btn_proses))
return form return form
def proses(request): def proses(request):
values = dict(request.POST.items()) values = dict(request.POST.items())
session = request.session session = request.session
dat = session['payment'] dat = session['payment']
log.info("Request From Merchant: {}".format(dat))
row = Produk.query_id(dat['produk_id']).first() row = Produk.query_id(dat['produk_id']).first()
denom = row and row.kode or '' denom = row and row.kode or ''
data = set_data(request, denom, dat) data = set_data(request, denom, dat)
...@@ -726,27 +654,65 @@ def proses(request): ...@@ -726,27 +654,65 @@ def proses(request):
instmnt_type=values["instmnt_type"], instmnt_type=values["instmnt_type"],
instmnt_mon=values["instmnt_mon"], instmnt_mon=values["instmnt_mon"],
recurr_opt=values["recurr_opt"], recurr_opt=values["recurr_opt"],
card_no=values["card_no"],
card_exp=values["card_exp"],
card_cvv=values["card_cvv"],
card_name=values["card_name"],
))) )))
result = register(request, data=data) result = register(request, data=data)
if result['code'] != 0: if result['code'] != 0:
form = get_form(request, RegisterSchema, (btn_cancel, btn_payment)) form = get_form(request, CCardPayment, (btn_cancel, btn_payment))
form.render(dat) form.render(dat)
session.flash(result['message'], "error") session.flash(result['message'], "error")
return dict(form=form, params=dict(scripts="")) return dict(form=form, params=dict(scripts=""))
session.flash("Proses data berhasil") _query = (
if "form" in result: ("tx_id", result["tx_id"]),
response = request.response ("invoice_no", dat["invoice_no"]),
response.text = result["form"] ("card_no", values["card_no"]),
response.content_type = 'text/html' ("card_exp", values["card_exp"]),
return response ("card_cvv", values["card_cvv"]),
("card_name", values["card_name"]),
("callback_url", values["callback_url"]),
)
url = request.route_url("api-merchant-payment", _query=_query)
return HTTPFound(url)
elif denom[:2] in ["WL","PL"]:
result = register(request, data=data)
if result['code'] != 0:
form = get_form(request, WLPayment, (btn_cancel, btn_payment))
form.render(dat)
session.flash(result['message'], "error")
return dict(form=form, params=dict(scripts=""))
_query = (
("tx_id",result["tx_id"]),
("invoice_no",dat["invoice_no"]),
("callback_url",values["callback_url"]),
)
url = request.route_url("api-merchant-payment", _query=_query)
# url = request.route_url("api-merchant-payment", _query=_query)
return HTTPFound(url)
elif denom[:2] == "CP":
data.update(dict(va=dict(
cp_no=values["cp_no"],
item3=values["item3"],
cp_token=values["cp_token"],
)))
result = register(request, data=data)
if result['code'] != 0:
form = get_form(request, CPPayment, (btn_cancel, btn_payment))
form.render(dat)
session.flash(result['message'], "error")
return dict(form=form, params=dict(scripts=""))
_query = (
("tx_id",result["tx_id"]),
("invoice_no",dat["invoice_no"]),
("cp_no",values["cp_no"]),
("item3",values["item3"]),
("cp_token",values["cp_token"]),
("callback_url",values["callback_url"]),
)
url = request.route_url("api-merchant-payment", _query=_query)
# url = request.route_url("api-merchant-payment", _query=_query)
return HTTPFound(url)
# Virtual Account
elif denom[:2] == "VA": elif denom[:2] == "VA":
data.update(dict(va=dict( data.update(dict(va=dict(
valid_date=values['valid_date'], valid_date=values['valid_date'],
...@@ -781,7 +747,7 @@ def proses(request): ...@@ -781,7 +747,7 @@ def proses(request):
request.session.flash(result['message'], "error") request.session.flash(result['message'], "error")
return dict(form=form, params=dict(scripts="")) return dict(form=form, params=dict(scripts=""))
form = get_form(request, CVSResult, (btn_cancel, )) form = get_form(request, CVSResult, (btn_cancel,))
session.flash("Proses data berhasil") session.flash("Proses data berhasil")
values = result["cvs"] values = result["cvs"]
form.render(values) form.render(values)
...@@ -803,21 +769,24 @@ class ViewHome(BaseView): ...@@ -803,21 +769,24 @@ class ViewHome(BaseView):
c = form.validate(controls) c = form.validate(controls)
except ValidationFailure as e: except ValidationFailure as e:
form.set_appstruct(e.cstruct) form.set_appstruct(e.cstruct)
return dict(form=form) return dict(form=form, params=dict(scripts=""))
data = dict(request.POST.items()) data = dict(request.POST.items())
vendor = Partner.query_id(data["vendor_id"]).first() vendor = Partner.query_id(data["vendor_id"]).first()
if vendor: if vendor:
data.update({"vendor_kd": vendor.kode}) data.update({"vendor_kd": vendor.kode})
log.info("Data Requested server: {}".format(data))
session['payment'] = data session['payment'] = data
form = payment(request, data, form) form = payment(request, data, form)
values = dict(callback_url="{}/api/merchant/register/callback".format(request._host))
form.render(values)
return dict(form=form, params=dict(scripts=""))
elif 'proses' in request.POST: elif 'proses' in request.POST:
if 'payment' not in session: if 'payment' not in session:
form = get_form(request, RegisterSchema, (btn_cancel, btn_payment)) form = get_form(request, RegisterSchema, (btn_cancel, btn_payment))
session.flash("Payment Tidak Ditemukan") session.flash("Payment Tidak Ditemukan")
return dict(form=form, params=dict(scripts="") ) return dict(form=form, params=dict(scripts=""))
result = proses(request) result = proses(request)
if result: if result:
...@@ -832,6 +801,28 @@ class ViewHome(BaseView): ...@@ -832,6 +801,28 @@ class ViewHome(BaseView):
form.render(values) form.render(values)
return dict(form=form, params=dict(scripts="")) return dict(form=form, params=dict(scripts=""))
@view_config(route_name='api-merchant-register-callback',
# permission="api-merchant-register-callback",
renderer='templates/form.pt')
def form_merchant_register_callback(self):
request = self.req
if request.POST:
if 'cancel' in request.POST:
return route_register(request)
values = request.POST.items() and dict(request.POST.items()) or dict(request.GET.items())
# sm = colander.SchemaNode(colander.Tuple())
sm = colander.Schema()
for v in values:
sm.add(colander.SchemaNode(
colander.String(),
default=values[v], name=v,
widget=widget.TextInputWidget(readonly=True)
))
#form.render(values)
form = Form(sm, buttons=(btn_cancel,))
return dict(form=form, params=dict(scripts=""))
def get_row(id): def get_row(id):
return PartnerLog.query().filter_by(id=id).first() return PartnerLog.query().filter_by(id=id).first()
......
...@@ -13,7 +13,7 @@ from pyramid.view import view_config ...@@ -13,7 +13,7 @@ from pyramid.view import view_config
from ..tools import get_settings, get_jsonrpc from ..tools import get_settings, get_jsonrpc
log = logging.Logger(__name__) log = logging.getLogger(__name__)
def update_harga(p, k, v): def update_harga(p, k, v):
...@@ -73,6 +73,7 @@ def purchase_notify(order): ...@@ -73,6 +73,7 @@ def purchase_notify(order):
except: except:
pass pass
def payment_notify(order): def payment_notify(order):
customer = order.customer customer = order.customer
if customer and customer.website: if customer and customer.website:
...@@ -93,7 +94,7 @@ def payment_notify(order): ...@@ -93,7 +94,7 @@ def payment_notify(order):
requests.post(url, data=js, timeout=20) requests.post(url, data=js, timeout=20)
except: except:
pass pass
return
def proses_np(data): def proses_np(data):
# todo: # todo:
...@@ -104,7 +105,6 @@ def proses_np(data): ...@@ -104,7 +105,6 @@ def proses_np(data):
def api_vendor_notify(request): def api_vendor_notify(request):
vendor_nm = request.matchdict['name'] vendor_nm = request.matchdict['name']
data = json.loads(request.text) 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)
...@@ -114,18 +114,6 @@ def api_vendor_notify(request): ...@@ -114,18 +114,6 @@ def api_vendor_notify(request):
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
......
import json import json
import base64 import base64
import logging import logging
from opensipkd.base import get_settings from datetime import datetime
from opensipkd.base import get_settings, is_devel, get_host
from opensipkd.base.models import flush_row
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from . import Nicepay from . import Nicepay
from ..vendor import VendorClass from ..vendor import VendorClass, sha256
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class Vendor(VendorClass): #VendorClass class Vendor(VendorClass): # VendorClass
def __init__(self, vendor_produk, invoice_det, **kwargs): def __init__(self, vendor_produk, invoice_det, **kwargs):
VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det, **kwargs) VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det, **kwargs)
settings = get_settings() settings = get_settings()
self.mid = 'np_mid' in settings and settings['np_mid'] or None self.mid = 'np_mid' in settings and settings['np_mid'] or None
self.key = 'np_key' in settings and settings['np_key'] or None self.key = 'np_key' in settings and settings['np_key'] or None
self.url = 'np_url' in settings and settings['np_url'] or None self.url = 'np_url' in settings and settings['np_url'] or None
self.callback_url = 'np_callback' in settings and settings['np_callback'] or \ self.callback_url = "{}/api/vendor/np/callback".format(get_host())
'https://www.merchant.com/Notification' self.notify_url = "{}/api/vendor/np/notify".format(get_host())
self.notify_url = 'np_notify' in settings and settings['np_notify'] or \
'https://www.merchant.com/Notification'
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()
self.v_produk_kd = vendor_produk.kode self.v_produk_kd = vendor_produk.kode
if "ccard" in kwargs: self.ccard = "ccard" in kwargs and kwargs["ccard"] or None
ccard = kwargs["ccard"] self.cp = "cp" in kwargs and kwargs["cp"] or None
if ccard: self.cvs = "cvs" in kwargs and kwargs["cvs"] or None
self.card_cvv = ccard["card_cvv"] self.va = "va" in kwargs and kwargs["va"] or None
self.card_exp = ccard["card_exp"] self.pl = "pl" in kwargs and kwargs["pl"] or None
self.card_name = ccard["card_name"]
customer = self.invoice_det.customer customer = self.invoice_det.customer
if customer: if customer:
self.cust_kd = customer.kode self.cust_kd = customer.kode
self.cust_inv_no = self.invoice_det.cust_inv_no self.cust_inv_no = self.invoice_det.cust_inv_no
self.bank_cd, self.pay_method = self.v_produk_kd.split('-') self.bank_cd, self.pay_method = self.v_produk_kd.split('-')
if self.pay_method=="02": if self.pay_method == "02" and is_devel():
self.mid="VACTFOPEND" self.mid = "VACTFOPEND"
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()
...@@ -46,45 +45,44 @@ class Vendor(VendorClass): #VendorClass ...@@ -46,45 +45,44 @@ class Vendor(VendorClass): #VendorClass
self.amt = str(self.invoice_det.amt_sell) self.amt = str(self.invoice_det.amt_sell)
# setMandatoryParameter # setMandatoryParameter
def request_payment(self, response): # def request_payment(self, response):
Nicepay.requestData={} # Nicepay.requestData={}
Nicepay.set('timeStamp', self.invoice_det.time_stamp) # Nicepay.set('timeStamp', self.invoice_det.time_stamp)
Nicepay.set('referenceNo', self.cust_inv_no) # Nicepay.set('referenceNo', self.cust_inv_no)
Nicepay.set('tXid', response["tXid"]) # Nicepay.set('tXid', response["tXid"])
Nicepay.set('cardNo', self.invoice_det.card_no) # Nicepay.set('cardNo', self.invoice_det.card_no)
Nicepay.set('cardExpYymm', self.invoice_det.card_exp) # format Yymm '2012' # Nicepay.set('cardExpYymm', self.invoice_det.card_exp) # format Yymm '2012'
Nicepay.set('cardCvv', self.invoice_det.card_cvv) # Nicepay.set('cardCvv', self.invoice_det.card_cvv)
Nicepay.set('recurringToken', '') # Nicepay.set('recurringToken', '')
Nicepay.set('preauthToken', '') # Nicepay.set('preauthToken', '')
Nicepay.set('clickPayNo', '') # Nicepay.set('clickPayNo', '')
Nicepay.set('dataField3', '') # Nicepay.set('dataField3', '')
Nicepay.set('clickPayToken', '') # Nicepay.set('clickPayToken', '')
Nicepay.set('callBackUrl', self.callback_url) # Nicepay.set('callBackUrl', self.callback_url)
result = Nicepay.nicePayment() # result = Nicepay.nicePayment()
return result # return result
def set_static_params(self): def set_static_params(self):
if not self.cust_inv_no: if not self.cust_inv_no:
return return
Nicepay.set('timeStamp', self.invoice_det.inv_time_stamp) # Nicepay.set('timeStamp', self.invoice_det.inv_time_stamp) #
Nicepay.set('iMid', self.mid) Nicepay.set('iMid', self.mid)
Nicepay.set('payMethod', self.pay_method)
Nicepay.set('currency', 'IDR')
# Nicepay.set('amt', self.amt)
Nicepay.set('referenceNo', self.cust_inv_no) Nicepay.set('referenceNo', self.cust_inv_no)
Nicepay.set('userIP', self.invoice_det.inv_cust_ip) Nicepay.set('amt', str(self.invoice_det.amt_sell))
Nicepay.set('dbProcessUrl', self.notify_url)
# Nicepay.set('merchantKey', self.key)
Nicepay.merchantKey = self.key Nicepay.merchantKey = self.key
Nicepay.set('merchantToken', Nicepay.merchantToken()) Nicepay.set('merchantToken', Nicepay.merchantToken())
# Nicepay.set("userLanguage", "en-US")
Nicepay.set("userLanguage", "")
Nicepay.set('reqClientVer', '2.0')
return True return True
def set_billing_param(self): def set_billing_param(self):
if not self.invoice_det: if not self.invoice_det:
return return
Nicepay.set('payMethod', self.pay_method)
Nicepay.set('currency', 'IDR')
Nicepay.set('userIP', self.invoice_det.inv_cust_ip)
Nicepay.set('dbProcessUrl', self.notify_url)
Nicepay.set("userLanguage", "")
Nicepay.set('reqClientVer', '')
Nicepay.set('goodsNm', self.invoice_det.notes) Nicepay.set('goodsNm', self.invoice_det.notes)
Nicepay.set('billingNm', self.invoice_det.inv_cust_nm) Nicepay.set('billingNm', self.invoice_det.inv_cust_nm)
Nicepay.set('billingPhone', self.invoice_det.inv_cust_phone) Nicepay.set('billingPhone', self.invoice_det.inv_cust_phone)
...@@ -106,8 +104,6 @@ class Vendor(VendorClass): #VendorClass ...@@ -106,8 +104,6 @@ class Vendor(VendorClass): #VendorClass
return True return True
def set_optional_param(self): def set_optional_param(self):
# pass
# setOptionalParameter
Nicepay.set('deliveryNm', self.invoice_det.delivery_nm) Nicepay.set('deliveryNm', self.invoice_det.delivery_nm)
Nicepay.set('deliveryPhone', self.invoice_det.delivery_phone) Nicepay.set('deliveryPhone', self.invoice_det.delivery_phone)
Nicepay.set('deliveryAddr', self.invoice_det.delivery_addr) Nicepay.set('deliveryAddr', self.invoice_det.delivery_addr)
...@@ -115,40 +111,33 @@ class Vendor(VendorClass): #VendorClass ...@@ -115,40 +111,33 @@ class Vendor(VendorClass): #VendorClass
Nicepay.set('deliveryState', self.invoice_det.delivery_state) Nicepay.set('deliveryState', self.invoice_det.delivery_state)
Nicepay.set('deliveryPostCd', self.invoice_det.delivery_pos) Nicepay.set('deliveryPostCd', self.invoice_det.delivery_pos)
Nicepay.set('deliveryCountry', self.invoice_det.delivery_country) Nicepay.set('deliveryCountry', self.invoice_det.delivery_country)
# print('>>> INVOICE DET:', self.invoice_det.vat, type(self.invoice_det.vat), # print('>>> INVOICE DET:', self.invoice_det.vat, type(self.invoice_det.vat),
# self.invoice_det.fee, type(self.invoice_det.fee), # self.invoice_det.fee, type(self.invoice_det.fee),
# self.invoice_det.notax_amt, type(self.invoice_det.notax_amt)) # self.invoice_det.notax_amt, type(self.invoice_det.notax_amt))
Nicepay.set('vat', self.invoice_det.vat and int(self.invoice_det.vat) > 0 and \
str(self.invoice_det.vat) or '')
Nicepay.set('fee', self.invoice_det.fee and int(self.invoice_det.fee) > 0 and \
str(self.invoice_det.fee) or '')
no_tax_amt = self.invoice_det.notax_amt and int(self.invoice_det.notax_amt) > 0 and\
str(self.invoice_det.notax_amt) or ''
Nicepay.set('notaxAmt', no_tax_amt)
# Nicepay.set('reqDt', self.invoice_det.req_dt) # Format (YYYYMMDD)
# Nicepay.set('reqTm', self.invoice_det.req_tm) # Format (HHiiss)
Nicepay.set('reqDt', '') # Format (YYYYMMDD)
Nicepay.set('reqTm', '') # Format (HHiiss)
Nicepay.set('reqClientVer', '') Nicepay.set('reqClientVer', '')
Nicepay.set('instmntType', '') Nicepay.set('reqDt', self.invoice_det.req_dt) # Format (YYYYMMDD)
Nicepay.set('instmntMon', '') Nicepay.set('reqTm', self.invoice_det.req_tm) # Format (HHiiss)
Nicepay.set('mRefNo', '') # Nicepay.set('reqDt', '') # Format (YYYYMMDD)
# Nicepay.set('reqTm', '') # Format (HHiiss)
# Nicepay.set('instmntType', '')
# Nicepay.set('instmntMon', '')
# Nicepay.set('mRefNo', '')
# result dari nicepay # result dari nicepay
# Nicepay.set('tXid', '') # Nicepay.set('tXid', '')
# Nicepay.set('transDt', '') # Nicepay.set('transDt', '')
# Nicepay.set('transTm', '') # Nicepay.set('transTm', '')
# Nicepay.set('payValidDt', '')
Nicepay.set('payValidDt', '') # Nicepay.set('payValidTm', '')
Nicepay.set('payValidTm', '') # Nicepay.set('recurrOpt', '')
Nicepay.set('recurrOpt', '')
def register(self): def register(self):
Nicepay.requestData = {} Nicepay.requestData = {}
if not self.set_billing_param() or not self.set_static_params(): if not self.set_billing_param() or not self.set_static_params():
return return
data = str(json.dumps(self.invoice_det.cart)) data = self.invoice_det.cart
cart_data = data and '{}'.format(data) or '{}' cart_data = data or {}
Nicepay.set('cartData', cart_data) Nicepay.set('cartData', cart_data)
self.set_optional_param() self.set_optional_param()
# For Credit Card (Don't forgot change payMethod to '01') # For Credit Card (Don't forgot change payMethod to '01')
...@@ -156,7 +145,17 @@ class Vendor(VendorClass): #VendorClass ...@@ -156,7 +145,17 @@ class Vendor(VendorClass): #VendorClass
Nicepay.set('recurrOpt', str(self.invoice_det.recurr_opt)) Nicepay.set('recurrOpt', str(self.invoice_det.recurr_opt))
Nicepay.set('instmntMon', str(self.invoice_det.instmnt_mon) or '') Nicepay.set('instmntMon', str(self.invoice_det.instmnt_mon) or '')
Nicepay.set('instmntType', str(self.invoice_det.instmnt_type) or '') Nicepay.set('instmntType', str(self.invoice_det.instmnt_type) or '')
vat = self.invoice_det.vat and int(self.invoice_det.vat) > 0 and \
str(self.invoice_det.vat) or ''
fee = self.invoice_det.fee and int(self.invoice_det.fee) > 0 and \
str(self.invoice_det.fee) or ''
Nicepay.set('vat', vat)
Nicepay.set('fee', fee)
no_tax_amt = self.invoice_det.notax_amt and \
int(self.invoice_det.notax_amt) > 0 and \
str(self.invoice_det.notax_amt) or ''
Nicepay.set('notaxAmt', no_tax_amt)
# For Virtual Account (Don't forgot change payMethod to '02') # For Virtual Account (Don't forgot change payMethod to '02')
elif self.pay_method == '02': elif self.pay_method == '02':
Nicepay.set('bankCd', self.bank_cd) Nicepay.set('bankCd', self.bank_cd)
...@@ -174,17 +173,18 @@ class Vendor(VendorClass): #VendorClass ...@@ -174,17 +173,18 @@ class Vendor(VendorClass): #VendorClass
# (Don't forgot change payMethod to '03'/'04'/'05') # (Don't forgot change payMethod to '03'/'04'/'05')
elif self.pay_method in ['03']: elif self.pay_method in ['03']:
Nicepay.set('mitraCd', self.bank_cd) Nicepay.set('mitraCd', self.bank_cd)
# For CVS Only
Nicepay.set('payValidDt', self.invoice_det.inv_valid_date) # Format (YYYYMMDD) Nicepay.set('payValidDt', self.invoice_det.inv_valid_date) # Format (YYYYMMDD)
Nicepay.set('payValidTm', self.invoice_det.inv_valid_time) # Format (HHiiss) Nicepay.set('payValidTm', self.invoice_det.inv_valid_time) # Format (HHiiss)
# For Click Pay
elif self.pay_method == '04': elif self.pay_method == '04':
Nicepay.set('mRefNo', self.cust_inv_no) Nicepay.set('mitraCd', self.bank_cd)
Nicepay.set('bankCd', self.bank_cd)
# E-Wallet
elif self.pay_method == '05': elif self.pay_method == '05':
Nicepay.set('mitraCd', self.bank_cd) Nicepay.set('mitraCd', self.bank_cd)
# For Pay Loan
elif self.pay_method == '06': elif self.pay_method == '06':
Nicepay.set('recurrOpt', str(self.invoice_det.recurr_opt)) Nicepay.set('recurrOpt', str(self.invoice_det.recurr_opt))
Nicepay.set('instmntMon', str(self.invoice_det.instmnt_mon) or '') Nicepay.set('instmntMon', str(self.invoice_det.instmnt_mon) or '')
...@@ -195,14 +195,19 @@ class Vendor(VendorClass): #VendorClass ...@@ -195,14 +195,19 @@ class Vendor(VendorClass): #VendorClass
# Process to nice pay register # Process to nice pay register
self.request = Nicepay.requestData self.request = Nicepay.requestData
log.info("NP REQUEST: {}".format(json.dumps(self.request))) np_request=self.request
np_request["cartData"]=json.dumps(np_request["cartData"])
log.info("NP PRE REQUEST: {}".format(np_request))
log.info("NP REQUEST: {}".format(json.dumps(np_request)))
self.save_log('inquiry') self.save_log('inquiry')
result_data = Nicepay.niceRegister() result_data = Nicepay.niceRegister()
response = json.loads(result_data) response = json.loads(result_data)
self.response = response self.response = response
log.info("NP RESPONSE: {}".format(json.dumps(self.response))) log.info("NP RESPONSE: {}".format(json.dumps(self.response)))
self.response = response self.response = response
# # Payment Response String Format self.save_log("inquiry")
# Register Response String Format
if 'resultCd' not in response: if 'resultCd' not in response:
self.result = dict( self.result = dict(
error="Connection Timeout. Please Try Again!" error="Connection Timeout. Please Try Again!"
...@@ -212,74 +217,72 @@ class Vendor(VendorClass): #VendorClass ...@@ -212,74 +217,72 @@ class Vendor(VendorClass): #VendorClass
else: else:
result = dict() result = dict()
try:
result_code = int(response['resultCd']) result_code = int(response['resultCd'])
except:
result_code = 999
result["code"] = result_code result["code"] = result_code
result["message"] = response['resultMsg'] result["message"] = response['resultMsg']
if result_code == 0: # or self.pay_method == '01': if result_code == 0: # or self.pay_method == '01':
result["currency"] = response['currency']
# result["tx_id"] = response['tXid']
# result['trans_dt'] = response['transDt']
# result['trans_tm'] = response['transTm']
result["amount"] = response['amt']
result["invoice_no"] = response['referenceNo']
result["description"] = response['description']
# result['pay_method'] = self.pay_method
if self.pay_method == "01":
result["code"] = 0 result["code"] = 0
result["message"] = 'SUCCESS' result["message"] = 'SUCCESS'
request_data = Nicepay.requestData time_stamp = datetime.now().strftime('%Y%m%d%H%M%S')
settings = get_settings() key = sha256("{}{}".format(self.cust_inv_no, time_stamp))
call_back_url = settings['switcher_call_back_url'] tx_id = "{}{}".format(self.invoice_det.customer.users.user_name, key)
result.update(dict( result["tx_id"] = tx_id
time_stamp=request_data['timeStamp'], result["invoice_no"] = response['referenceNo']
tx_id=self.invoice_det.tx_id, result["amount"] = response['amt']
merchant_token=request_data['merchantToken'], result["trans_date"] = response['transDt']
call_back_url=call_back_url, result["trans_time"] = response['transTm']
)) result["description"] = response['description']
# todo result harus html self.invoice_det.trans_dt = response["transDt"]
settings = get_settings() self.invoice_det.trans_tm = response["transTm"]
form = """<!DOCTYPE html> self.invoice_det.tx_id = tx_id
<html lang="en-us"> self.vend_inv_no = response["tXid"]
<head> # if self.pay_method == "01":
<meta http-equiv="content-type" content="text/html; charset=utf-8"> # request_data = Nicepay.requestData
<title>Payment</title> # settings = get_settings()
</head> # call_back_url = settings['switcher_call_back_url']
<body> # result.update(dict(
<form action="{url}/api/merchant/payment" method="post" name="payment"> # time_stamp=request_data['timeStamp'],
<input type="text" name="timeStamp" value="{time_stamp}"> # tx_id=self.invoice_det.tx_id,
<input type="text" name="tXid" value="{tx_id}"> # merchant_token=request_data['merchantToken'],
<input type="text" name="merchantToken" value="{merchant_token}"> # call_back_url=call_back_url,
<input type="text" name="cardNo" value="{card_no}"> # ))
<input type="text" name="cardExpYymm" value="{card_exp}"> # todok result harus html
<input type="text" name="cardCvv" value="{card_cvv}"> # settings = get_settings()
<input type="text" name="cardHolderNm" value="{card_holder_nm}"> # form = """<!DOCTYPE html>
<input type="text" name="callBackUrl" value="{call_back_url}"> # <html lang="en-us">
<button type="submit" value="Submit" name="submit">Submit</button> # <head>
</form> # <meta http-equiv="content-type" content="text/html; charset=utf-8">
<script> # <title>Payment</title>
//document.write("Hello World!") # </head>
</script> # <body>
<noscript>Your browser does not support JavaScript!</noscript>
</body> # <script>
</html> # //document.write("Hello World!")
""".format( # </script>
url=settings["_host"], # <noscript>Your browser does not support JavaScript!</noscript>
time_stamp=request_data['timeStamp'], # </body>
tx_id=result['tx_id'], # </html>
merchant_token=request_data['merchantToken'], # """.format(
card_no=self.invoice_det.card_no, # url=settings["_host"],
card_exp=self.card_exp, # time_stamp=request_data['timeStamp'],
card_cvv=self.card_cvv, # tx_id=result['tx_id'],
card_holder_nm=self.card_name, # merchant_token=request_data['merchantToken'],
call_back_url=call_back_url, # card_no=self.invoice_det.card_no,
) # card_exp=self.card_exp,
result['form'] = form # card_cvv=self.card_cvv,
elif self.pay_method == "02": # card_holder_nm=self.card_name,
# call_back_url=call_back_url,
# )
# result['form'] = form
if self.pay_method == "02":
result["va"] = dict( result["va"] = dict(
vacct_no=response['vacctNo'], vacct_no=response['vacctNo'],
valid_date=response['vacctValidDt'], valid_date=response['vacctValidDt'],
valid_time=response['vacctValidTm'], valid_time=response['vacctValidTm'],
) )
self.invoice_det.card_no = response['vacctNo'] self.invoice_det.card_no = response['vacctNo']
...@@ -289,103 +292,338 @@ class Vendor(VendorClass): #VendorClass ...@@ -289,103 +292,338 @@ class Vendor(VendorClass): #VendorClass
pay_no=response['payNo'], pay_no=response['payNo'],
valid_date=response['payValidDt'], valid_date=response['payValidDt'],
valid_time=response['payValidTm'], valid_time=response['payValidTm'],
) )
self.invoice_det.card_no = response['payNo'] self.invoice_det.card_no = response['payNo']
elif self.pay_method == "04":
# clickpay
result["receipt_code"]=response['receiptCode']
elif self.pay_method == "05":
# e-wallet
result["receipt_code"]='receiptCode' in response and response['receiptCode'] or ''
elif self.pay_method == "06":
# akulaku
pass
# elif self.pay_method == "04":
# # clickpay
# result["receipt_code"]=response['receiptCode']
# elif self.pay_method == "05":
# # e-wallet
# result["receipt_code"]='receiptCode' in response and response['receiptCode'] or ''
# elif self.pay_method == "06":
# # akulaku
# pass
self.result = result self.result = result
# self.save_log('inquiry')
self.invoice_det.tx_id=response["tXid"]
self.invoice_det.trans_dt=response["transDt"]
self.invoice_det.trans_tm=response["transTm"]
self.save_log(typ="inquiry") self.save_log(typ="inquiry")
return dict(data=result) return dict(data=result)
def payment(self): def payment(self, data):
Nicepay.requestData = {}
Nicepay.merchantKey = self.key
self.set_static_params()
# Nicepay.set('referenceNo', self.invoice_det.cust_inv_no)
# Nicepay.set('amt', self.invoice_det.amt_sell)
# Nicepay.set('merchantToken', Nicepay.merchantToken())
# Nicepay.set('callBackUrl', self.callback_url)
# Nicepay.set('tXid', str(self.invoice_det.vend_inv_no) or '')
url = "{}/payment".format(self.url) url = "{}/payment".format(self.url)
return HTTPFound(url) if self.pay_method == '01':
if not req_fields(data, ["card_no", "callback_url", "card_exp",
# https://api.nicepay.co.id/nicepay/direct/v2/registration "card_name", "card_cvv"]):
# Request Body return
""" self.invoice_det.card_no = data["card_no"]
{ self.invoice_det.callback_url = data["callback_url"]
"deliveryPhone": "62-21-0000-0000", flush_row(self.invoice_det)
"mitraCd": "ALMA", #
"fee": "0", # Nicepay.set('cardNo', str(self.invoice_det.card_no) or '')
"amt": "1000", # Nicepay.set('cardExpYymm', str(data["card_exp"]) or '')
"description": "this is test transaction!!", # Nicepay.set('cardCvv', str(data["card_cvv"]) or '')
"notaxAmt": "0", # Nicepay.set('cardHolderNm', str(data["card_name"]) or '')
"reqDomain": "localhost", request_data = Nicepay.requestData
"userLanguage": "ko-KR,en-US;q=0.8,ko;q=0.6,en;q=0.4", script = """
"vacctValidDt": "", function submit_form(){
"billingEmail": "no-reply@ionpay.net", $("form[name='payment']").submit();
"merFixAcctId": "", }
"payMethod": "01", $(window).load(function(){
"deliveryAddr": "Jalan Jenderal Gatot Subroto Kav.57", submit_form();
"billingCountry": "ID", });
"userIP": "0:0:0:0:0:0:0:1", """
"instmntMon": "1", #/api/merchant/payment
"currency": "IDR", form = """
"payValidDt": "", <form action="{url}" method="post" name="payment">
"deliveryCity": "Jakarta", <input type="hidden" name="timeStamp" value="{time_stamp}">
"merchantToken": "b5149659e1a2f1271fb0833f8ea20e174b6fd389db26bc6ad036cc0dae6fa797", <input type="hidden" name="tXid" value="{tx_id}">
"goodsNm": "T-1000", <input type="hidden" name="merchantToken" value="{merchant_token}">
"referenceNo": "OrdNo2017717942577", <input type="hidden" name="cardNo" value="{card_no}">
"vat": "0", <input type="hidden" name="cardExpYymm" value="{card_exp}">
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/60.0.3112.101 Safari/537.36", <input type="hidden" name="cardCvv" value="{card_cvv}">
"billingState": "Jakarta", <input type="hidden" name="cardHolderNm" value="{card_holder_nm}">
"userSessionID": "697D6922C961070967D3BA1BA5699C2C", <input type="hidden" name="callBackUrl" value="{call_back_url}">
"instmntType": "1", </form>
"deliveryNm": "HongGilDong", <script>
"deliveryPostCd": "12950", {script}
"reqClientVer": "", </script>
"iMid": "IONPAYTEST",
"billingNm": "HongGilDong", <noscript>Your browser does not support JavaScript!</noscript>
"timeStamp": "20170822170942", """.format(
"dbProcessUrl": "http://127.0.0.1:8080/nicepay/test3/dbProcess.do", url=url,
"payValidTm": "", time_stamp=self.invoice_det.inv_time_stamp,
"cartData": "{“count”: “1”, tx_id=self.invoice_det.vend_inv_no,
“item”: [{“img_url”: “https://www.lecs.com/image/introduction/img_vmd020101.jpg”, merchant_token=request_data['merchantToken'],
“goods_name”: “Jam Tangan Army - Strap Kulit - Hitam”, card_no=self.invoice_det.card_no,
“goods_detail”: “jumlah 1”, card_exp=str(data["card_exp"]),
“goods_amt”: “400”}]}", card_cvv=str(data["card_cvv"]),
"deliveryState": "Jakarta", card_holder_nm=str(data["card_name"]),
"deliveryCountry": "ID", call_back_url=self.callback_url,
"bankCd": "", script=script
"billingPostCd": "12950", )
"billingAddr": "Jalan Jenderal Gatot Subroto Kav.57",
"reqServerIP": "172.29.2.178", elif self.pay_method == '04':
"vacctValidTm": "", if not req_fields(data, ["cp_no", "item3", "cp_token",
"billingPhone": "021-579-00000", "callback_url"]):
"billingCity": "Jakarta" return
self.invoice_det.card_no = data["cp_no"]
self.invoice_det.callback_url = data["callback_url"]
flush_row(self.invoice_det)
request_data = Nicepay.requestData
script = """
function submit_form(){
$("form[name='payment']").submit();
} }
// Response Body $(window).load(function(){
{ submit_form();
"resultCd": "0000", });
"resultMsg": "SUCCESS", """
"tXid": "IONPAYTEST01201708221510237472", # /api/merchant/payment
"referenceNo": "OrdNo2017717942577", form = """
"payMethod": "01", <form action="{url}" method="post" name="payment">
"amt": "1000", <input type="hidden" name="timeStamp" value="{time_stamp}">
"transDt": "20170822", <input type="hidden" name="tXid" value="{tx_id}">
"transTm": "171029", <input type="hidden" name="clickPayNo" value="{cp_no}">
"description": "this is test transaction!!", <input type="hidden" name="dataField3" value="{item3}">
"bankCd": null, <input type="hidden" name="clickPayToken" value="{cp_token}">
"vacctNo": null, <input type="hidden" name="merchantToken" value="{merchant_token}">
"mitraCd": null, <input type="hidden" name="callBackUrl" value="{call_back_url}">
"payNo": null </form>
…. <script>
{script}
</script>
<noscript>Your browser does not support JavaScript!</noscript>
""".format(
url=url,
time_stamp=self.invoice_det.inv_time_stamp,
tx_id=self.invoice_det.vend_inv_no,
merchant_token=request_data['merchantToken'],
cp_no=self.invoice_det.card_no,
item3=str(data["item3"]),
cp_token=str(data["cp_token"]),
call_back_url=self.callback_url,
script=script
)
elif self.pay_method == '05':
if not req_fields(data, ["callback_url"]):
return
self.invoice_det.callback_url = data["callback_url"]
flush_row(self.invoice_det)
request_data = Nicepay.requestData
script = """
function submit_form(){
$("form[name='payment']").submit();
}
$(window).load(function(){
submit_form();
});
"""
# /api/merchant/payment
form = """
<form action="{url}" method="post" name="payment">
<input type="hidden" name="timeStamp" value="{time_stamp}">
<input type="hidden" name="tXid" value="{tx_id}">
<input type="hidden" name="merchantToken" value="{merchant_token}">
<input type="hidden" name="callBackUrl" value="{call_back_url}">
</form>
<script>
{script}
</script>
<noscript>Your browser does not support JavaScript!</noscript>
""".format(
url=url,
time_stamp=self.invoice_det.inv_time_stamp,
tx_id=self.invoice_det.vend_inv_no,
merchant_token=request_data['merchantToken'],
call_back_url=self.callback_url,
script=script
)
self.request = data
self.save_log("payment")
return dict(form=form)
def callback(self, data):
self.response = data
log.info("Payment Result: {}".format(data))
self.result = get_result(self.response, self.pay_method)
self.save_log("payment")
script = """
function submit_form(){
$("form[name='callback']").submit();
} }
$(window).load(function(){
submit_form();
});
"""
# /api/merchant/payment
f = ""
result = self.result
for r in result:
if r and type(result[r])==dict:
rs = result[r]
for s in rs:
f += '<input type="hidden" name="{k}" value="{v}">'.format(k=s, v=rs[s])
else:
f += '<input type="hidden" name="{k}" value="{v}">'.format(k=r, v=result[r])
form = """
<form action="{url}" method="post" name="callback">
{f}
<button type="button" value="Submit" name="submit2">Submit</button>
</form>
<script>
{script}
</script>
<noscript>Your browser does not support JavaScript!</noscript>
""".format(
url=self.invoice_det.callback_url,
script=script,
f=f
)
return dict(form=form)
def advice(self):
Nicepay.requestData = {}
self.set_static_params()
Nicepay.set("tXid", self.invoice_det.vend_inv_no)
self.request = Nicepay.requestData
self.save_log("advice")
self.response = Nicepay.niceInquiry()
self.save_log("advice")
self.result = get_result(self.response, self.pay_method)
self.save_log("advice")
def notify(self, data):
amount = self.invoice_det.amt_sell
vend_inv_no = self.invoice_det.vend_inv_no
merchant_token = data["merchantToken"]
signature = sha256("{mid}{vend_inv_no}{amount}{key}" \
.format(mid=self.mid, key=self.key, amount=str(amount),
vend_inv_no=vend_inv_no))
if merchant_token != signature:
return
self.response = data
self.result = get_result(self.response, self.pay_method)
self.save_log("notify")
return self.result
"""
def get_result(response, pay_method):
result = dict(
code=int(response["resultCd"]),
message=response["resultMsg"],
# cancel_amt=response["cancelAmt"],
# deposit_date=response["depositDt"],
# deposit_time=response["depositTm"],
)
if pay_method == "01":
result.update(dict(
cc=dict(
auth_no=response["authNo"],
issue_bank=response["issuBankCd"],
issue_bank_nm='issuBankNm' in response and response["issuBankNm"] or "",
acqu_bank=response["acquBankCd"],
acqu_bank_nm='acquBankNm' in response and response["acquBankNm"] or "",
acqu_status='acquStatus' in response and response["acquStatus"] or "",
card_no=response["cardNo"],
card_exp=response["cardExpYymm"],
instmnt_mon=response["instmntMon"],
instmnt_tpe=response["instmntType"],
preauth_token=response["preauthToken"],
recurring_token=response["recurringToken"],
cc_trans_type=response["ccTransType"],
vat="vat" in response and int(response["vat"]) or 0,
fee="fee" in response and int(response["fee"]) or 0,
no_tax_amt="notaxAmt" in response and int(response["notaxAmt"]) or 0,
)
))
"""
Additional Credit Card Response Json Object
Parameter Type Size Description
authNo N 10 Approval Number
issuBankCd A 4 Issue Bank Code, refer Code at Here
acquBankCd A 4 Acquire Bank Code, refer Code at Here
cardNo AN 20 Card No with masking
cardExpYymm N 4 card expiry(YYMM)
instmntMon N 2 Installment month
instmntType N 2 Installment Type, refer Code at Here
preauthToken AN 255 Pre-Auth Token (need for capture)
recurringToken AN 255 Recurring Token (Can use next payment)
ccTransType AN 2 Credit Card Transaction Type
acquStatus AN 2 Purchase Status
1: Normal
2: Recurring
3: Pre-auth
4: Capture
vat N 12 Vat
fee N 12 service fee
notaxAmt N 12 tax free amount
"""
elif pay_method == "02":
"""
Additional Virtual Account Response Json Object
Parameter Type Size Description
bankCd AN 4 Bank Code, refer Code at Here
vacctNo N 16 Bank Virtual Account number
vacctValidDt N 8 VA expiry date (YYYYMMDD)
vacctValidTm N 6 VA expiry time (HH24MISS)
"""
result.update(dict(
va=dict(
vaacct_no=response["vacctNo"],
valid_date=response["vacctValidDt"],
valid_time=response["vacctValidTm"]
)
))
else:
"""
Additional Others Response Json Object
Parameter Type Size Description
mitraCd A 4 Mitra code, refer Code at Here
(CVS, ClickPay, E-Wallet)
payNo N 12 CVS number (CVS)
payValidDt N 8 CVS expiry date (YYYYMMDD) (CVS)
payValidTm N 6 CVS expiry time (HH24MISS) (CVS)
mRefNo AN 20 Bank reference No (CVS)
receiptCode ANS 18 Authorization code (CVS)
"""
other = dict(
pay_no="payNo" in response and response["payNo"] or "",
valid_date="payValidDt" in response and response["payValidDt"] or "",
valid_time="payValidTm" in response and response["payValidTm"] or "",
m_ref_no="mRefNo" in response and response["mRefNo"] or "",
receipt_code="receiptCode" in response and response["receiptCode"] or ""
)
if pay_method == "03":
result.update({"cvs": other})
elif pay_method == "04":
result.update({"cp": other})
elif pay_method == "05":
result.update({"wl": other})
else:
result.update({"pl": other})
return result
def req_fields(data, fields):
for f in fields:
if f not in data or not data[f]:
return
return True
from _sha256 import sha256
import logging import logging
from agratek.api.merchant.views.notify_vendor import purchase_notify, update_harga from opensipkd.pasar.models.produk import PartnerPay, PartnerProduk
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__) log = logging.getLogger(__name__)
from . import Vendor
def callback(request): def proses(data):
data = dict(request.POST.items()) code = "resultCd" in data and data["resultCd"] and int(data["resultCd"]) or 0
tx_id = data["tXid"] message = "resultMsg" in data and data["resultMsg"] or ""
if tx_id: if code!=0:
row = PartnerPay.query_txid(tx_id).first() return dict(form="Error in NV CALLBACK {}, {}".format(code, message), code=code, message=message)
return row.callback_url
vend_inv_no = data["tXid"]
cus_inv_no = data["referenceNo"]
invoice_det = PartnerPay.query_vend_inv_no(vend_inv_no)\
.filter_by(cust_inv_no=cus_inv_no).first()
if not invoice_det:
return
vendor_produk = PartnerProduk.query()\
.filter_by(partner_id=invoice_det.vendor_id,
produk_id=invoice_det.produk_id).first()
vendor = Vendor(vendor_produk, invoice_det)
result = vendor.callback(data)
print("callback.py", result)
return result
from _sha256 import sha256
import logging import logging
from agratek.api.merchant.views.notify_vendor import purchase_notify, update_harga, payment_notify from agratek.api.merchant.views.notify_vendor import payment_notify
from opensipkd.base import get_settings from opensipkd.pasar.models.produk import PartnerPay, PartnerProduk
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__) log = logging.getLogger(__name__)
from . import Vendor
def proses(data): def proses(data):
settings = get_settings() vend_inv_no = data["tXid"]
mid = 'np_mid' in settings and settings["np_mid"] or None cus_inv_no = data["referenceNo"]
key = 'np_key' in settings and settings["np_key"] or None invoice_det = PartnerPay.query_vend_inv_no(vend_inv_no)\
partner = Partner.query_kode("NP").first() .filter(cust_inv_no=cus_inv_no)
status = str(data["status"]) vendor_produk = PartnerProduk.query()\
amount = data["amt"] .filter_by(partner_id=invoice_det.vendor_id,
tx_id = data["tXid"] produk_id=invoice_det.produk_id)
merchant_token = data["merchantToken"]
ref_no = data["referenceNo"] vendor = Vendor(vendor_produk, invoice_det)
signature = sha256("{mid}{tx_id}{amount}{key}"\ vendor.notify(data)
.format(mid=mid, key=key, amount=str(amount), return payment_notify(invoice_det)
tx_id=tx_id))
if merchant_token!=signature:
return
pay = PartnerPay.query_txid(tx_id).filter(cust_inv_no=ref_no).first()
if not pay:
return
result=dict()
pay.notify= dict(response=data,
result=result)
pay.status = 1
flush_row(pay)
payment_notify(pay)
return pay
"""
Common Parameter for Notification
Parameter Type Size Description
tXid N 30 Transaction ID
merchantToken AN 255 Merchant Token
referenceNo N 40 Merchant Order No
payMethod N 2 Payment method. Refer Code at Here
amt N 12 Payment amount
transDt N 8 Transaction date
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
"""
...@@ -70,7 +70,7 @@ def form_validator(form, value): ...@@ -70,7 +70,7 @@ def form_validator(form, value):
def get_form(request, class_form, buttons=None, row=None): def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator) schema = class_form(validator=form_validator)
schema = schema.bind(produk=Produk.get_e_list(), schema = schema.bind(produk=Produk.get_list(),
vendor=Partner.get_vendor_list(), vendor=Partner.get_vendor_list(),
departemen=Departemen.get_list()) departemen=Departemen.get_list())
schema.request = request schema.request = request
......
<html metal:use-macro="load: base-no-menu.pt"> <html metal:use-macro="load: opensipkd.base:views/templates/base3-clean.pt">
<div metal:fill-slot="scripts">
${structure:form}
</div>
</html> </html>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!