Files
WrenchBoradWeb/wrenchboard/src/shared_tool/interswitch_sendmoney.cc
T
2019-05-31 11:26:35 -04:00

1563 lines
62 KiB
C++

#include <cstdlib>
#include <ext/hash_map>
#include "interswitch.h"
#include "interswitch_sendmoney.h"
#include "cfg.h"
#include "clog.h"
#include "exceptions.h"
#include "input.h"
#include "wrenchboard_api.h"
#include "pgsql.h"
#include "pgsql_wrapper.h"
#include "safestring.h"
#include "email.h"
#include "payments.h"
#include "common_tool.h"
#include <string>
#include <stdexcept>
using namespace std;
using namespace __gnu_cxx;
//*****************************************************************************/
// usually the function called from back office
/*
sendmoney_payment sendmoney_payment_id_key sendmoney_payment_id_seq sendmoney_recipient sendmoney_recipient_id_key sendmoney_recipient_id_seq
wrenchboard=> \d money_transfer;
Table "public.money_transfer"
Column | Type | Modifiers
------------------------------+-----------------------------+-------------------------------------------------------------
id | integer | not null default nextval('money_transfer_id_seq'::regclass)
channel | character varying(10) |
initiatingentitycode | character varying(3) | not null
member_id | integer |
initiatingamount | integer | not null
fee | integer | default 0
initiatingchannel | integer |
initiatingpaymentmethodcode | character varying(2) | not null
initiatingcurrencycode | character varying(3) | default '566'::character varying
recipientid | integer |
terminatingpaymentmethodcode | character varying(2) | not null
terminatingamount | integer | not null
terminatingcurrencycode | character varying(3) | default '566'::character varying
terminatingcountrycode | character varying(2) | default 'NG'::character varying
terminatingentitycode | character varying(5) | not null
added | timestamp without time zone | default now()
terminatingaccountnumber | character varying(50) |
terminatingaccounttype | character varying(2) |
transactionid | character varying(15) | not null
transfer_code | character varying(15) |
status | integer | default 1
completed
*/
long INTW_doCompleteSavedTransfer(CVars in, CVars &out) {
//plog->SetFileName( PREFIX"/logs/send_money.log" );
logfmt(logINFO, "long INTW_doTransfer(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
long transfer_id = REQ_LONG(in, "sendmoney_id", 0, -1);
ret = load_db_record(in, "SELECT * FROM money_transfer WHERE id = %lu", transfer_id);
long senderid = REQ_LONG(in, "member_id", 1, -1);
in["senderid"] = senderid; in["senderid"].set_valid( true );
long recipientid = REQ_LONG(in, "recipientid", 1, -1);
in["InitiatingEntityCode"] = "MBA";
in["InitiatingEntityCode"].set_valid(true);
CVars recipient; // Load recipient
/*recipient["firstname"] = in["firstname"]; recipient["firstname"].set_valid( true );
recipient["lastname"] = in["lastname"]; recipient["lastname"].set_valid( true );
recipient["account_no"] = in["account_no"]; recipient["account_no"].set_valid( true );
recipient["bank_code"] = in["bank_code"]; recipient["bank_code"].set_valid( true );
recipient["account_type"] = in["account_type"]; recipient["account_type"].set_valid( true );*/
ret = load_db_record(recipient, "SELECT firstname,lastname,account_no,bank_code,account_type FROM sendmoney_recipient WHERE id = %lu AND member_id = %lu AND status = 1", recipientid, senderid);
if (ret < 1L) {
throw new bad_parameter(out, "recipientid");
}
CVars sender; // Load sender
ret = load_db_record(sender, "SELECT firstname,lastname,balance FROM members WHERE id = %lu AND status = 1", senderid);
if (ret < 1L) {
throw new bad_parameter(out, "senderid");
}
CVars transaction;
transaction["detail_id"] = transfer_id;
transaction["detail_id"].set_valid(true);
transaction["type"] = 2L;
/* DoTransfer */ transaction["type"].set_valid(true);
out["transaction_id"] = insert_db_record(DBS_VALID, "money_transfer_transaction", "money_transfer_transaction_id_seq", transaction);
if (out["transaction_id"].Long() < 1L) {
throw new runtime_error("Failed to create money_transfer_transaction record");
}
CVars transaction_final;
char xtid[12], uniqueRef[20];
memset(uniqueRef, 0, 20);
// TransferCode - RequestReference - UniqueRef => request prefix for terminal owner + ID
sprintf(uniqueRef, "%s%s000000", setup["interswitch_pfix"].c_str(), out["transaction_id"].c_str());
//sprintf( uniqueRef, "%s%-09lu", setup["interswitch_pfix"].c_str(), out["transaction_id"].Long() );
transaction["transfer_code"] = uniqueRef;
transaction["transfer_code"].set_valid(true);
transaction_final["transfer_code"] = transaction["transfer_code"];
transaction_final["transfer_code"].set_valid(true);
pgsql_exec("UPDATE money_transfer SET transfer_code='%s' WHERE id=%lu", transaction_final["transfer_code"].c_str(), transfer_id);
//sprintf( xtid, "%s", setup["interswitch_tid"].c_str() );
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
//in["SenderEmail"] = sender["email"]; in["SenderEmail"].set_valid(true);
//in["BeneficiaryEmail"] = recipient["email"]; in["BeneficiaryEmail"].set_valid(true);
//*TAKE THE MONEY NOW
/*
CVars pm;
pm["customer_id"] = senderid;
pm["customer_id"].set_valid(true);
pm["transfer_id"] = out["money_transfer_id"];
pm["transfer_id"].set_valid(true);
pm["amount"] = in["InitiatingAmount"];
pm["amount"].set_valid(true);
pm["fee"] = in["Fee"];
pm["fee"].set_valid(true);
pm["mode"] = PAYMENT_MODE;
pm["mode"].set_valid(true);
if (do_transferPayment(pm) == PHP_API_OK) {
// all is good on money side
} else {
throw new runtime_error("Failed to create payment record");
}
*/
// END of take money
CVars trans_info;
trans_info["Fee"] = in["Fee"];
trans_info["InitiatingAmount"] = in["initiatingamount"];
trans_info["InitiatingChannel"] = in["initiatingchannel"];
trans_info["InitiatingCurrencyCode"] = in["initiatingcurrencycode"];
// trans_info["initiatingchannel"] = in["initiatingchannel"];
trans_info["InitiatingEntityCode"] = in["initiatingentitycode"];
trans_info["InitiatingPaymentMethodCode"] = in["initiatingpaymentmethodcode"];
trans_info["TerminatingAccountNumber"] = in["terminatingaccountnumber"]; //in["TerminatingAccountNumber"];
trans_info["TerminatingAccountType"] = in["terminatingaccounttype"]; // in["TerminatingAccountType"];
trans_info["TerminatingAmount"] = in["terminatingamount"];
trans_info["TerminatingCountryCode"] = in["terminatingcountrycode"];
trans_info["TerminatingCurrencyCode"] = in["terminatingcurrencycode"];
trans_info["TerminatingEntityCode"] = in["terminatingentitycode"]; //in["TerminatingEntityCode"];
trans_info["TerminatingPaymentMethodCode"] = in["initiatingpaymentmethodcode"];
trans_info["TransferCode"] = uniqueRef;
trans_info["SenderLastname"] = sender["lastname"];
trans_info["SenderOthernames"] = sender["firstname"];
trans_info["BeneficiaryLastname"] = recipient["lastname"];
trans_info["BeneficiaryOthernames"] = recipient["firstname"];
// trans_info["BeneficiaryOthernames"] = recipient["firstname"];
/*
sendmoney_payment sendmoney_payment_id_key sendmoney_payment_id_seq sendmoney_recipient sendmoney_recipient_id_key sendmoney_recipient_id_seq
wrenchboard=> \d money_transfer;
Table "public.money_transfer"
Column | Type | Modifiers
------------------------------+-----------------------------+-------------------------------------------------------------
id | integer | not null default nextval('money_transfer_id_seq'::regclass)
channel | character varying(10) |
initiatingentitycode | character varying(3) | not null
member_id | integer |
initiatingamount | integer | not null
fee | integer | default 0
initiatingchannel | integer |
initiatingpaymentmethodcode | character varying(2) | not null
initiatingcurrencycode | character varying(3) | default '566'::character varying
recipientid | integer |
terminatingpaymentmethodcode | character varying(2) | not null
terminatingamount | integer | not null
terminatingcurrencycode | character varying(3) | default '566'::character varying
terminatingcountrycode | character varying(2) | default 'NG'::character varying
terminatingentitycode | character varying(5) | not null
added | timestamp without time zone | default now()
terminatingaccountnumber | character varying(50) |
terminatingaccounttype | character varying(2) |
transactionid | character varying(15) | not null
transfer_code | character varying(15) |
status | integer | default 1
completed
*/
char status[SAFESTRING_COMMON_BUFFER_SIZE];
memset(status, 32, SAFESTRING_COMMON_BUFFER_SIZE);
status[SAFESTRING_COMMON_BUFFER_SIZE] = '\0';
char transCode[SAFESTRING_COMMON_BUFFER_SIZE];
memset(transCode, 0, SAFESTRING_COMMON_BUFFER_SIZE);
sprintf(transCode, ""); // ???
string result = interswitch_doTransfer(
setup["interswitch_sep"].c_str(),
xtid,
trans_info,
status);
logfmt(FLOG_MAX, "Return: %s", result.c_str());
logfmt(FLOG_MAX, "Status: %s", status);
out["ResponseCode"] = result;
out["status"] = status;
out["TransferCode"] = uniqueRef; // in["TransferCode"]; Note same as sent to interswitch
if (result == "90000") {
ret = PHP_API_OK;
out["TransactionReferenceCode"] = status;
out["status"] = "Transfer successful";
} else {
ret = PHP_API_BAD_PARAM;
out["TransactionReferenceCode"] = "";
}
transaction_final["responsecode"] = out["ResponseCode"];
transaction_final["responsecode"].set_valid(true);
transaction_final["transactionref"] = status;
/* out["TransactionReferenceCode"];*/ transaction_final["transactionref"].set_valid(true);
update_db_record(DBS_VALID, "money_transfer_transaction", transaction_final, out["transaction_id"].Long());
if (result == "90000") {
} else {
CVars rm;
rm["customer_id"] = senderid;
rm["customer_id"].set_valid(true);
rm["transfer_id"] = out["money_transfer_id"];
rm["transfer_id"].set_valid(true);
rm["TransferCode"] = out["TransferCode"];
rm["TransferCode"].set_valid(true);
rm["requestReference"] = out["TransferCode"];
rm["requestReference"].set_valid(true);
/*REQ_STRING( in, "TransferCode", 3, 30, "(.*)" );
REQ_STRING( in, "requestReference", 3, 30, "(.*)" );*/
int vRet = INTW_querySendMoneyTransaction(rm, out);
rm["mode"] = REFUND_MODE;
rm["mode"].set_valid(true);
do_transferPayment(rm);
}
} catch (runtime_error& ex) {
out["status"] = ex.what();
ret = PHP_API_BAD_PARAM;
} catch (bad_parameter) {
out["status"] = "Invalid input";
ret = PHP_API_BAD_PARAM;
} catch (...) {
out["status"] = "Unhandled exception in INTW_doTransfer";
ret = PHP_API_BAD_PARAM;
}
//MerchantSendMoney(out);
//SendMoneyAlert(out);
logfmt(logINFO, "/long INTW_doTransfer(CVars in, CVars &out)");
return ret;
}
//*****************************************************************************/
long INTW_configure(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_configure(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Configure Interswitch SSL
interswitch_config_ssl(
CfgReadChar("interswitch.keyfile"),
CfgReadChar("interswitch.password"),
CfgReadChar("interswitch.cacert"),
CfgReadLong("interswitch.version"));
out["interswitch_ver"] = CfgReadLong("interswitch.version");
out["interswitch_sep"] = CfgReadChar("interswitch.soap_endpoint");
out["interswitch_tid"] = CfgReadChar("interswitch.terminal_id");
out["interswitch_code"] = CfgReadChar("interswitch.entity_code");
out["interswitch_mkey"] = CfgReadChar("interswitch.master_key");
out["interswitch_pin"] = CfgReadChar("interswitch.pin");
out["interswitch_pfix"] = CfgReadChar("interswitch.prefix");
out["interswitch_keyf"] = CfgReadChar("interswitch.keyfile");
out["interswitch_pass"] = CfgReadChar("interswitch.password");
out["interswitch_cert"] = CfgReadChar("interswitch.cacert");
ret = PHP_API_OK;
} catch (bad_parameter) {
out["status"] = "Bad parameter";
} catch (...) {
out["status"] = "Unhandled exception in INTW_configure";
}
logfmt(logINFO, "/long INTW_configure(CVars in, CVars &out)");
return ret;
}
//*****************************************************************************/
long INTW_getBillersSave(hash_map<const char*, const char*, hash<const char*>, eqstr> saveData) { //long id, char *name, long currencyCode, char *quickTellerSiteUrlName, char *supportEmail) {
logfmt(logINFO, "long INTW_getBillersSave(...)");
long gid = -1L, id = 0L;
CVars x;
hash_map<const char*, const char*, hash<const char*>, eqstr>::iterator pointer;
for (pointer = saveData.begin(); pointer != saveData.end(); ++pointer) {
x[pointer->first] = pointer->second;
x[pointer->first].set_valid(true);
if (strcmp("Id", pointer->first) == 0) {
id = atol(pointer->second);
// Check if the record already exists
const PGresult* res = pgsql_query("SELECT * FROM interswitch_billers WHERE id = %lu", id);
if (id < 1L || (res && pgsql_num_rows(res) > 0)) {
// Incorrect id or alredy exists
logfmt(FLOG_MAX, "Incorrect id or alredy exists: %ld", id);
return -1L;
}
}
}
gid = insert_db_record(DBS_VALID, "interswitch_billers", "interswitch_billers_gid_seq", x);
pgsql_exec("UPDATE global_settings SET value=now() WHERE name='LAST_INTSW_GETBILLER_RUN'");
logfmt(logINFO, "/long INTW_getBillersSave(...)");
return gid;
}
//*****************************************************************************/
long INTW_getBillers(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_getBillers(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
// Prepare call
const int statusSize = 1024;
char status[statusSize];
int billerId = 0;
int categoryId = 0;
int channelId = 0;
char xtid[12];
int channel_code = 3;
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
ret = interswitch_getBillers(
setup["interswitch_sep"].c_str(),
xtid,
billerId,
categoryId,
channelId,
"",
status,
&INTW_getBillersSave);
} catch (...) {
out["status"] = "Unhandled exception in INTW_getBillers";
}
logfmt(logINFO, "/long INTW_getBillers(CVars in, CVars &out)");
return ret;
}
/*
<------>long INTW_getSaveGeneric(const char *table, hash_map<const char*, const char*, hash<const char*>, eqstr> saveData);
<------>long INTW_getBillerPaymentItems(CVars in, CVars &out);
*/
//*****************************************************************************/
long INTW_getSaveGeneric(const char *table, hash_map<const char*, const char*, hash<const char*>, eqstr> saveData) { //long id, char *name, long currencyCode, char *quickTellerSiteUrlName, char *supportEmail) {
logfmt(logINFO, "long INTW_getSaveGeneric(...)");
long gid = -1L, id = 0L;
CVars x;
hash_map<const char*, const char*, hash<const char*>, eqstr>::iterator pointer;
for (pointer = saveData.begin(); pointer != saveData.end(); ++pointer) {
x[pointer->first] = pointer->second;
x[pointer->first].set_valid(true);
}
const int n = strlen(table) + 20;
char table_seq[n];
snprintf(table_seq, n, "%s_gid_seq", table);
gid = insert_db_record(DBS_VALID, table, table_seq, x);
logfmt(logINFO, "/long INTW_getSaveGeneric(...)");
return gid;
}
//*****************************************************************************/
long INTW_getBillerPaymentItems(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_getBillerPaymentItems(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
// Prepare call
const int statusSize = 1024;
char status[statusSize];
int billerId = REQ_LONG(in, "id", 1, -1);
;
char xtid[12];
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
ret = interswitch_getBillerPaymentItems(
setup["interswitch_sep"].c_str(),
xtid,
billerId,
status,
&INTW_getSaveGeneric);
} catch (bad_parameter) {
out["status"] = "Incorrect Biller ID";
} catch (...) {
out["status"] = "Unhandled exception in INTW_getBillerPaymentItems";
}
logfmt(logINFO, "/long INTW_getBillerPaymentItems(CVars in, CVars &out)");
return ret;
}
//*****************************************************************************/
long INTW_sendBillPaymentAdvice(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_sendBillPaymentAdvice(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
int customerId = REQ_LONG(in, "customerid", 1, -1);
int paymentItemId = REQ_LONG(in, "paymentitemid", 1, -1);
int amount = REQ_LONG(in, "amount", 0, -1);
REQ_STRING(in, "customermobile", 5, 15, "(.*)");
OPTIONAL(in, "customeremail") REQ_STRING(in, "customeremail", 1, 100, "(.*)");
OPTIONAL(in, "order_id") REQ_STRING(in, "order_id", 1, 25, "(.*)");
char CustomerMobile[15];
char CustomerEmail[100];
sprintf(CustomerEmail, "%s", in["customeremail"].c_str());
sprintf(CustomerMobile, "%s", in["customermobile"].c_str());
//topalert = "sales@payquic.com";
out["topalert"] = CfgReadChar("transnotif.topalert");
sprintf(CustomerEmail, "%s", out["topalert"].c_str());
CVars customer; // Load customer
ret = load_db_record(customer, "SELECT email,firstname,lastname FROM customer WHERE status=1 AND id = %lu", customerId);
if (ret < 1L) {
throw new bad_parameter(out, "customerid");
}
CVars paymentitem; // Load payment item
ret = load_db_record(paymentitem, "SELECT id,billerid,billername,name,amount,paymentcode FROM interswitch_biller_payment_items WHERE gid = %lu", paymentItemId);
if (ret < 1L) {
out["advice"] = "PaymentID not found or not valid !!!";
throw new bad_parameter(out, "paymentitemid");
}
// Check amount
if (amount < 1L) {
amount = paymentitem["amount"].Long();
}
/**/
// Create record
CVars advice;
advice["customerid"] = customerId;
advice["customerid"].set_valid(true);
advice["billerid"] = paymentitem["billerid"];
advice["billerid"].set_valid(true);
advice["billerpaymentitemgid"] = paymentItemId;
advice["billerpaymentitemgid"].set_valid(true);
advice["amount"] = amount;
advice["amount"].set_valid(true);
advice["paymentcode"] = paymentitem["paymentcode"];
advice["paymentcode"].set_valid(true);
advice["order_id"] = in["order_id"];
advice["order_id"].set_valid(true);
advice["customeremail"] = in["customeremail"];
advice["customeremail"].set_valid(true);
advice["customermobile"] = in["customermobile"];
advice["customermobile"].set_valid(true);
out["bill_payment_advice_id"] = insert_db_record(DBS_VALID, "interswitch_bill_payment_advice", "interswitch_bill_payment_advice_id_seq", advice);
if (out["bill_payment_advice_id"].Long() < 1L) {
throw new runtime_error("Failed to create interswitch bill payment advice record");
}
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
CVars transaction;
transaction["detail_id"] = out["bill_payment_advice_id"];
transaction["detail_id"].set_valid(true);
transaction["type"] = 1L;
/* SendBillPaymentAdvice */ transaction["type"].set_valid(true);
out["transaction_id"] = insert_db_record(DBS_VALID, "interswitch_transaction", "interswitch_transaction_id_seq", transaction);
if (out["transaction_id"].Long() < 1L) {
throw new runtime_error("Failed to create interswitch transaction record");
}
char uniqueRef[20];
memset(uniqueRef, 0, 20);
// TransferCode - RequestReference - UniqueRef => request prefix for terminal owner + ID
sprintf(uniqueRef, "%s%s000000", setup["interswitch_pfix"].c_str(), out["transaction_id"].c_str());
//sprintf( uniqueRef, "%s%09s", setup["interswitch_pfix"].c_str(), out["transaction_id"].c_str() );
transaction["transfer_code"] = uniqueRef;
transaction["transfer_code"].set_valid(true);
CVars cxc;
cxc["transfer_code"] = transaction["transfer_code"];
cxc["transfer_code"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_transaction", cxc, out["transaction_id"].Long());
logfmt(logINFO, "Here -> 1");
logfmt(logINFO, "SENDING TRANSACTION - setup[interswitch_tid].c_str() ->%s", setup["interswitch_tid"].c_str());
// Prepare call
const int statusSize = 1024;
char status[statusSize];
char transactionRef[statusSize];
memset(status, 0, statusSize); // Clear?
memset(transactionRef, 0, statusSize); // Clear?
char xtid[12];
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
logfmt(logINFO, "SENDING TRANSACTION->%s", xtid);
string result = interswitch_SendBillPaymentAdvice(
setup["interswitch_sep"].c_str(),
xtid,
amount,
paymentitem["paymentcode"].c_str(),
customerId,
uniqueRef,
status,
transactionRef,
CustomerMobile,
CustomerEmail);
CVars advicestatus;
out["status"] = status;
out["ResponseCode"] = result;
out["TransactionRef"] = transactionRef;
// Update status
try {
transaction["responsecode"] = result;
transaction["responsecode"].set_valid(true);
transaction["transactionref"] = transactionRef;
transaction["transactionref"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_transaction", transaction, out["transaction_id"].Long());
} catch (...) {
out["status"] = "I see no good response from interswitch";
}
// Success?
if (result == "90000") {
advicestatus["status"] = "5";
advicestatus["status"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_bill_payment_advice", advicestatus, out["bill_payment_advice_id"].Long());
logfmt(logINFO, "Send bill payment advice successful");
ret = PHP_API_OK;
} else {
CVars fr1;
fr1["status"] = "7";
fr1["status"].set_valid(true);
advicestatus["status"] = "7";
advicestatus["status"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_bill_payment_advice", fr1, out["bill_payment_advice_id"].Long());
//ret = -1;
throw new runtime_error("Failed to send bill payment advice");
}
} catch (runtime_error& ex) {
out["status"] = ex.what();
ret = PHP_API_BAD_PARAM;
} catch (bad_parameter) {
out["status"] = "Incorrect parameter";
ret = PHP_API_BAD_PARAM;
} catch (...) {
out["status"] = "Unhandled exception in INTW_sendBillPaymentAdvice";
}
logfmt(logINFO, "/long INTW_sendBillPaymentAdvice(CVars in, CVars &out)");
return ret;
}
//*****************************************************************************/
long INTW_getBillerCategories(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_getBillerCategories(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
// Prepare call
const int statusSize = 1024;
char status[statusSize];
ret = interswitch_getBillerCategories(
setup["interswitch_sep"].c_str(),
status,
NULL);
} catch (...) {
out["status"] = "Unhandled exception in INTW_getBillerCategories";
}
logfmt(logINFO, "/long INTW_getBillerCategories(CVars in, CVars &out)");
return ret;
}
//------------------------------------------------------------------------------
long do_transferPayment(CVars in) {
long ret = PHP_API_BAD_PARAM;
CVars out;
long customer_id = REQ_LONG(in, "customer_id", 1, -1);
long transfer_id = REQ_LONG(in, "transfer_id", 1, -1);
long payMode = REQ_LONG(in, "mode", 1, -1);
long payment_id = 0;
long amount = 0;
long fee = 0;
long total = 0;
/*
CREATE TABLE sendmoney_payment
(
id serial NOT NULL,
transfer_mode integer NOT NULL,
customer_id INT REFERENCES customer(id),
transfer_id INT REFERENCES interswitch_money_transfer(id),
amount integer DEFAULT 0,
fee integer DEFAULT 0,
total integer DEFAULT 0,
current_balance integer DEFAULT 0,
new_balance integer DEFAULT 0,
status integer DEFAULT 1,
added TIMESTAMP DEFAULT NOW()
);
*/
ret = load_db_record(out, "SELECT balance FROM members WHERE id = %lu AND status = 1", customer_id);
if (ret < 1L) {
throw new bad_parameter(out, "senderid");
}
if (payMode == PAYMENT_MODE) {
amount = REQ_LONG(in, "amount", 1, -1);
fee = REQ_LONG(in, "fee", 1, -1);
total = amount + fee; // make sure you are cent here
if (out["balance"].Long() >= total) // do you have this money
{
CVars x;
x["transfer_mode"] = PAYMENT_MODE;
x["transfer_mode"].set_valid(true);
x["member_id"] = customer_id;
x["member_id"].set_valid(true);
x["transfer_id"] = transfer_id;
x["transfer_id"].set_valid(true);
x["amount"] = amount;
x["amount"].set_valid(true);
x["fee"] = fee;
x["fee"].set_valid(true);
x["total"] = total;
x["total"].set_valid(true);
x["current_balance"] = out["balance"];
x["current_balance"].set_valid(true);
payment_id = 0;
out["payment_id"] = insert_db_record(DBS_VALID, "sendmoney_payment", "sendmoney_payment_id_seq", x);
char confirmation[20] = "";
Confirmation(payment_id, confirmation, sizeof (confirmation));
ret = PHP_API_BAD_PARAM; // it is still a failure if we get here and did not take the money out of the balance
CVars y;
y["member_id"] = x["member_id"];
y["member_id"].set_valid(true);
y["sendmoney_id"] = x["transfer_id"];
y["sendmoney_id"].set_valid(true);
y["code"] = "SMPAY";
y["code"].set_valid(true);
y["dir"] = DIR_TARGET;
y["dir"].set_valid(true);
//y["payment_id"] = out["payment_id"]; y["payment_id"].set_valid( true );
ret = WrenchSendMoneyPayment(y, out);
if (ret == PHP_CREATED_OK) {
load_db_record(out, "SELECT balance AS new_balance FROM members WHERE id = %lu", customer_id);
pgsql_exec("UPDATE sendmoney_payment SET new_balance=%lu WHERE id=%lu", out["new_balance"].Long(), out["payment_id"].Long());
ret = PHP_API_OK;
}
}
}
if (payMode == REFUND_MODE) {
if (load_db_record(out, "SELECT * FROM sendmoney_payment WHERE transfer_id = %lu AND member_id = %lu", transfer_id, customer_id)) {
logfmt(logINFO, "*****WE RE DO VERIFICATION and NO DUPLICATES)");
logfmt(logINFO, "**)");
logfmt(logINFO, "**)");
logfmt(logINFO, "**)");
logfmt(logINFO, "**)");
logfmt(logINFO, "**)");
logfmt(logINFO, "**)");
logfmt(logINFO, "**)");
logfmt(logINFO, "**)");
CVars out;
/*REQ_STRING( in, "TransferCode", 3, 30, "(.*)" );
REQ_STRING( in, "requestReference", 3, 30, "(.*)" );*/
int vRet = INTW_querySendMoneyTransaction(in, out);
ret = PHP_API_OK;
}
}
//PAYMENT_MODE
//REFUND_MODE
return ret;
}
//*****************************************************************************/
long INTW_doServiceTransferComplete(CVars in, CVars &out);
long INTW_doServiceTransfer(CVars in, CVars &out) {
//plog->SetFileName( PREFIX"/logs/send_money.log" );
logfmt(logINFO, "long INTW_doTransfer(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
out = in;
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
in["action"].set_valid(false);
REQ_STRING(in, "InitiatingEntityCode", 3, 3, "(.*)");
REQ_LONG(in, "InitiatingAmount", 1, -1);
REQ_LONG(in, "Fee", 1, -1);
REQ_LONG(in, "InitiatingChannel", 1, -1);
REQ_STRING(in, "InitiatingPaymentMethodCode", 2, 2, "(.*)");
REQ_STRING(in, "InitiatingCurrencyCode", 3, 3, "(.*)");
REQ_STRING(in, "TerminatingPaymentMethodCode", 2, 2, "(.*)");
REQ_LONG(in, "TerminatingAmount", 1, -1);
REQ_STRING(in, "TerminatingCurrencyCode", 3, 3, "(.*)");
REQ_STRING(in, "TerminatingCountryCode", 2, 2, "(.*)");
//REQ_STRING( in, "TerminatingEntityCode", 1, 5, "(.*)" );
//REQ_STRING( in, "TerminatingAccountNumber", 1, 50, "(.*)" );
//REQ_STRING( in, "TerminatingAccountType", 2, 2, "(.*)" );
long senderid = REQ_LONG(in, "senderid", 1, -1);
long recipientid = REQ_LONG(in, "recipientid", 1, -1);
in["InitiatingEntityCode"] = "MBA";
in["InitiatingEntityCode"].set_valid(true);
CVars sender; // Load sender
ret = load_db_record(sender, "SELECT firstname,lastname,balance FROM members WHERE id = %lu AND status = 1", senderid);
if (ret < 1L) {
throw new bad_parameter(out, "senderid");
}
long LongTotalCost = in["Fee"].Long() + in["TerminatingAmount"].Long() + 0;
if (sender["balance"].Long() < LongTotalCost) {
throw new bad_parameter(out, "insufficient balance for transaction");
}
CVars recipient; // Load recipient
/*recipient["firstname"] = in["firstname"]; recipient["firstname"].set_valid( true );
recipient["lastname"] = in["lastname"]; recipient["lastname"].set_valid( true );
recipient["account_no"] = in["account_no"]; recipient["account_no"].set_valid( true );
recipient["bank_code"] = in["bank_code"]; recipient["bank_code"].set_valid( true );
recipient["account_type"] = in["account_type"]; recipient["account_type"].set_valid( true );*/
ret = load_db_record(recipient, "SELECT firstname,lastname,account_no,bank_code,account_type FROM sendmoney_recipient WHERE id = %lu AND member_id = %lu AND status = 1", recipientid, senderid);
if (ret < 1L) {
throw new bad_parameter(out, "recipientid");
}
in["TerminatingEntityCode"] = recipient["bank_code"];
in["TerminatingEntityCode"].set_valid(true);
in["TerminatingAccountNumber"] = recipient["account_no"];
in["TerminatingAccountNumber"].set_valid(true);
in["transactionID"] = in["transaction_id"];
in["transactionID"].set_valid(true);
CVars inx;
inx["Fee"] = in["Fee"];
inx["Fee"].set_valid(true);
inx["InitiatingAmount"] = in["InitiatingAmount"];
inx["InitiatingAmount"].set_valid(true);
inx["InitiatingChannel"] = in["InitiatingChannel"];
inx["InitiatingChannel"].set_valid(true);
inx["InitiatingCurrencyCode"] = in["InitiatingCurrencyCode"];
inx["InitiatingCurrencyCode"].set_valid(true);
inx["InitiatingEntityCode"] = in["InitiatingEntityCode"];
inx["InitiatingEntityCode"].set_valid(true);
inx["InitiatingPaymentMethodCode"] = in["InitiatingPaymentMethodCode"];
inx["InitiatingPaymentMethodCode"].set_valid(true);
inx["TerminatingAccountNumber"] = in["TerminatingAccountNumber"];
inx["TerminatingAccountNumber"].set_valid(true);
inx["TerminatingAmount"] = in["TerminatingAmount"];
inx["TerminatingAmount"].set_valid(true);
inx["TerminatingCountryCode"] = in["TerminatingCountryCode"];
inx["TerminatingCountryCode"].set_valid(true);
inx["TerminatingCurrencyCode"] = in["TerminatingCurrencyCode"];
inx["TerminatingCurrencyCode"].set_valid(true);
inx["TerminatingEntityCode"] = in["TerminatingEntityCode"];
inx["TerminatingEntityCode"].set_valid(true);
inx["TerminatingPaymentMethodCode"] = in["TerminatingPaymentMethodCode"];
inx["TerminatingPaymentMethodCode"].set_valid(true);
inx["recipientid"] = in["recipientid"];
inx["recipientid"].set_valid(true);
inx["member_id"] = in["senderid"];
inx["member_id"].set_valid(true);
inx["transactionID"] = in["transactionID"];
inx["transactionID"].set_valid(true);
inx["transfer_code"] = "";
inx["transfer_code"].set_valid(true);
out["money_transfer_id"] = insert_db_record(DBS_VALID, "money_transfer", " money_transfer_id_seq", inx);
if (out["money_transfer_id"].Long() < 1L) {
throw new runtime_error("Failed to create money transfer record");
}
const PGresult *res = pgsql_query("SELECT * FROM money_transfer WHERE id=%lu AND member_id = %lu", out["money_transfer_id"].Long(), in["member_id"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
} else {
throw new runtime_error("Failed to create money_transfer record");
}
CVars transaction;
transaction["detail_id"] = out["money_transfer_id"];
transaction["detail_id"].set_valid(true);
transaction["type"] = 2L;
/* DoTransfer */ transaction["type"].set_valid(true);
out["transaction_id"] = insert_db_record(DBS_VALID, "money_transfer_transaction", "money_transfer_transaction_id_seq", transaction);
if (out["transaction_id"].Long() < 1L) {
throw new runtime_error("Failed to create money_transfer_transaction record");
}
CVars transaction_final;
char xtid[12], uniqueRef[20];
memset(uniqueRef, 0, 20);
// TransferCode - RequestReference - UniqueRef => request prefix for terminal owner + ID
sprintf(uniqueRef, "%s%s000000", setup["interswitch_pfix"].c_str(), out["transaction_id"].c_str());
//sprintf( uniqueRef, "%s%-09lu", setup["interswitch_pfix"].c_str(), out["transaction_id"].Long() );
transaction["transfer_code"] = uniqueRef;
transaction["transfer_code"].set_valid(true);
transaction_final["transfer_code"] = transaction["transfer_code"];
transaction_final["transfer_code"].set_valid(true);
pgsql_exec("UPDATE money_transfer SET transfer_code='%s' WHERE id=%lu", transaction_final["transfer_code"].c_str(), out["money_transfer_id"].Long());
//sprintf( xtid, "%s", setup["interswitch_tid"].c_str() );
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
//in["SenderEmail"] = sender["email"]; in["SenderEmail"].set_valid(true);
//in["BeneficiaryEmail"] = recipient["email"]; in["BeneficiaryEmail"].set_valid(true);
//*TAKE THE MONEY NOW
CVars pm;
pm["customer_id"] = senderid;
pm["customer_id"].set_valid(true);
pm["transfer_id"] = out["money_transfer_id"];
pm["transfer_id"].set_valid(true);
pm["amount"] = in["InitiatingAmount"];
pm["amount"].set_valid(true);
pm["fee"] = in["Fee"];
pm["fee"].set_valid(true);
pm["mode"] = PAYMENT_MODE;
pm["mode"].set_valid(true);
/*
#define SM_PENDING 1
#define SM_CANCEL 3
#define SM_FAILED 4
#define SM_COMPLETED 5
*/
if (do_transferPayment(pm) == PHP_API_OK) {
out["sendmoney_status"] = SM_PENDING;
in["sendmoney_id"] = out["money_transfer_id"];
ret = PHP_API_OK;
sendmoney_email(SM_PENDING, in, out);
// all is good on money side
logfmt(logINFO, "*** ALL Good ------ ****** ");
} else {
out["sendmoney_status"] = SM_FAILED;
throw new runtime_error("Failed to create payment record");
}
load_db_record(out, "SELECT m.*,mp.confirmation,r.firstname||' '||r.lastname AS Recitient,r.account_no,b.name AS bank_name FROM money_transfer m LEFT JOIN members_payments mp ON mp.what_sendmoney = m.id LEFT JOIN sendmoney_recipient r ON r.id = m.recipientid LEFT JOIN bank_entity_codes b ON b.code = r.bank_code WHERE m.id=%lu", out["money_transfer_id"].Long());
} catch (runtime_error& ex) {
out["status"] = ex.what();
ret = PHP_API_BAD_PARAM;
} catch (bad_parameter) {
out["status"] = "Invalid input";
ret = PHP_API_BAD_PARAM;
} catch (...) {
out["status"] = "Unhandled exception in INTW_doTransfer";
ret = PHP_API_BAD_PARAM;
}
logfmt(logINFO, "/long INTW_doTransfer(CVars in, CVars &out)");
return ret;
}
long INTW_doServiceTransferComplete(CVars in, CVars &out) {
//plog->SetFileName( PREFIX"/logs/send_money.log" );
logfmt(logINFO, "long INTW_doTransfer(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
in["action"].set_valid(false);
REQ_STRING(in, "InitiatingEntityCode", 3, 3, "(.*)");
REQ_LONG(in, "InitiatingAmount", 1, -1);
REQ_LONG(in, "Fee", 1, -1);
REQ_LONG(in, "InitiatingChannel", 1, -1);
REQ_STRING(in, "InitiatingPaymentMethodCode", 2, 2, "(.*)");
REQ_STRING(in, "InitiatingCurrencyCode", 3, 3, "(.*)");
REQ_STRING(in, "TerminatingPaymentMethodCode", 2, 2, "(.*)");
REQ_LONG(in, "TerminatingAmount", 1, -1);
REQ_STRING(in, "TerminatingCurrencyCode", 3, 3, "(.*)");
REQ_STRING(in, "TerminatingCountryCode", 2, 2, "(.*)");
//REQ_STRING( in, "TerminatingEntityCode", 1, 5, "(.*)" );
//REQ_STRING( in, "TerminatingAccountNumber", 1, 50, "(.*)" );
//REQ_STRING( in, "TerminatingAccountType", 2, 2, "(.*)" );
long senderid = REQ_LONG(in, "senderid", 1, -1);
long recipientid = REQ_LONG(in, "recipientid", 1, -1);
in["InitiatingEntityCode"] = "MBA";
in["InitiatingEntityCode"].set_valid(true);
CVars sender; // Load sender
ret = load_db_record(sender, "SELECT firstname,lastname,balance FROM members WHERE id = %lu AND status = 1", senderid);
if (ret < 1L) {
throw new bad_parameter(out, "senderid");
}
long LongTotalCost = in["Fee"].Long() + in["TerminatingAmount"].Long() + 0;
if (sender["balance"].Long() < LongTotalCost) {
throw new bad_parameter(out, "insufficient balance for transaction");
}
CVars recipient; // Load recipient
/*recipient["firstname"] = in["firstname"]; recipient["firstname"].set_valid( true );
recipient["lastname"] = in["lastname"]; recipient["lastname"].set_valid( true );
recipient["account_no"] = in["account_no"]; recipient["account_no"].set_valid( true );
recipient["bank_code"] = in["bank_code"]; recipient["bank_code"].set_valid( true );
recipient["account_type"] = in["account_type"]; recipient["account_type"].set_valid( true );*/
ret = load_db_record(recipient, "SELECT firstname,lastname,account_no,bank_code,account_type FROM sendmoney_recipient WHERE id = %lu AND member_id = %lu AND status = 1", recipientid, senderid);
if (ret < 1L) {
throw new bad_parameter(out, "recipientid");
}
in["TerminatingEntityCode"] = recipient["bank_code"];
in["TerminatingEntityCode"].set_valid(true);
in["TerminatingAccountNumber"] = recipient["account_no"];
in["TerminatingAccountNumber"].set_valid(true);
in["transactionID"] = in["transaction_id"];
in["transactionID"].set_valid(true);
CVars inx;
inx["Fee"] = in["Fee"];
inx["Fee"].set_valid(true);
inx["InitiatingAmount"] = in["InitiatingAmount"];
inx["InitiatingAmount"].set_valid(true);
inx["InitiatingChannel"] = in["InitiatingChannel"];
inx["InitiatingChannel"].set_valid(true);
inx["InitiatingCurrencyCode"] = in["InitiatingCurrencyCode"];
inx["InitiatingCurrencyCode"].set_valid(true);
inx["InitiatingEntityCode"] = in["InitiatingEntityCode"];
inx["InitiatingEntityCode"].set_valid(true);
inx["InitiatingPaymentMethodCode"] = in["InitiatingPaymentMethodCode"];
inx["InitiatingPaymentMethodCode"].set_valid(true);
inx["TerminatingAccountNumber"] = in["TerminatingAccountNumber"];
inx["TerminatingAccountNumber"].set_valid(true);
inx["TerminatingAmount"] = in["TerminatingAmount"];
inx["TerminatingAmount"].set_valid(true);
inx["TerminatingCountryCode"] = in["TerminatingCountryCode"];
inx["TerminatingCountryCode"].set_valid(true);
inx["TerminatingCurrencyCode"] = in["TerminatingCurrencyCode"];
inx["TerminatingCurrencyCode"].set_valid(true);
inx["TerminatingEntityCode"] = in["TerminatingEntityCode"];
inx["TerminatingEntityCode"].set_valid(true);
inx["TerminatingPaymentMethodCode"] = in["TerminatingPaymentMethodCode"];
inx["TerminatingPaymentMethodCode"].set_valid(true);
inx["recipientid"] = in["recipientid"];
inx["recipientid"].set_valid(true);
inx["member_id"] = in["senderid"];
inx["member_id"].set_valid(true);
inx["transactionID"] = in["transactionID"];
inx["transactionID"].set_valid(true);
inx["transfer_code"] = "";
inx["transfer_code"].set_valid(true);
out["money_transfer_id"] = insert_db_record(DBS_VALID, "money_transfer", " money_transfer_id_seq", inx);
if (out["money_transfer_id"].Long() < 1L) {
throw new runtime_error("Failed to create interswitch bill money transfer record");
}
CVars transaction;
transaction["detail_id"] = out["money_transfer_id"];
transaction["detail_id"].set_valid(true);
transaction["type"] = 2L;
/* DoTransfer */ transaction["type"].set_valid(true);
out["transaction_id"] = insert_db_record(DBS_VALID, "money_transfer_transaction", "money_transfer_transaction_id_seq", transaction);
if (out["transaction_id"].Long() < 1L) {
throw new runtime_error("Failed to create money_transfer_transaction record");
}
CVars transaction_final;
char xtid[12], uniqueRef[20];
memset(uniqueRef, 0, 20);
// TransferCode - RequestReference - UniqueRef => request prefix for terminal owner + ID
sprintf(uniqueRef, "%s%s000000", setup["interswitch_pfix"].c_str(), out["transaction_id"].c_str());
//sprintf( uniqueRef, "%s%-09lu", setup["interswitch_pfix"].c_str(), out["transaction_id"].Long() );
transaction["transfer_code"] = uniqueRef;
transaction["transfer_code"].set_valid(true);
transaction_final["transfer_code"] = transaction["transfer_code"];
transaction_final["transfer_code"].set_valid(true);
pgsql_exec("UPDATE money_transfer SET transfer_code='%s' WHERE id=%lu", transaction_final["transfer_code"].c_str(), out["money_transfer_id"].Long());
//sprintf( xtid, "%s", setup["interswitch_tid"].c_str() );
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
//in["SenderEmail"] = sender["email"]; in["SenderEmail"].set_valid(true);
//in["BeneficiaryEmail"] = recipient["email"]; in["BeneficiaryEmail"].set_valid(true);
//*TAKE THE MONEY NOW
CVars pm;
pm["customer_id"] = senderid;
pm["customer_id"].set_valid(true);
pm["transfer_id"] = out["money_transfer_id"];
pm["transfer_id"].set_valid(true);
pm["amount"] = in["InitiatingAmount"];
pm["amount"].set_valid(true);
pm["fee"] = in["Fee"];
pm["fee"].set_valid(true);
pm["mode"] = PAYMENT_MODE;
pm["mode"].set_valid(true);
if (do_transferPayment(pm) == PHP_API_OK) {
// all is good on money side
} else {
throw new runtime_error("Failed to create payment record");
}
// END of take money
CVars trans_info;
trans_info["Fee"] = in["Fee"];
trans_info["InitiatingAmount"] = in["InitiatingAmount"];
trans_info["InitiatingChannel"] = in["InitiatingChannel"];
trans_info["InitiatingCurrencyCode"] = in["InitiatingCurrencyCode"];
trans_info["InitiatingEntityCode"] = in["InitiatingEntityCode"];
trans_info["InitiatingPaymentMethodCode"] = in["InitiatingPaymentMethodCode"];
trans_info["TerminatingAccountNumber"] = recipient["account_no"]; //in["TerminatingAccountNumber"];
trans_info["TerminatingAccountType"] = recipient["account_type"]; // in["TerminatingAccountType"];
trans_info["TerminatingAmount"] = in["TerminatingAmount"];
trans_info["TerminatingCountryCode"] = in["TerminatingCountryCode"];
trans_info["TerminatingCurrencyCode"] = in["TerminatingCurrencyCode"];
trans_info["TerminatingEntityCode"] = recipient["bank_code"]; //in["TerminatingEntityCode"];
trans_info["TerminatingPaymentMethodCode"] = in["TerminatingPaymentMethodCode"];
trans_info["TransferCode"] = uniqueRef;
trans_info["SenderLastname"] = sender["lastname"];
trans_info["SenderOthernames"] = sender["firstname"];
trans_info["BeneficiaryLastname"] = recipient["lastname"];
trans_info["BeneficiaryOthernames"] = recipient["firstname"];
char status[SAFESTRING_COMMON_BUFFER_SIZE];
memset(status, 32, SAFESTRING_COMMON_BUFFER_SIZE);
status[SAFESTRING_COMMON_BUFFER_SIZE] = '\0';
char transCode[SAFESTRING_COMMON_BUFFER_SIZE];
memset(transCode, 0, SAFESTRING_COMMON_BUFFER_SIZE);
sprintf(transCode, ""); // ???
string result = interswitch_doTransfer(
setup["interswitch_sep"].c_str(),
xtid,
trans_info,
status);
logfmt(FLOG_MAX, "Return: %s", result.c_str());
logfmt(FLOG_MAX, "Status: %s", status);
out["ResponseCode"] = result;
out["status"] = status;
out["TransferCode"] = uniqueRef; // in["TransferCode"]; Note same as sent to interswitch
if (result == "90000") {
ret = PHP_API_OK;
out["TransactionReferenceCode"] = status;
out["status"] = "Transfer successful";
} else {
ret = PHP_API_BAD_PARAM;
out["TransactionReferenceCode"] = "";
}
transaction_final["responsecode"] = out["ResponseCode"];
transaction_final["responsecode"].set_valid(true);
transaction_final["transactionref"] = status;
/* out["TransactionReferenceCode"];*/ transaction_final["transactionref"].set_valid(true);
update_db_record(DBS_VALID, "money_transfer_transaction", transaction_final, out["transaction_id"].Long());
if (result == "90000") {
} else {
CVars rm;
rm["customer_id"] = senderid;
rm["customer_id"].set_valid(true);
rm["transfer_id"] = out["money_transfer_id"];
rm["transfer_id"].set_valid(true);
rm["TransferCode"] = out["TransferCode"];
rm["TransferCode"].set_valid(true);
rm["requestReference"] = out["TransferCode"];
rm["requestReference"].set_valid(true);
/*REQ_STRING( in, "TransferCode", 3, 30, "(.*)" );
REQ_STRING( in, "requestReference", 3, 30, "(.*)" );*/
int vRet = INTW_querySendMoneyTransaction(rm, out);
rm["mode"] = REFUND_MODE;
rm["mode"].set_valid(true);
do_transferPayment(rm);
}
} catch (runtime_error& ex) {
out["status"] = ex.what();
ret = PHP_API_BAD_PARAM;
} catch (bad_parameter) {
out["status"] = "Invalid input";
ret = PHP_API_BAD_PARAM;
} catch (...) {
out["status"] = "Unhandled exception in INTW_doTransfer";
ret = PHP_API_BAD_PARAM;
}
//MerchantSendMoney(out);
//SendMoneyAlert(out);
logfmt(logINFO, "/long INTW_doTransfer(CVars in, CVars &out)");
return ret;
}
//*****************************************************************************/
#define BUFSIZE 1024
long INTW_querySendMoneyTransaction(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_querySendMoneyTransaction(CVars in, CVars &out)");
REQ_STRING(in, "TransferCode", 3, 30, "(.*)");
REQ_STRING(in, "requestReference", 3, 30, "(.*)");
CVars setup;
INTW_configure(in, setup);
/*
out["interswitch_ver"] = CfgReadLong("interswitch.version");
setup["interswitch_sep"] = CfgReadChar("interswitch.soap_endpoint");
setup["interswitch_tid"] = CfgReadChar("interswitch.terminal_id");
out["interswitch_code"] = CfgReadChar("interswitch.entity_code");
out["interswitch_mkey"] = CfgReadChar("interswitch.master_key");
out["interswitch_pin"] = CfgReadChar("interswitch.pin");
out["interswitch_pfix"] = CfgReadChar("interswitch.prefix");
out["interswitch_keyf"] = CfgReadChar("interswitch.keyfile");
out["interswitch_pass"] = CfgReadChar("interswitch.password");
out["interswitch_cert"] = CfgReadChar("interswitch.cacert");
*/
char* status = (char *) malloc(BUFSIZE);
memset(status, 32, BUFSIZE);
status[BUFSIZE] = '\0';
char *transCode = (char *) malloc(BUFSIZE);
memset(transCode, 0, BUFSIZE);
sprintf(transCode, in["TransferCode"].c_str()); // ???
logfmt(FLOG_MAX, "==========================================================");
string result = interswitch_queryTransaction(setup["interswitch_sep"].c_str(), setup["interswitch_tid"].c_str(), (const char *) transCode, (const char *) in["requestReference"].c_str(), status, transCode);
out["status"] = status;
out["result"] = result;
out["transCode"] = transCode;
logfmt(FLOG_MAX, "Return: %s", result.c_str());
logfmt(FLOG_MAX, "Status: %s", status);
logfmt(FLOG_MAX, "TransC: %s", transCode);
logfmt(FLOG_MAX, "==========================================================");
free(transCode);
free(status);
logfmt(logINFO, "\out long INTW_querySendMoneyTransaction(CVars in, CVars &out)");
return 0;
}
//*****************************************************************************/
long INTW_doTransfer(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_doTransfer(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
in["action"].set_valid(false);
REQ_STRING(in, "InitiatingEntityCode", 3, 3, "(.*)");
REQ_LONG(in, "InitiatingAmount", 1, -1);
REQ_LONG(in, "Fee", 1, -1);
REQ_LONG(in, "InitiatingChannel", 1, -1);
REQ_STRING(in, "InitiatingPaymentMethodCode", 2, 2, "(.*)");
REQ_STRING(in, "InitiatingCurrencyCode", 3, 3, "(.*)");
REQ_STRING(in, "TerminatingPaymentMethodCode", 2, 2, "(.*)");
REQ_LONG(in, "TerminatingAmount", 1, -1);
REQ_STRING(in, "TerminatingCurrencyCode", 3, 3, "(.*)");
REQ_STRING(in, "TerminatingCountryCode", 2, 2, "(.*)");
//REQ_STRING( in, "TerminatingEntityCode", 1, 5, "(.*)" );
//REQ_STRING( in, "TerminatingAccountNumber", 1, 50, "(.*)" );
//REQ_STRING( in, "TerminatingAccountType", 2, 2, "(.*)" );
long senderid = REQ_LONG(in, "senderid", 1, -1);
long recipientid = REQ_LONG(in, "recipientid", 1, -1);
in["InitiatingEntityCode"] = "MBA";
in["InitiatingEntityCode"].set_valid(true);
CVars recipient; // Load recipient
//ret = load_db_record( recipient, "SELECT firstname,lastname FROM customer WHERE id = %lu AND status = 1", recipientid);
ret = load_db_record(recipient, "SELECT firstname,lastname,account_no,bank_code,account_type FROM sendmoney_recipient WHERE id = %lu ", recipientid);
if (ret < 1L) {
throw new bad_parameter(out, "recipientid");
}
in["TerminatingEntityCode"] = recipient["bank_code"];
in["TerminatingEntityCode"].set_valid(true);
in["TerminatingAccountNumber"] = recipient["account_no"];
in["TerminatingAccountNumber"].set_valid(true);
out["money_transfer_id"] = insert_db_record(DBS_VALID, "interswitch_money_transfer", "interswitch_money_transfer_id_seq", in);
if (out["money_transfer_id"].Long() < 1L) {
throw new runtime_error("Failed to create interswitch bill money transfer record");
}
CVars transaction;
transaction["detail_id"] = out["money_transfer_id"];
transaction["detail_id"].set_valid(true);
transaction["type"] = 2L;
/* DoTransfer */ transaction["type"].set_valid(true);
out["transaction_id"] = insert_db_record(DBS_VALID, "interswitch_transaction", "interswitch_transaction_id_seq", transaction);
if (out["transaction_id"].Long() < 1L) {
throw new runtime_error("Failed to create interswitch transaction record");
}
CVars transaction_final;
char xtid[12], uniqueRef[20];
memset(uniqueRef, 0, 20);
// TransferCode - RequestReference - UniqueRef => request prefix for terminal owner + ID
sprintf(uniqueRef, "%s%s000000", setup["interswitch_pfix"].c_str(), out["transaction_id"].c_str());
transaction["transfer_code"] = uniqueRef;
transaction["transfer_code"].set_valid(true);
transaction_final["transfer_code"] = transaction["transfer_code"];
transaction_final["transfer_code"].set_valid(true);
//sprintf( xtid, "%s", setup["interswitch_tid"].c_str() );
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
CVars sender; // Load sender
ret = load_db_record(sender, "SELECT firstname,lastname FROM customer WHERE id = %lu AND status = 1", senderid);
if (ret < 1L) {
throw new bad_parameter(out, "senderid");
}
//in["SenderEmail"] = sender["email"]; in["SenderEmail"].set_valid(true);
//in["BeneficiaryEmail"] = recipient["email"]; in["BeneficiaryEmail"].set_valid(true);
CVars trans_info;
trans_info["Fee"] = in["Fee"];
trans_info["InitiatingAmount"] = in["InitiatingAmount"];
trans_info["InitiatingChannel"] = in["InitiatingChannel"];
trans_info["InitiatingCurrencyCode"] = in["InitiatingCurrencyCode"];
trans_info["InitiatingEntityCode"] = in["InitiatingEntityCode"];
trans_info["InitiatingPaymentMethodCode"] = in["InitiatingPaymentMethodCode"];
trans_info["TerminatingAccountNumber"] = recipient["account_no"]; //in["TerminatingAccountNumber"];
trans_info["TerminatingAccountType"] = recipient["account_type"]; // in["TerminatingAccountType"];
trans_info["TerminatingAmount"] = in["TerminatingAmount"];
trans_info["TerminatingCountryCode"] = in["TerminatingCountryCode"];
trans_info["TerminatingCurrencyCode"] = in["TerminatingCurrencyCode"];
trans_info["TerminatingEntityCode"] = recipient["bank_code"]; //in["TerminatingEntityCode"];
trans_info["TerminatingPaymentMethodCode"] = in["TerminatingPaymentMethodCode"];
trans_info["TransferCode"] = uniqueRef;
trans_info["SenderLastname"] = sender["lastname"];
trans_info["SenderOthernames"] = sender["firstname"];
trans_info["BeneficiaryLastname"] = recipient["lastname"];
trans_info["BeneficiaryOthernames"] = recipient["firstname"];
char status[SAFESTRING_COMMON_BUFFER_SIZE];
memset(status, 32, SAFESTRING_COMMON_BUFFER_SIZE);
status[SAFESTRING_COMMON_BUFFER_SIZE] = '\0';
char transCode[SAFESTRING_COMMON_BUFFER_SIZE];
memset(transCode, 0, SAFESTRING_COMMON_BUFFER_SIZE);
sprintf(transCode, ""); // ???
string result = interswitch_doTransfer(
setup["interswitch_sep"].c_str(),
xtid,
trans_info,
status);
logfmt(FLOG_MAX, "Return: %s", result.c_str());
logfmt(FLOG_MAX, "Status: %s", status);
out["ResponseCode"] = result;
out["status"] = status;
out["TransferCode"] = in["TransferCode"];
if (result == "90000") {
ret = PHP_API_OK;
out["TransactionReferenceCode"] = status;
out["status"] = "Transfer successful";
} else {
ret = PHP_API_BAD_PARAM;
out["TransactionReferenceCode"] = "";
}
transaction_final["responsecode"] = out["ResponseCode"];
transaction_final["responsecode"].set_valid(true);
transaction_final["transactionref"] = out["TransactionReferenceCode"];
transaction_final["transactionref"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_transaction", transaction_final, out["transaction_id"].Long());
} catch (runtime_error& ex) {
out["status"] = ex.what();
ret = PHP_API_BAD_PARAM;
} catch (bad_parameter) {
out["status"] = "Invalid input";
ret = PHP_API_BAD_PARAM;
} catch (...) {
out["status"] = "Unhandled exception in INTW_doTransfer";
ret = PHP_API_BAD_PARAM;
}
logfmt(logINFO, "/long INTW_doTransfer(CVars in, CVars &out)");
return ret;
}
//*****************************************************************************/
long INTW_queryTransaction(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_queryTransaction(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
// Initiate interswitch session
CVars setup;
INTW_configure(in, setup);
// Prepare call
const int statusSize = SAFESTRING_COMMON_BUFFER_SIZE;
char status[statusSize];
char transactionResponseCode[SAFESTRING_COMMON_BUFFER_SIZE];
long id = REQ_LONG(in, "id", 1, -1);
char xtid[12];
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
CVars advice; // Load advice
ret = load_db_record(advice, "SELECT transfer_code,transactionref FROM interswitch_transaction WHERE id = %lu", id);
if (ret < 1L) {
throw new bad_parameter(out, "id");
}
string result = interswitch_queryTransaction(
setup["interswitch_sep"].c_str(),
xtid,
advice["transfer_code"].c_str(),
advice["transactionref"].c_str(),
status,
transactionResponseCode);
out["ResponseCode"] = result;
out["TransactionResponseCode"] = transactionResponseCode;
out["status"] = status;
ret = PHP_API_OK;
advice["responsecode"] = transactionResponseCode;
advice["responsecode"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_transaction", advice, id);
} catch (bad_parameter) {
out["status"] = "Invalid ID";
} catch (...) {
out["status"] = "Unhandled exception in INTW_queryTransaction";
}
logfmt(logINFO, "/long INTW_queryTransaction(CVars in, CVars &out)");
return ret;
}
//*****************************************************************************/