#include #include #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 #include 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, 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, 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, eqstr> saveData); <------>long INTW_getBillerPaymentItems(CVars in, CVars &out); */ //*****************************************************************************/ long INTW_getSaveGeneric(const char *table, hash_map, 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, 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; } //*****************************************************************************/