main(){ srandom(time(0)); int cardNumber[12] = {4}; int i, j, count = 0; for(i = 0; i < TIMES; ++i){ for(j = 1; j < 12; ++j){ cardNumber[j] = random() % 10; } if(checkCreditCard(cardNumber)) ++count; } printf("The probability to guess the valid credit card number is %Lf\%\n", count * 100.0 / TIMES); }
int CreditCardProcessor::credit(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, QString preftype, int &prefid) { if (DEBUG) qDebug("CCP:credit(%d, %d, %f, %f, %d, %f, %f, %d, %s, %s, %d, %s, %d)", pccardid, pcvv, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid, preftype.toAscii().data(), prefid); reset(); if (preftype == "cohead" && prefid < 0) { _errorMsg = errorMsg(-40).arg(preftype).arg(prefid); return -40; } QString ccard_x; int returnVal = checkCreditCard(pccardid, pcvv, ccard_x); if (returnVal < 0) return returnVal; if (_metrics->boolean("CCConfirmCredit") && QMessageBox::question(0, tr("Confirm Credit Card Credit"), tr("Are you sure that you want to refund %2 %3 to credit card %1?") .arg(ccard_x) .arg(CurrDisplay::currSymbol(pcurrid)) .arg(pamount), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape ) == QMessageBox::No) { _errorMsg = errorMsg(50); return 50; } if (pccpayid > 0) { int oldccpayid = pccpayid; XSqlQuery ccq; ccq.exec("SELECT NEXTVAL('ccpay_ccpay_id_seq') AS ccpay_id;"); if (ccq.first()) pccpayid = ccq.value("ccpay_id").toInt(); else if (ccq.lastError().type() != QSqlError::None) { _errorMsg = ccq.lastError().databaseText(); return -1; } else // no rows found is fatal because we haven't processed the credit yet { _errorMsg = errorMsg(2); return -1; } int next_seq = -1; ccq.prepare("SELECT MAX(COALESCE(ccpay_order_number_seq, -1)) + 1" " AS next_seq " " FROM ccpay " " WHERE (ccpay_order_number=:ccpay_order_number);"); ccq.bindValue(":ccpay_order_number", preforder.toInt()); ccq.exec(); if (ccq.first()) next_seq = ccq.value("next_seq").toInt(); else if (ccq.lastError().type() != QSqlError::None) { _errorMsg = ccq.lastError().databaseText(); return -1; } ccq.prepare( "INSERT INTO ccpay (" " ccpay_id, ccpay_ccard_id, ccpay_cust_id," " ccpay_auth_charge, ccpay_auth," " ccpay_amount," " ccpay_curr_id, ccpay_type, ccpay_status," " ccpay_order_number, ccpay_order_number_seq" ") SELECT " " :newccpayid, ccpay_ccard_id, ccpay_cust_id," " ccpay_auth_charge, ccpay_auth," " :amount, :currid, 'R', 'X'," " ccpay_order_number, :nextseq " "FROM ccpay " "WHERE (ccpay_id=:oldccpayid);"); ccq.bindValue(":newccpayid", pccpayid); ccq.bindValue(":currid", pcurrid); ccq.bindValue(":amount", pamount); ccq.bindValue(":nextseq", next_seq); ccq.bindValue(":oldccpayid", oldccpayid); ccq.exec(); if (ccq.lastError().type() != QSqlError::NoError) { _errorMsg = ccq.lastError().databaseText(); return -1; } ccq.prepare("SELECT ccpay_r_ordernum FROM ccpay WHERE (ccpay_id=:ccpayid);"); ccq.bindValue(":ccpayid", oldccpayid); ccq.exec(); if (ccq.first()) preforder = ccq.value("ccpay_r_ordernum").toString(); else if (ccq.lastError().type() != QSqlError::None) { _errorMsg = ccq.lastError().databaseText(); return -1; } else { _errorMsg = errorMsg(-50); return -50; } } ParameterList dbupdateinfo; returnVal = doCredit(pccardid, pcvv, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder, preforder, pccpayid, dbupdateinfo); if (returnVal < 0) return returnVal; else if (returnVal > 0) _errorMsg = errorMsg(4).arg(_errorMsg); int ccpayReturn = updateCCPay(pccpayid, dbupdateinfo); if (returnVal == 0 && ccpayReturn != 0) returnVal = ccpayReturn; if (returnVal >= 0) { returnVal = fraudChecks(); if (returnVal < 0) { int voidReturnVal = voidPrevious(pccpayid); return (voidReturnVal < 0) ? voidReturnVal : returnVal; } if (pccpayid > 0) { XSqlQuery cq; cq.prepare("SELECT postCCCredit(:ccpayid, :reftype, :refid) AS result;"); cq.bindValue(":ccpayid", pccpayid); cq.bindValue(":reftype", preftype); cq.bindValue(":refid", prefid); cq.exec(); if (cq.first()) { int result = cq.value("result").toInt(); if (result < 0) { _errorMsg = "<p>" + errorMsg(4).arg(storedProcErrorLookup("postCCCredit", result)); returnVal = 1; } } else if (cq.lastError().type() != QSqlError::NoError) { _errorMsg = errorMsg(4).arg(cq.lastError().databaseText()); returnVal = 1; } } } return returnVal; }
int CreditCardProcessor::chargePreauthorized(const int pcvv, const double pamount, const int pcurrid, QString &pneworder, QString &preforder, int &pccpayid) { if (DEBUG) qDebug("CCP:chargePreauthorized(%d, %f, %d, %s, %s, %d)", pcvv, pamount, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid); reset(); int ccValidDays = _metrics->value("CCValidDays").toInt(); if (ccValidDays < 1) ccValidDays = 7; if (pamount <= 0) { _errorMsg = errorMsg(-21); return -21; } if (pccpayid < 0) { _errorMsg = errorMsg(-32); return -32; } XSqlQuery ccq; ccq.prepare("SELECT ccpay_amount, ccpay_curr_id, ccpay_order_number," " ccpay_ccard_id," " currToCurr(ccpay_curr_id, :curr_id, ccpay_amount," " CURRENT_DATE) AS ccpay_amount_converted " "FROM ccpay " "WHERE ((ccpay_status = 'A')" " AND (date_part('day', CURRENT_TIMESTAMP - " " ccpay_transaction_datetime) < " " :ccValidDays)" " AND (ccpay_id=:id));"); ccq.bindValue(":id", pccpayid); ccq.bindValue(":curr_id", pcurrid); ccq.bindValue(":ccValidDays", ccValidDays); ccq.exec(); if (ccq.first()) { if (pamount > ccq.value("ccpay_amount_converted").toDouble()) { _errorMsg = errorMsg(-33) .arg(ccq.value("ccpay_amount").toString()) .arg(pamount); return -33; } } else if (ccq.lastError().type() != QSqlError::None) { _errorMsg = ccq.lastError().databaseText(); return -1; } else { _errorMsg = errorMsg(-34); return -34; } int ccardid = ccq.value("ccpay_ccard_id").toInt(); preforder = ccq.value("ccpay_order_number").toString(); ccq.prepare("SELECT * FROM payco WHERE (payco_ccpay_id=:ccpayid)"); ccq.bindValue(":ccpayid", pccpayid); ccq.exec(); if (ccq.first()) { int coheadid = ccq.value("payco_cohead_id").toInt(); ccq.prepare("SELECT COUNT(*) AS linecount " "FROM coitem " "WHERE ((coitem_status='O')" " AND (coitem_cohead_id=:coheadid));"); ccq.bindValue(":coheadid", coheadid); ccq.exec(); if (ccq.first() && ccq.value("linecount").toInt() <= 0) { _errorMsg = errorMsg(-35); return -35; } else if (ccq.lastError().type() != QSqlError::None) { _errorMsg = ccq.lastError().databaseText(); return -1; } } else if (ccq.lastError().type() != QSqlError::None) { _errorMsg = ccq.lastError().databaseText(); return -1; } QString ccard_x; int returnVal = checkCreditCard(ccardid, pcvv, ccard_x); if (returnVal < 0) return returnVal; if (_metrics->boolean("CCConfirmChargePreauth") && QMessageBox::question(0, tr("Confirm Post-authorization of Credit Card Purchase"), tr("Are you sure that you want to charge a pre-authorized " "transaction to credit card %1 in the amount of %2 %3?") .arg(ccard_x) .arg(CurrDisplay::currSymbol(pcurrid)) .arg(pamount), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape ) == QMessageBox::No) { _errorMsg = errorMsg(30); return 30; } ParameterList dbupdateinfo; returnVal = doChargePreauthorized(ccardid, pcvv, pamount, pcurrid, pneworder, preforder, pccpayid, dbupdateinfo); if (returnVal > 0) _errorMsg = errorMsg(4).arg(_errorMsg); int ccpayReturn = updateCCPay(pccpayid, dbupdateinfo); if (returnVal == 0 && ccpayReturn != 0) returnVal = ccpayReturn; if (returnVal >= 0) { returnVal = fraudChecks(); if (returnVal < 0) { int voidReturnVal = voidPrevious(pccpayid); return (voidReturnVal < 0) ? voidReturnVal : returnVal; } ccq.prepare("INSERT INTO cashrcpt (" " cashrcpt_cust_id, cashrcpt_amount, cashrcpt_curr_id," " cashrcpt_fundstype, cashrcpt_docnumber," " cashrcpt_bankaccnt_id, cashrcpt_notes, cashrcpt_distdate) " "SELECT ccpay_cust_id, :amount, :curr_id," " ccard_type, ccpay_r_ordernum," " :bankaccnt_id, :notes, current_date" " FROM ccpay, ccard " "WHERE ((ccpay_ccard_id=ccard_id)" " AND (ccpay_id=:pccpayid));"); ccq.bindValue(":pccpayid", pccpayid); ccq.bindValue(":amount", pamount); ccq.bindValue(":curr_id", pcurrid); ccq.bindValue(":bankaccnt_id", _metrics->value("CCDefaultBank").toInt()); ccq.bindValue(":notes", "Converted Pre-auth"); ccq.exec(); if (ccq.lastError().type() != QSqlError::None) { _errorMsg = errorMsg(4).arg(ccq.lastError().databaseText()); // TODO: log an event? returnVal = 1; } } return returnVal; }
int CreditCardProcessor::charge(const int pccardid, const int pcvv, const double pamount, double ptax, bool ptaxexempt, double pfreight, double pduty, const int pcurrid, QString &pneworder, QString &preforder, int &pccpayid, QString preftype, int &prefid) { if (DEBUG) qDebug("CCP:charge(%d, %d, %f, %f, %d, %f, %f, %d, %s, %s, %d, %s, %d)", pccardid, pcvv, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder.toAscii().data(), preforder.toAscii().data(), pccpayid, preftype.toAscii().data(), prefid); reset(); if (pamount <= 0) { _errorMsg = errorMsg(-21); return -21; } if (preftype == "cohead" && prefid < 0) { _errorMsg = errorMsg(-40).arg(preftype).arg(prefid); return -40; } QString ccard_x; int returnVal = checkCreditCard(pccardid, pcvv, ccard_x); if (returnVal < 0) return returnVal; if (_metrics->boolean("CCConfirmCharge") && QMessageBox::question(0, tr("Confirm Charge of Credit Card Purchase"), tr("Are you sure that you want to charge credit card %1 " "in the amount of %2 %3?") .arg(ccard_x) .arg(CurrDisplay::currSymbol(pcurrid)) .arg(pamount), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape ) == QMessageBox::No) { _errorMsg = errorMsg(40); return 40; } ParameterList dbupdateinfo; returnVal = doCharge(pccardid, pcvv, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder, preforder, pccpayid, dbupdateinfo); if (returnVal > 0) _errorMsg = errorMsg(4).arg(_errorMsg); int ccpayReturn = updateCCPay(pccpayid, dbupdateinfo); if (returnVal == 0 && ccpayReturn != 0) returnVal = ccpayReturn; if (returnVal >= 0) { returnVal = fraudChecks(); if (returnVal < 0) { int voidReturnVal = voidPrevious(pccpayid); return (voidReturnVal < 0) ? voidReturnVal : returnVal; } // TODO: move this logic to postCCCashReceipt? XSqlQuery cashq; if (preftype == "cashrcpt") { if (prefid <= 0) { cashq.exec("SELECT NEXTVAL('cashrcpt_cashrcpt_id_seq') AS cashrcpt_id;"); if (cashq.first()) prefid = cashq.value("cashrcpt_id").toInt(); else if (q.lastError().type() != QSqlError::None) { _errorMsg = errorMsg(4).arg(cashq.lastError().databaseText()); // TODO: log an event? return 1; } cashq.prepare("INSERT INTO cashrcpt (cashrcpt_id," " cashrcpt_cust_id, cashrcpt_amount, cashrcpt_curr_id," " cashrcpt_fundstype, cashrcpt_docnumber," " cashrcpt_bankaccnt_id, cashrcpt_notes, cashrcpt_distdate) " "SELECT :cashrcptid," " ccpay_cust_id, :amount, :curr_id," " ccard_type, ccpay_r_ordernum," " :bankaccntid, :notes, current_date" " FROM ccpay, ccard " "WHERE (ccpay_ccard_id=ccard_id);"); } else cashq.prepare( "UPDATE cashrcpt " "SET cashrcpt_cust_id=ccard_cust_id," " cashrcpt_amount=:amount," " cashrcpt_fundstype=ccard_type," " cashrcpt_bankaccnt_id=:bankaccntid," " cashrcpt_distdate=CURRENT_DATE," " cashrcpt_notes=:notes, " " cashrcpt_curr_id=:curr_id " "FROM ccard " "WHERE ((cashrcpt_id=:cashrcptid)" " AND (ccard_id=:ccardid));" ); cashq.bindValue(":cashrcptid", prefid); cashq.bindValue(":ccardid", pccardid); cashq.bindValue(":amount", pamount); cashq.bindValue(":curr_id", pcurrid); cashq.bindValue(":bankaccntid", _metrics->value("CCDefaultBank").toInt()); cashq.bindValue(":notes", "Credit Card Charge"); cashq.exec(); if (cashq.lastError().type() != QSqlError::None) { _errorMsg = errorMsg(4).arg(cashq.lastError().databaseText()); // TODO: log an event? returnVal = 1; } } else if (preftype == "cohead") { cashq.prepare("SELECT postCCcashReceipt(:ccpayid, :bankaccnt) AS cm_id;"); cashq.bindValue(":ccpayid", pccpayid); cashq.bindValue(":bankaccnt", _metrics->value("CCDefaultBank").toInt()); cashq.exec(); if (cashq.first()) { int cm_id = cashq.value("cm_id").toInt(); if (cm_id < 0) { _errorMsg = "<p>" + errorMsg(4) .arg(storedProcErrorLookup("postCCcashReceipt", cm_id)); returnVal = 3; } cashq.prepare("INSERT INTO payaropen VALUES" " (:payco_ccpay_id, :payco_cohead_id," " :payco_amount, :payco_curr_id);"); cashq.bindValue(":payco_ccpay_id", pccpayid); cashq.bindValue(":payco_cohead_id", cm_id); cashq.bindValue(":payco_amount", pamount); cashq.bindValue(":payco_curr_id", pcurrid); cashq.exec(); if (cashq.lastError().type() != QSqlError::NoError) { _errorMsg = errorMsg(4).arg(cashq.lastError().databaseText()); // TODO: log an event? returnVal = 1; } else { cashq.prepare("INSERT INTO aropenco VALUES" " (:payco_ccpay_id, :payco_cohead_id," " :payco_amount, :payco_curr_id);"); cashq.bindValue(":payco_ccpay_id", cm_id); cashq.bindValue(":payco_cohead_id", prefid); cashq.bindValue(":payco_amount", pamount); cashq.bindValue(":payco_curr_id", pcurrid); cashq.exec(); if (cashq.lastError().type() != QSqlError::NoError) { _errorMsg = errorMsg(4).arg(cashq.lastError().databaseText()); // TODO: log an event? returnVal = 1; } } } else if (cashq.lastError().type() != QSqlError::NoError) { _errorMsg = errorMsg(4).arg(cashq.lastError().databaseText()); // TODO: log an event? returnVal = 1; } } } else if (preftype == "cohead") // record unsuccessful attempt against cohead { XSqlQuery cashq; cashq.prepare("INSERT INTO payco VALUES" " (:payco_ccpay_id, :payco_cohead_id," " :payco_amount, :payco_curr_id);"); cashq.bindValue(":payco_ccpay_id", pccpayid); cashq.bindValue(":payco_cohead_id", prefid); cashq.bindValue(":payco_amount", pamount); cashq.bindValue(":payco_curr_id", pcurrid); cashq.exec(); if (cashq.lastError().type() != QSqlError::NoError) { _errorMsg = errorMsg(4).arg(cashq.lastError().databaseText()); // TODO: log an event? returnVal = 1; } } return returnVal; }