private function handleResponseVoid($vdResult) { $xml = new xmlData($vdResult["response"]); $request = $this->last_request; $this->last_paycard_transaction_id = $request->last_paycard_transaction_id; $response = new PaycardResponse($request, $authResult); $mode = 'void'; $authcode = $this->temp; $program = "Gift"; $validResponse = 0; // verify that echo'd fields match our request if ($xml->get('TRANSACTIONTYPE') && $xml->get('TRANSACTIONTYPE') == $program && $xml->get('AUTHORIZED') && $xml->get('AUTHORIZATIONCODE') && $xml->get('BALANCE')) { $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present } else { $validResponse = 4; // response was parsed as XML but fields didn't match } $resultCode = 0; $apprNumber = $xml->get('AUTHORIZATIONCODE'); $response->setApprovalNum($apprNumber); $rMsg = ''; if ($apprNumber != '' && $xml->get('AUTHORIZED') == 'true') { $validResponse = 1; $resultCode = 1; $rMsg = 'Voided'; } else { $rMsg = substr($xml->get_first('ERRORMSG'), 0, 100); } $response->setResultMsg($rMsg); $response->setResultCode($resultCode); $response->setResponseCode($resultCode); $response->setNormalizedCode($resultCode); $response->setValid($validResponse); try { $response->saveResponse(); } catch (Exception $ex) { } if ($vdResult['curlErr'] != CURLE_OK || $vdResult['curlHTTP'] != 200) { if ($authResult['curlHTTP'] == '0') { CoreLocal::set("boxMsg", "No response from processor<br />\n The transaction did not go through"); return PaycardLib::PAYCARD_ERR_PROC; } return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); // comm error, try again } // check for data errors (any failure to parse response XML or echo'd field mismatch) // invalid server response, we don't know if the transaction was voided (use carbon) if ($validResponse != 1) { return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_DATA); } // put the parsed response into session so the caller, receipt printer, etc can get the data they need CoreLocal::set("paycard_response", array()); CoreLocal::set("paycard_response", $xml->array_dump()); $temp = CoreLocal::get("paycard_response"); $temp["Balance"] = $temp["BALANCE"]; CoreLocal::set("paycard_response", $temp); // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields if ($xml->get('AUTHORIZED') == 'true' && $xml->get('AUTHORIZATIONCODE') != '' && $xml->get_first('ERRORMSG') == '') { return PaycardLib::PAYCARD_ERR_OK; // void successful, no error } // the authorizor gave us some failure code CoreLocal::set("boxMsg", "PROCESSOR ERROR: " . $xml->get_first("ERRORMSG")); return PaycardLib::PAYCARD_ERR_PROC; }
function handleResponseAuth($authResult) { $inner_xml = $this->desoapify("SOAP-ENV:Body", $authResult['response']); $xml = new xmlData($inner_xml); $request = $this->last_request; $this->last_paycard_transaction_id = $request->last_paycard_transaction_id; $response = new PaycardResponse($request, $authResult); $dbTrans = PaycardLib::paycard_db(); $cvv2 = CoreLocal::get("paycard_cvv2"); $validResponse = $xml->isValid() ? 1 : 0; $statusMsg = $xml->get("fdggwsapi:TransactionResult"); $responseCode = 4; switch (strtoupper($statusMsg)) { case 'APPROVED': $responseCode = 1; break; case 'DECLINED': case 'FRAUD': $responseCode = 2; break; case 'FAILED': case 'DUPLICATE': $responseCode = 0; break; } $response->setResponseCode($responseCode); // aren't two separate codes from goemerchant $resultCode = $responseCode; $response->setResultCode($resultCode); $resultMsg = $statusMsg; // already gathered above $response->setResultMsg($resultMsg); $xTransID = $xml->get("fdggwsapi:ProcessorReferenceNumber"); $response->setTransactionID($xTransID); $apprNumber = $xml->get("fdggwsapi:ApprovalCode"); $response->setApprovalNum($apprNumber); // valid credit transactions don't have an approval number $response->setValid(0); try { $response->saveResponse(); } catch (Exception $ex) { } if ($authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200) { TransRecord::addcomment(""); if ($authResult['curlHTTP'] == '0') { CoreLocal::set("boxMsg", "No response from processor<br />\n The transaction did not go through"); return PaycardLib::PAYCARD_ERR_PROC; } return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); } switch ($responseCode) { case 1: // APPROVED return PaycardLib::PAYCARD_ERR_OK; case 2: // DECLINED CoreLocal::set("boxMsg", 'Card Declined'); break; case 0: // ERROR $texts = $xml->get_first("fdggwsapi:ProcessorResponseMessage"); CoreLocal::set("boxMsg", "Error: {$texts}"); break; default: CoreLocal::set("boxMsg", "An unknown error occurred<br />at the gateway"); } return PaycardLib::PAYCARD_ERR_PROC; }
function handleResponseAuth($authResult) { $xml = new xmlData($authResult['response']); $request = $this->last_request; $this->last_paycard_transaction_id = $request->last_paycard_transaction_id; $response = new PaycardResponse($request, $authResult); $validResponse = $xml->isValid() ? 1 : 0; $responseCode = $xml->get("RESPONSECODE"); if ($responseCode === false) { $validResponse = -3; } $response->setResponseCode($responseCode); $resultCode = $xml->get_first("CODE"); $response->setResultCode($resultCode); $resultMsg = $xml->get_first("DESCRIPTION"); $response->setResultMsg($resultMsg); $xTransID = $xml->get("TRANSID"); $response->setTransactionID($xTransID); if ($xTransID === false) { $validResponse = -3; } $apprNumber = $xml->get("AUTHCODE"); $response->setApprovalNum($apprNumber); if ($apprNumber === false) { $validResponse = -3; } $response->setValid($validResponse); try { $response->saveResponse(); } catch (Exception $ex) { } if ($authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200) { if ($authResult['curlHTTP'] == '0') { CoreLocal::set("boxMsg", "No response from processor<br />\n The transaction did not go through"); return PaycardLib::PAYCARD_ERR_PROC; } return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); } switch ($xml->get("RESPONSECODE")) { case 1: // APPROVED return PaycardLib::PAYCARD_ERR_OK; case 2: // DECLINED CoreLocal::set("boxMsg", "Transaction declined"); if ($xml->get_first("ERRORCODE") == 4) { CoreLocal::set("boxMsg", CoreLocal::get("boxMsg") . "<br />Pick up card)"); } break; case 3: // ERROR CoreLocal::set("boxMsg", ""); $codes = $xml->get("ERRORCODE"); $texts = $xml->get("ERRORTEXT"); if (!is_array($codes)) { CoreLocal::set("boxMsg", "EC{$codes}: {$texts}"); } else { for ($i = 0; $i < count($codes); $i++) { CoreLocal::set("boxMsg", CoreLocal::get("boxMsg") . "EC" . $codes[$i] . ": " . $texts[$i]); if ($i != count($codes) - 1) { CoreLocal::set("boxMsg", CoreLocal::get("boxMsg") . "<br />"); } } } break; default: CoreLocal::set("boxMsg", "An unknown error occurred<br />at the gateway"); } return PaycardLib::PAYCARD_ERROR_PROC; }
/** 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; }