public function __construct($refnum) { parent::__construct($refnum); $this->type = 'PrePaid'; }
function send_auth() { // initialize $dbTrans = PaycardLib::paycard_db(); if (!$dbTrans) { PaycardLib::paycard_reset(); return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) } $request = new PaycardRequest($this->refnum(CoreLocal::get('paycard_id'))); $request->setProcessor('AuthDotNot'); $mode = $request->amount < 0 ? 'refund' : 'tender'; $cardPAN = $this->trans_pan['pan']; $request->setPAN($cardPAN); $request->setIssuer(CoreLocal::get("paycard_issuer")); $cardExM = substr(CoreLocal::get("paycard_exp"), 0, 2); $cardExY = substr(CoreLocal::get("paycard_exp"), 2, 2); $cardTr1 = $this->trans_pan['tr1']; $cardTr2 = $this->trans_pan['tr2']; $request->setCardholder(CoreLocal::get("paycard_name")); // x_login & x_tran_key need to be // filled in to work $postValues = array("x_login" => AUTHDOTNET_LOGIN, "x_tran_key" => AUTHDOTNET_TRANS_KEY, "x_market_type" => "2", "x_device_type" => "5", "cp_version" => "1.0", "x_test_request" => "0", "x_amount" => $request->formattedAmount(), "x_user_ref" => $request->refNum); if (CoreLocal::get("training") == 1) { $postValues["x_test_request"] = "1"; } if ($mode == "refund") { $postValues["x_type"] = "CREDIT"; } else { $postValues["x_type"] = "AUTH_CAPTURE"; } if (!$cardTr1 && !$cardTr2 || $mode == "refund") { $postValues["x_card_num"] = $cardPAN; $postValues["x_exp_date"] = $cardExM . $cardExY; $request->setSent(1, 1, 0, 0); } elseif ($cardTr1) { $postValues["x_track1"] = $cardTr1; $request->setSent(0, 0, 1, 0); } elseif ($cardTr2) { $postValues["x_track2"] = $cardTr2; $request->setSent(0, 0, 0, 1); } try { $request->saveRequest(); } catch (Exception $ex) { return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) } $this->last_request = $request; $postData = $this->array2post($postValues); $this->GATEWAY = "https://test.authorize.net/gateway/transact.dll"; return $this->curlSend($postData, 'POST', False); }
/** Examine XML response from Datacap transaction, log results, determine next step @return [int] PaycardLib error code */ public function handleResponseDataCap($xml) { $rawXml = $xml; $ref = $this->refnum(CoreLocal::get('paycard_id')); if (CoreLocal::get('LastEmvReqType') == 'void') { $request = new PaycardVoidRequest($ref); } elseif (CoreLocal::get('LastEmvReqType') == 'gift') { $request = new PaycardGiftRequest($ref); } else { $request = new PaycardRequest($ref); } $id_set = CoreLocal::get('LastEmvPcId'); $request->last_paycard_transaction_id = $id_set[0]; $request->last_req_id = $id_set[1]; $this->last_paycard_transaction_id = $request->last_paycard_transaction_id; $response = new PaycardResponse($request, array('curlTime' => 0, 'curlErr' => 0, 'curlHTTP' => 200)); $xml = new BetterXmlData($xml); $validResponse = 1; $responseCode = $xml->query('/RStream/CmdResponse/CmdStatus'); $resultMsg = $responseCode; if ($responseCode) { $responseCode = $this->responseToNumber($responseCode); } else { $validResponse = -3; } $response->setResponseCode($responseCode); $resultCode = $xml->query('/RStream/CmdResponse/DSIXReturnCode'); $response->setResultCode($resultCode); $apprNumber = $xml->query('/RStream/TranResponse/AuthCode'); $response->setApprovalNum($apprNumber); $rMsg = $resultMsg; if ($resultMsg) { $rMsg = $resultMsg; if ($responseCode == 1) { // approved if ($apprNumber) { $rMsg .= ' ' . $apprNumber; } } else { $processor_text = $xml->query('/RStream/CmdResponse/TextResponse'); if ($processor_text) { $rMsg = $processor_text; } } } $response->setResultMsg($rMsg); $xTransID = $xml->query('/RStream/TranResponse/RefNo'); $response->setTransactionID($xTransID); if ($xTransID === false) { $validResponse = -3; } $issuer = $xml->query('/RStream/TranResponse/CardType'); $resp_balance = $xml->query('/RStream/TranResponse/Balance'); $ebtbalance = 0; if ($issuer == 'Foodstamp' && $resp_balance !== false) { $issuer = 'EBT'; CoreLocal::set('EbtFsBalance', $resp_balance); $ebtbalance = $resp_balance; } elseif ($issuer == 'Cash' && $resp_balance !== false) { $issuer = 'EBT'; CoreLocal::set('EbtCaBalance', $resp_balance); $ebtbalance = $resp_balance; } elseif ($xml->query('/RStream/TranResponse/TranType') == 'PrePaid' && $resp_balance !== false) { $issuer = 'NCG'; $ebtbalance = $resp_balance; CoreLocal::set('GiftBalance', $resp_balance); } $response->setBalance($ebtbalance); $dbc = Database::tDataConnect(); $tran_code = $xml->query('/RStream/TranResponse/TranCode'); if (substr($tran_code, 0, 3) == 'EMV' && strpos($rawXml, 'x____') !== false) { CoreLocal::set('EmvSignature', true); } else { CoreLocal::set('EmvSignature', false); } if (substr($tran_code, 0, 3) == 'EMV') { $printData = $xml->query('/RStream/PrintData/*', false); if (strlen($printData) > 0) { $receiptID = $transID; if (CoreLocal::get('paycard_mode') == PaycardLib::PAYCARD_MODE_VOID) { $receiptID++; } $printP = $dbc->prepare(' INSERT INTO EmvReceipt (dateID, tdate, empNo, registerNo, transNo, transID, content) VALUES (?, ?, ?, ?, ?, ?, ?)'); $dbc->execute($printP, array(date('Ymd'), date('Y-m-d H:i:s'), $cashierNo, $laneNo, $transNo, $receiptID, $printData)); } } // put normalized value in validResponse column $normalized = $validResponse == 0 ? 4 : 0; if ($responseCode == 1) { $normalized = 1; } else { if ($responseCode == 2) { $normalized = 2; } else { if ($responseCode == 0) { $normalized = 3; } } } $response->setNormalizedCode($normalized); $response->setToken($xml->query('/RStream/TranResponse/RecordNo'), $xml->query('/RStream/TranResponse/ProcessData'), $xml->query('/RStream/TranResponse/AcqRefData')); try { $response->saveResponse(); } catch (Exception $ex) { echo $ex->getMessage() . "\n"; } /** handle partial auth **/ if ($responseCode == 1) { $amt = $xml->query('/RStream/TranResponse/Amount/Authorize'); if ($amt != abs(CoreLocal::get("paycard_amount"))) { $request->changeAmount($amt); CoreLocal::set("paycard_amount", $amt); CoreLocal::set("paycard_partial", True); UdpComm::udpSend('goodBeep'); } } $pan = $xml->query('/RStream/TranResponse/AcctNo'); $resp_name = $xml->query('/RStream/TranResponse/CardholderName'); $name = $resp_name ? $resp_name : 'Cardholder'; $issuer = $xml->query('/RStream/TranResponse/CardType'); $request->updateCardInfo($pan, $name, $issuer); switch (strtoupper($xml->query('/RStream/CmdResponse/CmdStatus'))) { case 'APPROVED': return PaycardLib::PAYCARD_ERR_OK; case 'DECLINED': if ($issuer == 'EBT') { // if EBT is declined but lists a balance less than the // requested authorization, it may be possible to // charge the card for a less amount. TransRecord::addcomment(""); CoreLocal::set('boxMsg', sprintf('Card Balance: $%.2f', $ebtbalance)); } elseif (substr($tran_code, 0, 3) == 'EMV') { CoreLocal::set('paycard_amount', 0); return PaycardLib::PAYCARD_ERR_OK; } UdpComm::udpSend('termReset'); CoreLocal::set('ccTermState', 'swipe'); // intentional fallthrough // intentional fallthrough case 'ERROR': CoreLocal::set("boxMsg", ""); $texts = $xml->query('/RStream/CmdResponse/TextResponse'); CoreLocal::set("boxMsg", "Error: {$texts}"); $dsix = $xml->query('/RStream/CmdResponse/DSIXReturnCode'); if ($dsix == '001007' || $dsix == '003007' || $dsix == '003010') { /* These error codes indicate a potential connectivity * error mid-transaction. Do not add a comment record to * the transaction to avoid incrementing InvoiceNo */ } else { TransRecord::addcomment(""); } break; default: CoreLocal::set("boxMsg", "An unknown error occurred<br />at the gateway"); TransRecord::addcomment(""); } return PaycardLib::PAYCARD_ERR_PROC; }
function send_auth() { $dbTrans = PaycardLib::paycard_db(); if (!$dbTrans) { PaycardLib::paycard_reset(); return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) } $request = new PaycardRequest($this->refnum(CoreLocal::get('paycard_id'))); $request->setProcessor('FirstData'); $mode = 'sale'; $this->trans_pan['pan'] = CoreLocal::get("paycard_PAN"); $cardPAN = $this->trans_pan['pan']; $cardExM = substr(CoreLocal::get("paycard_exp"), 0, 2); $cardExY = substr(CoreLocal::get("paycard_exp"), 2, 2); $cardTr1 = CoreLocal::get("paycard_tr1"); $cardTr2 = CoreLocal::get("paycard_tr2"); $cardTr3 = CoreLocal::get("paycard_tr3"); $request->setCardholder(CoreLocal::get("paycard_name")); $cvv2 = CoreLocal::get("paycard_cvv2"); if (CoreLocal::get("training") == 1) { $cardPAN = "4111111111111111"; $cardPANmasked = "xxxxxxxxxxxxTEST"; $cardIssuer = "Visa"; $cardTr1 = False; $cardTr2 = False; $request->setCardholder("Just Testing"); $nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y") + 1); $cardExM = date("m", $nextyear); $cardExY = date("y", $nextyear); } $request->setPAN($cardPAN); $request->setIssuer(CoreLocal::get("paycard_issuer")); $sendPAN = 0; $sendExp = 0; $sendTr1 = 0; $sendTr2 = 0; $magstripe = ""; if (!$cardTr1 && !$cardTr2) { $sendPAN = 1; $sendExp = 1; } if ($cardTr1) { $sendTr1 = 1; $magstripe .= "%" . $cardTr1 . "?"; } if ($cardTr2) { $sendTr2 = 1; $magstripe .= ";" . $cardTr2 . "?"; } if ($cardTr2 && $cardTr3) { $sendPAN = 1; $magstripe .= ";" . $cardTr3 . "?"; } $request->setSent($sendPAN, $sendExp, $sendTr1, $sendTr2); try { $request->saveRequest(); } catch (Exception $ex) { PaycardLib::paycard_reset(); return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) } $this->last_request = $request; $xml = '<fdggwsapi:FDGGWSApiOrderRequest xmlns:v1="http://secure.linkpt.net/fdggwsapi/schemas_us/v1" xmlns:fdggwsapi="http://secure.linkpt.net/fdggwsapi/schemas_us/fdggwsapi"> <v1:Transaction>'; $xml .= "<v1:CreditCardTxType> \n <v1:Type>{$mode}</v1:Type> \n </v1:CreditCardTxType>"; $xml .= "<v1:CreditCardData> \n <v1:CardNumber>{$pan}</v1:CardNumber> \n <v1:ExpMonth>{$cardExM}</v1:ExpMonth> \n <v1:ExpYear>{$cardExY}</v1:ExpYear> \n <v1:CardCodeValue>{$cvv2}</v1:CardCodeValue>\n </v1:CreditCardData>"; $xml .= "<v1:Payment>\n <v1:ChargeTotal>" . $request->formattedAmount() . "</v1:ChargeTotal> \n </v1:Payment>"; $xml .= "<v1:TransactionDetails>\n <v1:OrderId>" . $request->refNum . "</v1:OrderId>\n <v1:Ip>" . filter_input(INPUT_SERVER, 'REMOTE_ADDR') . "</v1:Ip>\n </v1:TransactionDetails>"; $xml .= '</v1:Transaction> </fdggwsapi:FDGGWSApiOrderRequest>'; $this->GATEWAY = "https://ws.firstdataglobalgateway.com/fdggwsapi/services/order.wsdl"; if ($live == 0) { $this->GATEWAY = "https://ws.merchanttest.firstdataglobalgateway.com/fdggwsapi/services/order.wsdl"; } $extraCurlSetup = array(CURLOPT_HTTPAUTH => CURLAUTH_BASIC, CURLOPT_USERPWD => "WS" . FD_STORE_ID . "._.1:" . FD_PASSWD, CURLOPT_SSLCERT => FD_CERT_PATH . "/WS" . FD_STORE_ID . "._.1.pem", CURLOPT_SSLKEY => FD_CERT_PATH . "/WS" . FD_STORE_ID . "._.1.key", CURLOPT_SSLKEYPASSWD => FD_KEY_PASSWD); $soaptext = $this->soapify('', array('xml' => $xml), '', False); return $this->curlSend($soaptext, 'SOAP', True, $extraCurlSetup); }
public function __construct($refnum) { parent::__construct($refnum); $original = CoreLocal::get('paycard_trans'); $this->original = explode('-', $original); }