int AuthorizeDotNetProcessor::doCharge(const int pccardid, const int pcvv, const double pamount, const double ptax, const bool ptaxexempt, const double pfreight, const double pduty, const int pcurrid, QString& pneworder, QString& preforder, int &pccpayid, ParameterList &pparams) { if (DEBUG) qDebug("AN:doCharge(%d, %d, %f, %f, %d, %f, %f, %d, %s, %s, %d)", pccardid, pcvv, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid); int returnValue = 0; double amount = pamount; double tax = ptax; double freight = pfreight; double duty = pduty; int currid = pcurrid; if (_metrics->value("CCANCurrency") != "TRANS") { currid = _metrics->value("CCANCurrency").toInt(); amount = currToCurr(pcurrid, currid, pamount, &returnValue); if (returnValue < 0) return returnValue; tax = currToCurr(pcurrid, currid, ptax, &returnValue); if (returnValue < 0) return returnValue; freight = currToCurr(pcurrid, currid, pfreight, &returnValue); if (returnValue < 0) return returnValue; duty = currToCurr(pcurrid, currid, pduty, &returnValue); if (returnValue < 0) return returnValue; } QString request; returnValue = buildCommon(pccardid, pcvv, amount, currid, request, "AUTH_CAPTURE"); if (returnValue != 0) return returnValue; APPENDFIELD(request, "x_tax", QString::number(tax)); APPENDFIELD(request, "x_tax_exempt", ptaxexempt ? "TRUE" : "FALSE"); APPENDFIELD(request, "x_freight", QString::number(freight)); APPENDFIELD(request, "x_duty", QString::number(duty)); if (! preforder.isEmpty()) APPENDFIELD(request, "x_po_num", preforder); QString response; returnValue = sendViaHTTP(request, response); if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "C", amount, currid, pneworder, preforder, pccpayid, pparams); return returnValue; }
int YourPayProcessor::doChargePreauthorized(const int pccardid, const int pcvv, const double pamount, const int pcurrid, QString &pneworder, QString &preforder, int &pccpayid, ParameterList &pparams) { if (DEBUG) qDebug("YP:doChargePreauthorized(%d, %d, %f, %d, %s, %s, %d)", pccardid, pcvv, pamount, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid); int returnValue = 0; double amount = currToCurr(pcurrid, _ypcurrid, pamount, &returnValue); if (returnValue < 0) return returnValue; QDomDocument request; returnValue = buildCommon(pccardid, pcvv, amount, request, "POSTAUTH"); if (returnValue != 0) return returnValue; QDomElement elem = request.createElement("transactiondetails"); request.documentElement().appendChild(elem); CREATECHILDTEXTNODE(elem, "oid", preforder); CREATECHILDTEXTNODE(elem, "terminaltype", "UNSPECIFIED"); QString response; returnValue = sendViaHTTP(request.toString(), response); if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "CP", pamount, pcurrid, pneworder, preforder, pccpayid, pparams); return returnValue; }
int AuthorizeDotNetProcessor::doVoidPrevious(const int pccardid, const int pcvv, const double pamount, const int pcurrid, QString &pneworder, QString &preforder, QString &papproval, int &pccpayid, ParameterList &pparams) { if (DEBUG) qDebug("AN:doVoidPrevious(%d, %d, %f, %d, %s, %s, %s, %d)", pccardid, pcvv, pamount, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), papproval.toAscii().data(), pccpayid); QString tmpErrorMsg = _errorMsg; int returnValue = 0; double amount = pamount; int currid = pcurrid; if (_metrics->value("CCANCurrency") != "TRANS") { currid = _metrics->value("CCANCurrency").toInt(); amount = currToCurr(pcurrid, currid, pamount, &returnValue); if (returnValue < 0) { _errorMsg = tmpErrorMsg; return returnValue; } } QString request; returnValue = buildCommon(pccardid, pcvv, amount, currid, request, "VOID"); if (returnValue != 0) return returnValue; APPENDFIELD(request, "x_trans_id", preforder); QString response; returnValue = sendViaHTTP(request, response); _errorMsg = tmpErrorMsg; if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "V", amount, currid, pneworder, preforder, pccpayid, pparams); if (! tmpErrorMsg.isEmpty()) _errorMsg = tmpErrorMsg; return returnValue; }
int YourPayProcessor::doVoidPrevious(const int pccardid, const int pcvv, const double pamount, const int pcurrid, QString &pneworder, QString &preforder, QString &papproval, int &pccpayid, ParameterList &pparams) { if (DEBUG) qDebug("YP:doVoidPrevious(%d, %d, %f, %d, %s, %s, %s, %d)", pccardid, pcvv, pamount, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), papproval.toAscii().data(), pccpayid); int returnValue = 0; double amount = currToCurr(pcurrid, _ypcurrid, pamount, &returnValue); if (returnValue < 0) return returnValue; // distinguish void errors from errors from problems that cause us to void QString tmpErrorMsg = _errorMsg; QDomDocument request; returnValue = buildCommon(pccardid, pcvv, amount, request, "VOID"); if (returnValue != 0) return returnValue; QDomElement elem = request.createElement("transactiondetails"); request.documentElement().appendChild(elem); CREATECHILDTEXTNODE(elem, "oid", preforder); CREATECHILDTEXTNODE(elem, "terminaltype", "UNSPECIFIED"); QString response; returnValue = sendViaHTTP(request.toString(), response); _errorMsg = tmpErrorMsg; if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "V", pamount, pcurrid, pneworder, preforder, pccpayid, pparams); _errorMsg = tmpErrorMsg; return returnValue; }
int YourPayProcessor::doCredit(const int pccardid, const int pcvv, const double pamount, const double ptax, const bool ptaxexempt, const double pfreight, const double pduty, const int pcurrid, QString &pneworder, QString &preforder, int &pccpayid, ParameterList &pparams) { if (DEBUG) qDebug("YP:doCredit(%d, %d, %f, %f, %d, %f, %f, %d, %s, %s, %d)", pccardid, pcvv, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid); int returnValue = 0; double amount = currToCurr(pcurrid, _ypcurrid, pamount, &returnValue); if (returnValue < 0) return returnValue; QDomDocument request; returnValue = buildCommon(pccardid, pcvv, amount, request, "CREDIT"); if (returnValue != 0) return returnValue; QDomElement elem = request.createElement("transactiondetails"); request.documentElement().appendChild(elem); CREATECHILDTEXTNODE(elem, "oid", preforder); CREATECHILDTEXTNODE(elem, "reference_number", pneworder); CREATECHILDTEXTNODE(elem, "terminaltype", "UNSPECIFIED"); CREATECHILDTEXTNODE(elem, "taxexempt", ptaxexempt ? "Y" : "N"); CREATECHILDTEXTNODE(request.elementsByTagName("payment").at(0), "tax", QString::number(ptax)); QString response; returnValue = sendViaHTTP(request.toString(), response); if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "R", pamount, pcurrid, pneworder, preforder, pccpayid, pparams); return returnValue; }
int AuthorizeDotNetProcessor::doChargePreauthorized(const int pccardid, const int pcvv, const double pamount, const int pcurrid, QString &pneworder, QString &preforder, int &pccpayid, ParameterList &pparams) { if (DEBUG) qDebug("AN:doChargePreauthorized(%d, %d, %f, %d, %s, %s, %d)", pccardid, pcvv, pamount, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid); int returnValue = 0; double amount = pamount; int currid = pcurrid; if (_metrics->value("CCANCurrency") != "TRANS") { currid = _metrics->value("CCANCurrency").toInt(); amount = currToCurr(pcurrid, currid, pamount, &returnValue); if (returnValue < 0) return returnValue; } QString request; returnValue = buildCommon(pccardid, pcvv, amount, currid, request, "PRIOR_AUTH_CAPTURE"); if (returnValue != 0) return returnValue; APPENDFIELD(request, "x_trans_id", preforder); QString response; returnValue = sendViaHTTP(request, response); if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "CP", amount, currid, pneworder, preforder, pccpayid, pparams); return returnValue; }
int YourPayProcessor::doCharge(const int pccardid, const int pcvv, const double pamount, const double ptax, const bool ptaxexempt, const double pfreight, const double pduty, const int pcurrid, QString& pneworder, QString& preforder, int &pccpayid, ParameterList &pparams) { if (DEBUG) qDebug("YP:doCharge(%d, %d, %f, %f, %d, %f, %f, %d, %s, %s, %d)", pccardid, pcvv, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid); int returnValue = 0; double amount = currToCurr(pcurrid, _ypcurrid, pamount, &returnValue); if (returnValue < 0) return returnValue; QDomDocument request; returnValue = buildCommon(pccardid, pcvv, amount, request, "SALE"); if (returnValue != 0) return returnValue; QDomElement elem; elem = request.createElement("transactiondetails"); request.documentElement().appendChild(elem); // in case we're reusing an order number QString oidstr = pneworder; XSqlQuery ypq; ypq.prepare("SELECT MAX(COALESCE(ccpay_order_number_seq, -1)) + 1" " AS next_seq " " FROM ccpay " " WHERE (ccpay_order_number=:ccpay_order_number);"); ypq.bindValue(":ccpay_order_number", pneworder); ypq.exec(); if (ypq.first() && ! ypq.value("next_seq").isNull()) oidstr = oidstr + "-" + ypq.value("next_seq").toString(); else if (ypq.lastError().type() != QSqlError::NoError) { _errorMsg = errorMsg(-44); return -44; } CREATECHILDTEXTNODE(elem, "oid", oidstr); CREATECHILDTEXTNODE(elem, "terminaltype", "UNSPECIFIED"); CREATECHILDTEXTNODE(elem, "taxexempt", ptaxexempt ? "Y" : "N"); if (! preforder.isEmpty()) CREATECHILDTEXTNODE(elem, "ponumber", preforder); /* TODO: salesOrder.cpp had the following, but it doesn't appear to be useful except for having YP calculate shipping charges. since we don't use YP to calculate shipping and this is a SALE and not a CALCSHIPPING transaction, we won't bother for now. elem = request.createElement("shipping"); request.documentElement().appendChild(elem); CREATECHILDTEXTNODE(elem, "address1", _shipto_address1); CREATECHILDTEXTNODE(elem, "address2", _shipto_address2); CREATECHILDTEXTNODE(elem, "city", _shipto_city); CREATECHILDTEXTNODE(elem, "name", _shipto_name); CREATECHILDTEXTNODE(elem, "state", _shipto_state); CREATECHILDTEXTNODE(elem, "zip", _shipto_zip); */ CREATECHILDTEXTNODE(request.elementsByTagName("payment").at(0), "tax", QString::number(ptax)); QString response; returnValue = sendViaHTTP(request.toString(), response); if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "C", pamount, pcurrid, pneworder, preforder, pccpayid, pparams); return returnValue; }
/** @brief Build an outgoing request for a follow-on transaction - that is, one that requires a previous transaction to be meaningful. Some Authorize.Net transactions can only occur after being set up by a prior transaction. For example, @em capturing a pre-authorization requires an existing valid pre-authorization. These follow-on transactions pass less data and are somewhat more secure than full messages. @param pccpayid the internal id of the @c ccpay record @param ptransid the transaction id, typically the order number @param pamount in: the amount in the ERP transaction currency, out: the amount in the Authorize.Net transaction @param[in,out] pcurrid in: the currency of the ERP transaction, out: the currency of the Authorize.Net transaction @param[in,out] prequest The message to send to Authorize.Net @param pordertype The type of Authorize.Net transaction @see buildCommon */ int AuthorizeDotNetProcessor::buildFollowup(const int pccpayid, const QString &ptransid, double &pamount, int &pcurrid, QString &prequest, QString pordertype) { Q_UNUSED(pccpayid); int returnValue = 0; int currid = pcurrid; if (_metrics->value("CCANCurrency") != "TRANS") { currid = _metrics->value("CCANCurrency").toInt(); pamount = currToCurr(pcurrid, currid, pamount, &returnValue); pcurrid = currid; if (returnValue < 0) return returnValue; } if (! _metrics->value("CCANDelim").isEmpty()) APPENDFIELD(prequest, "x_delim_char", _metrics->value("CCANDelim")); if (! _metrics->value("CCANEncap").isEmpty()) APPENDFIELD(prequest, "x_encap_char", _metrics->value("CCANEncap")); APPENDFIELD(prequest, "x_version", _metrics->value("CCANVer")); APPENDFIELD(prequest, "x_delim_data", "true"); APPENDFIELD(prequest, "x_login", _metricsenc->value("CCLogin")); APPENDFIELD(prequest, "x_tran_key", _metricsenc->value("CCPassword")); APPENDFIELD(prequest, "x_trans_id", ptransid); APPENDFIELD(prequest, "x_amount", QString::number(pamount, 'f', 2)); APPENDFIELD(prequest, "x_method", "CC"); if (_metrics->value("CCServer").contains("test.authorize.net")) { APPENDFIELD(prequest, "x_test_request", "false"); } else { APPENDFIELD(prequest, "x_test_request", isLive() ? "false" : "true"); } APPENDFIELD(prequest, "x_relay_response", "false"); APPENDFIELD(prequest, "x_duplicate_window", _metrics->value("CCANDuplicateWindow")); XSqlQuery anq; anq.prepare("SELECT curr_abbr FROM curr_symbol WHERE (curr_id=:currid);"); anq.bindValue(":currid", pcurrid); anq.exec(); if (anq.first()) { APPENDFIELD(prequest, "x_currency_code", anq.value("curr_abbr").toString()); } else if (anq.lastError().type() != QSqlError::NoError) { _errorMsg = anq.lastError().databaseText(); return -1; } // TODO: if check and not credit card transaction do something else APPENDFIELD(prequest, "x_method", "CC"); APPENDFIELD(prequest, "x_type", pordertype); if (DEBUG) qDebug("AN:buildFollowup built %s\n", prequest.toLatin1().data()); return 0; }