コード例 #1
0
 /**
  * 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);
     }
 }
コード例 #2
0
ファイル: PaymentExpress.php プロジェクト: kidaa30/yes
 /**
  * Main transaction function.
  *
  * @param array $params
  *   Name value pair of contribution data.
  *
  * @param $component
  *
  * @return void
  */
 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);
     } elseif ($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') {
         $merchantRef = substr($params['contactID'] . "-" . $params['contributionID'] . " " . substr($params['description'], 27, 20), 0, 24);
         $privateData .= ",f={$params['participantID']},g={$params['eventID']}";
     } elseif ($component == 'contribute') {
         $membershipID = CRM_Utils_Array::value('membershipID', $params);
         if ($membershipID) {
             $privateData .= ",e={$membershipID}";
         }
         $merchantRef = substr($params['contactID'] . "-" . $params['contributionID'] . " " . substr($params['description'], 20, 20), 0, 24);
     }
     $dpsParams = array('AmountInput' => str_replace(",", "", number_format($params['amount'], 2)), 'CurrencyInput' => $params['currencyID'], 'MerchantReference' => $merchantRef, 'TxnData1' => $params['qfKey'], 'TxnData2' => $privateData, 'TxnData3' => $component . "," . $this->_paymentProcessor['id'], 'TxnType' => 'Purchase', 'TxnId' => '', 'UrlFail' => $url, 'UrlSuccess' => $url);
     // Allow further manipulation of params via custom hooks
     CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $dpsParams);
     /*
      *  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
          */
         $dpsParams['PxPayUserId'] = $this->_paymentProcessor['user_name'];
         $dpsParams['PxPayKey'] = $this->_paymentProcessor['password'];
         // Build a valid XML string to pass to DPS
         $generateRequest = CRM_Core_Payment_PaymentExpressUtils::_valueXml($dpsParams);
         $generateRequest = CRM_Core_Payment_PaymentExpressUtils::_valueXml('GenerateRequest', $generateRequest);
         // Get the special validated URL back from DPS by sending them the XML we've generated
         $curl = CRM_Core_Payment_PaymentExpressUtils::_initCURL($generateRequest, $this->_paymentProcessor['url_site']);
         $success = FALSE;
         if ($response = curl_exec($curl)) {
             curl_close($curl);
             $valid = CRM_Core_Payment_PaymentExpressUtils::_xmlAttribute($response, 'valid');
             if (1 == $valid) {
                 // the request was validated, so we'll get the URL and redirect to it
                 $uri = CRM_Core_Payment_PaymentExpressUtils::_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';
         // URL
         $PxAccess_Url = $this->_paymentProcessor['url_site'];
         // User ID
         $PxAccess_Userid = $this->_paymentProcessor['user_name'];
         // Your DES Key from DPS
         $PxAccess_Key = $this->_paymentProcessor['password'];
         // Your MAC key from DPS
         $Mac_Key = $this->_paymentProcessor['signature'];
         $pxaccess = new PxAccess($PxAccess_Url, $PxAccess_Userid, $PxAccess_Key, $Mac_Key);
         $request = new PxPayRequest();
         $request->setAmountInput($dpsParams['AmountInput']);
         $request->setTxnData1($dpsParams['TxnData1']);
         $request->setTxnData2($dpsParams['TxnData2']);
         $request->setTxnData3($dpsParams['TxnData3']);
         $request->setTxnType($dpsParams['TxnType']);
         $request->setInputCurrency($dpsParams['InputCurrency']);
         $request->setMerchantReference($dpsParams['MerchantReference']);
         $request->setUrlFail($dpsParams['UrlFail']);
         $request->setUrlSuccess($dpsParams['UrlSuccess']);
         $request_string = $pxaccess->makeRequest($request);
         CRM_Utils_System::redirect($request_string);
     }
 }