181 lines
5.3 KiB
PHP
Executable File
181 lines
5.3 KiB
PHP
Executable File
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
|
/**
|
|
* Angell EYE PayPal PayFlow CodeIgniter Library
|
|
* An open source PHP library written to easily work with PayPal's PayFlow API's
|
|
*
|
|
* Copyright © 2016 Andrew K. Angell
|
|
* Email: andrew@angelleye.com
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
*
|
|
* @package Angell_EYE_PayPal_PayFlow_Class_Library
|
|
* @author Andrew K. Angell
|
|
* @copyright Copyright © 2016 Angell EYE, LLC
|
|
* @link http://www.angelleye.com
|
|
* @since Version 3.0.0
|
|
* @updated 01.29.2016
|
|
* @filesource
|
|
*/
|
|
|
|
require_once('Paypal_pro.php');
|
|
class PayPal_PayFlow extends PayPal_Pro
|
|
{
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @access public
|
|
* @param array config preferences
|
|
* @return void
|
|
*/
|
|
function __construct($DataArray)
|
|
{
|
|
parent::__construct($DataArray);
|
|
|
|
$this->APIVendor = isset($DataArray['APIVendor']) ? $DataArray['APIVendor'] : '';
|
|
$this->APIPartner = isset($DataArray['APIPartner']) ? $DataArray['APIPartner'] : '';
|
|
$this->Verbosity = isset($DataArray['Verbosity']) ? $DataArray['Verbosity'] : 'HIGH';
|
|
|
|
if($this->Sandbox)
|
|
{
|
|
$this->APIEndPoint = 'https://pilot-payflowpro.paypal.com';
|
|
}
|
|
else
|
|
{
|
|
$this->APIEndPoint = 'https://payflowpro.paypal.com';
|
|
}
|
|
|
|
$this->NVPCredentials = 'BUTTONSOURCE['.strlen($this->APIButtonSource).']='.$this->APIButtonSource.'&VERBOSITY['.strlen($this->Verbosity).']='.$this->Verbosity.'&USER['.strlen($this->APIUsername).']='.$this->APIUsername.'&VENDOR['.strlen($this->APIVendor).']='.$this->APIVendor.'&PARTNER['.strlen($this->APIPartner).']='.$this->APIPartner.'&PWD['.strlen($this->APIPassword).']='.$this->APIPassword;
|
|
|
|
$this->TransactionStateCodes = array(
|
|
'1' => 'Error',
|
|
'6' => 'Settlement Pending',
|
|
'7' => 'Settlement in Progress',
|
|
'8' => 'Settlement Completed Successfully',
|
|
'11' => 'Settlement Failed',
|
|
'14' => 'Settlement Incomplete'
|
|
);
|
|
}
|
|
|
|
/*
|
|
* GetTransactionStateCodeMessage
|
|
*
|
|
* @access public
|
|
* @param number
|
|
* @return string
|
|
*/
|
|
function GetTransactionStateCodeMessage($Code)
|
|
{
|
|
return $this -> TransactionStateCodes[$Code];
|
|
}
|
|
|
|
/*
|
|
* CURLRequest
|
|
*
|
|
* @access public
|
|
* @param string Request
|
|
* @return string
|
|
*/
|
|
function CURLRequest($Request = "", $APIName = "", $APIOperation = "")
|
|
{
|
|
|
|
$unique_id = date('ymd-H').rand(1000,9999);
|
|
|
|
$headers[] = "Content-Type: text/namevalue"; //or text/xml if using XMLPay.
|
|
$headers[] = "Content-Length : " . strlen ($Request); // Length of data to be passed
|
|
$headers[] = "X-VPS-Timeout: 45";
|
|
$headers[] = "X-VPS-Request-ID:" . $unique_id;
|
|
|
|
$curl = curl_init();
|
|
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($curl, CURLOPT_HEADER, 1);
|
|
curl_setopt($curl, CURLOPT_VERBOSE, 1);
|
|
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);
|
|
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
|
|
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
curl_setopt($curl, CURLOPT_FORBID_REUSE, true);
|
|
curl_setopt($curl, CURLOPT_TIMEOUT, 90);
|
|
curl_setopt($curl, CURLOPT_URL, $this->APIEndPoint);
|
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($curl, CURLOPT_POST, 1);
|
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $Request);
|
|
|
|
// Try to submit the transaction up to 3 times with 5 second delay. This can be used
|
|
// in case of network issues. The idea here is since you are posting via HTTPS there
|
|
// could be general network issues, so try a few times before you tell customer there
|
|
// is an issue.
|
|
$i=1;
|
|
while ($i++ <= 3)
|
|
{
|
|
$Response = curl_exec($curl);
|
|
$headers = curl_getinfo($curl);
|
|
|
|
if ($headers['http_code'] != 200) {
|
|
sleep(5); // Let's wait 5 seconds to see if its a temporary network issue.
|
|
}
|
|
else if ($headers['http_code'] == 200)
|
|
{
|
|
// we got a good response, drop out of loop.
|
|
break;
|
|
}
|
|
}
|
|
|
|
curl_close($curl);
|
|
|
|
return $Response;
|
|
}
|
|
|
|
|
|
/**
|
|
* Convert an NVP string to an array with URL decoded values
|
|
*
|
|
* @access public
|
|
* @param string NVP string
|
|
* @return array
|
|
*/
|
|
function NVPToArray($NVPString)
|
|
{
|
|
$proArray = array();
|
|
parse_str($NVPString,$proArray);
|
|
return $proArray;
|
|
}
|
|
|
|
/*
|
|
* ProcessTransaction
|
|
*
|
|
* @access public
|
|
* @param array request parameters
|
|
* @return array
|
|
*/
|
|
function ProcessTransaction($DataArray)
|
|
{
|
|
$NVPRequest = $this->NVPCredentials;
|
|
|
|
foreach($DataArray as $DataArrayVar => $DataArrayVal)
|
|
{
|
|
if($DataArrayVal != '')
|
|
{
|
|
$NVPRequest .= '&'.strtoupper($DataArrayVar).'['.strlen($DataArrayVal).']='.$DataArrayVal;
|
|
}
|
|
}
|
|
|
|
$NVPResponse = $this->CURLRequest($NVPRequest);
|
|
$NVPResponse = strstr($NVPResponse,"RESULT");
|
|
$NVPResponseArray = $this->NVPToArray($NVPResponse);
|
|
|
|
$NVPResponseArray['RAWREQUEST'] = $NVPRequest;
|
|
$NVPResponseArray['RAWRESPONSE'] = $NVPResponse;
|
|
|
|
return $NVPResponseArray;
|
|
}
|
|
} |