function decrypt_dps_response() { $PxAccess_Url = get_option('access_url'); $PxAccess_Userid = get_option('access_userid'); $PxAccess_Key = get_option('access_key'); $Mac_Key = get_option('mac_key'); $pxaccess = new PxAccess($PxAccess_Url, $PxAccess_Userid, $PxAccess_Key, $Mac_Key); $curgateway = get_option('payment_gateway'); $_GET = array(); $params = explode('&', $_SERVER['QUERY_STRING']); foreach ($params as $pair) { list($key, $value) = explode('=', $pair); $_GET[urldecode($key)] = urldecode($value); } $enc_hex = $_GET['result']; if ($enc_hex != null) { $rsp = $pxaccess->getResponse($enc_hex); $siteurl = get_option('siteurl'); $total_weight = 0; if ($rsp->getResponseText() == 'APPROVED') { $sessionid = $rsp->getMerchantReference(); $purchase_log = new WPSC_Purchase_Log($sessionid, 'sessionid'); if (!$purchase_log->is_transaction_completed()) { $purchase_log->set('processed', WPSC_Purchase_Log::ACCEPTED_PAYMENT); $purchase_log->save(); } } } return $sessionid; }
function decrypt_dps_response() { global $wpdb; $PxAccess_Url = get_option('access_url'); $PxAccess_Userid = get_option('access_userid'); $PxAccess_Key = get_option('access_key'); $Mac_Key = get_option('mac_key'); $pxaccess = new PxAccess($PxAccess_Url, $PxAccess_Userid, $PxAccess_Key, $Mac_Key); $curgateway = get_option('payment_gateway'); $sessionid = $_GET['sessionid']; $enc_hex = $_GET["result"]; if ($enc_hex != null) { $rsp = $pxaccess->getResponse($enc_hex); $siteurl = get_option('siteurl'); $total_weight = 0; if ($rsp->ResponseText == 'APPROVED') { $sessionid = $rsp->MerchantReference; $processing_stage = $wpdb->get_var("SELECT `processed` FROM `" . WPSC_TABLE_PURCHASE_LOGS . "` WHERE `sessionid` = " . $sessionid . " LIMIT 1"); if ($processing_stage < 2) { $wpdb->query("UPDATE `" . WPSC_TABLE_PURCHASE_LOGS . "` SET `processed` = '2' WHERE `sessionid` = " . $sessionid . " LIMIT 1"); } } } return $sessionid; }
public function VerifyOrderPayment() { require_once "lib/pxaccess.php"; $pxaccess = new PxAccess('https://www.paymentexpress.com/pxpay/pxpay.aspx', $this->GetValue('userid'), $this->GetValue('key'), $this->GetValue('mackey')); $rsp = $pxaccess->getResponse($_REQUEST["result"]); if ($rsp->getStatusRequired() == "1" || $rsp->getSuccess() != 1) { $GLOBALS['ISC_CLASS_LOG']->LogSystemError(array('payment', $this->GetName()), GetLang($this->_languagePrefix . 'ErrorInvalid')); return false; } $AmountSettlement = $rsp->getAmountSettlement(); $TxnData1 = $rsp->getTxnData1(); $currencySettlement = $rsp->getCurrencySettlement(); $currency = GetDefaultCurrency(); if ($currencySettlement != $currency['currencycode']) { $GLOBALS['ISC_CLASS_LOG']->LogSystemError(array('payment', $this->GetName()), GetLang($this->_languagePrefix . 'CurrencyMismatch'), sprintf("Sent %s. Returned %s", $currency['currencycode'], $currencySettlement)); return false; } if ($AmountSettlement != $this->GetGatewayAmount()) { $GLOBALS['ISC_CLASS_LOG']->LogSystemError(array('payment', $this->GetName()), GetLang($this->_languagePrefix . 'PaymentMismatch'), sprintf("Sent %s. Returned %s", $this->GetGatewayAmount(), $AmountSettlement)); return false; } if ($TxnData1 != $this->GetCombinedOrderId()) { $GLOBALS['ISC_CLASS_LOG']->LogSystemError(array('payment', $this->GetName()), GetLang($this->_languagePrefix . 'InvalidOrder'), sprintf("Sent %s. Returned %s", $this->GetCombinedOrderId(), $TxnData1)); return false; } $updatedOrder = array('ordpayproviderid' => $rsp->getMerchantTxnId(), 'ordpaymentstatus' => 'captured'); $this->UpdateOrders($updatedOrder); $GLOBALS['ISC_CLASS_LOG']->LogSystemSuccess(array('payment', $this->GetName()), GetLang($this->_languagePrefix . 'Success')); $this->SetPaymentStatus(PAYMENT_STATUS_PAID); return true; }
} } else { if (!defined('BOOTSTRAP')) { die('Access denied'); } // This file is a SAMPLE showing redirect to Payments Page from PHP. //Inlcude PxAccess Objects include Registry::get('config.dir.payments') . 'dps_files/pxaccess.inc'; $PxAccess_Url = "https://sec.paymentexpress.com/pxpay/pxpay.aspx"; $PxAccess_Userid = $processor_data["processor_params"]["user_id"]; //Change to your user ID $PxAccess_Key = $processor_data["processor_params"]["key"]; //Your DES Key from DPS $Mac_Key = $processor_data["processor_params"]["mac_key"]; //Your MAC key from DPS $pxaccess = new PxAccess($PxAccess_Url, $PxAccess_Userid, $PxAccess_Key, $Mac_Key); $request = new PxPayRequest(); $script_url = fn_payment_url('current', 'dps_access.php'); $_order_id = $order_info['repaid'] ? $order_id . '_' . $order_info['repaid'] : $order_id; Tygh::$app['session']['dps_access']['order_id'] = $order_id; //Set up PxPayRequest Object $request->setAmountInput($order_info['total']); $request->setTxnData1(""); // whatever you want to appear $request->setTxnData2(""); // whatever you want to appear $request->setTxnData3(""); // whatever you want to appear $request->setTxnType("Purchase"); $request->setInputCurrency($processor_data["processor_params"]["currency"]); $request->setMerchantReference($_order_id);
/** * This method is handles the response that will be invoked by the * notification or request sent by the payment processor. * hex string from paymentexpress is passed to this function as hex string. Code based on googleIPN * mac_key is only passed if the processor is pxaccess as it is used for decryption * $dps_method is either pxaccess or pxpay */ public static function main($dps_method, $rawPostData, $dps_url, $dps_user, $dps_key, $mac_key) { $config = CRM_Core_Config::singleton(); define('RESPONSE_HANDLER_LOG_FILE', $config->uploadDir . 'CiviCRM.PaymentExpress.log'); //Setup the log file if (!($message_log = fopen(RESPONSE_HANDLER_LOG_FILE, "a"))) { error_func("Cannot open " . RESPONSE_HANDLER_LOG_FILE . " file.\n", 0); exit(1); } if ($dps_method == "pxpay") { $processResponse = CRM_Core_Payment_PaymentExpressUtils::_valueXml(array('PxPayUserId' => $dps_user, 'PxPayKey' => $dps_key, 'Response' => $_GET['result'])); $processResponse = CRM_Core_Payment_PaymentExpressUtils::_valueXml('ProcessResponse', $processResponse); fwrite($message_log, sprintf("\n\r%s:- %s\n", date("D M j G:i:s T Y"), $processResponse)); // Send the XML-formatted validation request to DPS so that we can receive a decrypted XML response which contains the transaction results $curl = CRM_Core_Payment_PaymentExpressUtils::_initCURL($processResponse, $dps_url); fwrite($message_log, sprintf("\n\r%s:- %s\n", date("D M j G:i:s T Y"), $curl)); $success = FALSE; if ($response = curl_exec($curl)) { fwrite($message_log, sprintf("\n\r%s:- %s\n", date("D M j G:i:s T Y"), $response)); curl_close($curl); // Assign the returned XML values to variables $valid = CRM_Core_Payment_PaymentExpressUtils::_xmlAttribute($response, 'valid'); $success = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, 'Success'); $txnId = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, 'TxnId'); $responseText = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, 'ResponseText'); $authCode = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, 'AuthCode'); $DPStxnRef = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, 'DpsTxnRef'); $qfKey = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, "TxnData1"); $privateData = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, "TxnData2"); list($component, $paymentProcessorID, ) = explode(',', CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, "TxnData3")); $amount = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, "AmountSettlement"); $merchantReference = CRM_Core_Payment_PaymentExpressUtils::_xmlElement($response, "MerchantReference"); } else { // calling DPS failed CRM_Core_Error::fatal(ts('Unable to establish connection to the payment gateway to verify transaction response.')); exit; } } elseif ($dps_method == "pxaccess") { require_once 'PaymentExpress/pxaccess.inc.php'; global $pxaccess; $pxaccess = new PxAccess($dps_url, $dps_user, $dps_key, $mac_key); #getResponse method in PxAccess object returns PxPayResponse object #which encapsulates all the response data $rsp = $pxaccess->getResponse($rawPostData); $qfKey = $rsp->getTxnData1(); $privateData = $rsp->getTxnData2(); list($component, $paymentProcessorID) = explode(',', $rsp->getTxnData3()); $success = $rsp->getSuccess(); $authCode = $rsp->getAuthCode(); $DPStxnRef = $rsp->getDpsTxnRef(); $amount = $rsp->getAmountSettlement(); $MerchantReference = $rsp->getMerchantReference(); } $privateData = $privateData ? self::stringToArray($privateData) : ''; // Record the current count in array, before we start adding things (for later checks) $countPrivateData = count($privateData); // Private Data consists of : a=contactID, b=contributionID,c=contributionTypeID,d=invoiceID,e=membershipID,f=participantID,g=eventID $privateData['contactID'] = $privateData['a']; $privateData['contributionID'] = $privateData['b']; $privateData['contributionTypeID'] = $privateData['c']; $privateData['invoiceID'] = $privateData['d']; if ($component == "event") { $privateData['participantID'] = $privateData['f']; $privateData['eventID'] = $privateData['g']; } elseif ($component == "contribute") { if ($countPrivateData == 5) { $privateData["membershipID"] = $privateData['e']; } } $transactionReference = $authCode . "-" . $DPStxnRef; list($mode, $component, $duplicateTransaction) = self::getContext($privateData, $transactionReference); $mode = $mode ? 'test' : 'live'; $paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getPayment($paymentProcessorID, $mode); $ipn = self::singleton($mode, $component, $paymentProcessor); //Check status and take appropriate action if ($success == 1) { if ($duplicateTransaction == 0) { $ipn->newOrderNotify($success, $privateData, $component, $amount, $transactionReference); } if ($component == "event") { $finalURL = CRM_Utils_System::url('civicrm/event/register', "_qf_ThankYou_display=1&qfKey={$qfKey}", FALSE, NULL, FALSE); } elseif ($component == "contribute") { $finalURL = CRM_Utils_System::url('civicrm/contribute/transact', "_qf_ThankYou_display=1&qfKey={$qfKey}", FALSE, NULL, FALSE); } CRM_Utils_System::redirect($finalURL); } else { if ($component == "event") { $finalURL = CRM_Utils_System::url('civicrm/event/confirm', "reset=1&cc=fail&participantId={$privateData['participantID']}", FALSE, NULL, FALSE); } elseif ($component == "contribute") { $finalURL = CRM_Utils_System::url('civicrm/contribute/transact', "_qf_Main_display=1&cancel=1&qfKey={$qfKey}", FALSE, NULL, FALSE); } CRM_Utils_System::redirect($finalURL); } }
/** * Main transaction function * * @param array $params name value pair of contribution data * * @return void * @access public * */ function doTransferCheckout(&$params, $component) { $component = strtolower($component); $config = CRM_Core_Config::singleton(); if ($component != 'contribute' && $component != 'event') { CRM_Core_Error::fatal(ts('Component is invalid')); } $url = $config->userFrameworkResourceURL . "extern/pxIPN.php"; if ($component == 'event') { $cancelURL = CRM_Utils_System::url('civicrm/event/register', "_qf_Confirm_display=true&qfKey={$params['qfKey']}", false, null, false); } else { if ($component == 'contribute') { $cancelURL = CRM_Utils_System::url('civicrm/contribute/transact', "_qf_Confirm_display=true&qfKey={$params['qfKey']}", false, null, false); } } /* * Build the private data string to pass to DPS, which they will give back to us with the * * transaction result. We are building this as a comma-separated list so as to avoid long URLs. * * Parameters passed: a=contactID, b=contributionID,c=contributionTypeID,d=invoiceID,e=membershipID,f=participantID,g=eventID */ $privateData = "a={$params['contactID']},b={$params['contributionID']},c={$params['contributionTypeID']},d={$params['invoiceID']}"; if ($component == 'event') { $privateData .= ",f={$params['participantID']},g={$params['eventID']}"; $merchantRef = "event registration"; } elseif ($component == 'contribute') { $merchantRef = "Charitable Contribution"; $membershipID = CRM_Utils_Array::value('membershipID', $params); if ($membershipID) { $privateData .= ",e={$membershipID}"; } } // Allow further manipulation of params via custom hooks CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $privateData); /* * determine whether method is pxaccess or pxpay by whether signature (mac key) is defined */ if (empty($this->_paymentProcessor['signature'])) { /* * Processor is pxpay * * This contains the XML/Curl functions we'll need to generate the XML request */ require_once 'CRM/Core/Payment/PaymentExpressUtils.php'; // Build a valid XML string to pass to DPS $generateRequest = _valueXml(array('PxPayUserId' => $this->_paymentProcessor['user_name'], 'PxPayKey' => $this->_paymentProcessor['password'], 'AmountInput' => str_replace(",", "", number_format($params['amount'], 2)), 'CurrencyInput' => $params['currencyID'], 'MerchantReference' => $merchantRef, 'TxnData1' => $params['qfKey'], 'TxnData2' => $privateData, 'TxnData3' => $component, 'TxnType' => 'Purchase', 'TxnId' => '', 'UrlFail' => $url, 'UrlSuccess' => $url)); $generateRequest = _valueXml('GenerateRequest', $generateRequest); // Get the special validated URL back from DPS by sending them the XML we've generated $curl = _initCURL($generateRequest, $this->_paymentProcessor['url_site']); $success = false; if ($response = curl_exec($curl)) { curl_close($curl); $valid = _xmlAttribute($response, 'valid'); if (1 == $valid) { // the request was validated, so we'll get the URL and redirect to it $uri = _xmlElement($response, 'URI'); CRM_Utils_System::redirect($uri); } else { // redisplay confirmation page CRM_Utils_System::redirect($cancelURL); } } else { // calling DPS failed CRM_Core_Error::fatal(ts('Unable to establish connection to the payment gateway.')); } } else { $processortype = "pxaccess"; require_once 'PaymentExpress/pxaccess.inc.php'; $PxAccess_Url = $this->_paymentProcessor['url_site']; // URL $PxAccess_Userid = $this->_paymentProcessor['user_name']; // User ID $PxAccess_Key = $this->_paymentProcessor['password']; // Your DES Key from DPS $Mac_Key = $this->_paymentProcessor['signature']; // Your MAC key from DPS $pxaccess = new PxAccess($PxAccess_Url, $PxAccess_Userid, $PxAccess_Key, $Mac_Key); $request = new PxPayRequest(); $request->setAmountInput(number_format($params['amount'], 2)); $request->setTxnData1($params['qfKey']); $request->setTxnData2($privateData); $request->setTxnData3($component); $request->setTxnType("Purchase"); $request->setInputCurrency($params['currencyID']); $request->setMerchantReference($merchantRef); $request->setUrlFail($url); $request->setUrlSuccess($url); $request_string = $pxaccess->makeRequest($request); CRM_Utils_System::redirect($request_string); } }