class.linkpoint_api.php

来自「Zen Cart是真正的电子商务艺术」· PHP 代码 · 共 815 行 · 第 1/2 页

PHP
815
字号
<?php
/**
 * @package linkpoint_api_payment_module
 * @copyright Copyright 2003 LinkPoint International, Inc. All Rights Reserved.
 * @version (within Zen Cart SVN) $Id: class.linkpoint_api.php 7279 2007-10-24 21:48:38Z drbyte $
 */
/* lphp.php  LINKPOINT PHP MODULE */

/* A php interlocutor CLASS for
LinkPoint: LINKPOINT LSGS API using
libcurl, liblphp.so and liblpssl.so
v3.0.005  20 Aug. 2003  smoffet */

# Copyright 2003 LinkPoint International, Inc. All Rights Reserved.
#
# This software is the proprietary information of LinkPoint International, Inc.
# Use is subject to license terms.


	### YOU REALLY DO NOT NEED TO EDIT THIS FILE! ###


class lphp
{
	var $debugging;

	###########################################
	#
	#	F U N C T I O N    p r o c e s s ( )
	#
	#	process a hash table or XML string
	#	using LIBLPHP.SO and LIBLPSSL.SO
	#
	###########################################

	function process($data)
	{
		$using_xml = 0;
		$webspace = 1;

		if (isset($data["webspace"]))
		{
			if ($data["webspace"] == "false") // if explicitly set to false, don't use html output
				$webspace = 0;
		}

		if ( isset($data["debugging"]) || isset($data["debug"]) )
		{
			if ($data["debugging"] == "true" || $data["debug"] == "true"  )
			{
				$this->debugging = 1;

				# print out incoming hash
				if ($webspace)	// use html-friendly output
				{
					echo "at process, incoming data: <br>";

					while (list($key, $value) = each($data))
						 echo htmlspecialchars($key) . " = " . htmlspecialchars($value) . "<BR>\n";
				}
				else      // don't use html output
				{
					echo "at process, incoming data: \n";

					while (list($key, $value) = each($data))
						echo "$key = $value\n";
				}

				reset($data);
			}
		}

		if (isset($data["xml"])) // if XML string is passed in, we'll use it
		{
			$using_xml = 1;
			$xml = $data["xml"];
		}
		else
		{
			//  otherwise convert incoming hash to XML string
			$xml = $this->buildXML($data);
		}

		// then set up transaction variables
		$key	= $data["keyfile"];
		$host	= $data["host"];
    $port	= $data["port"];


		# FOR PERFORMANCE, Use the 'extensions' statement in your php.ini to load
		# this library at PHP startup, then comment out the next seven lines

		// load library
		if (!extension_loaded('liblphp'))
		{
			if (!dl('liblphp.so'))
			{
				exit("cannot load liblphp.so, bye\n");
			}
		}

		if ($this->debugging)
		{
			if ($webspace)
				echo "<br>sending xml string:<br>" . htmlspecialchars($xml) . "<br><br>";
			else
				echo "\nsending xml string:\n$xml\n\n";
		}

		// send transaction to LSGS
		$retstg = send_stg($xml, $key, $host, $port);


		if (strlen($retstg) < 4)
			exit ("cannot connect to lsgs, exiting");

		if ($this->debugging)
		{
			if ($this->webspace)	// we're web space
				echo "<br>server responds:<br>" . htmlspecialchars($retstg) . "<br><br>";
			else						// not html output
				echo "\nserver responds:\n $retstg\n\n";
		}

		if ($using_xml != 1)
		{
			// convert xml response back to hash
			$retarr = $this->decodeXML($retstg);

			// and send it back to caller
			return ($retarr);
		}
		else
		{
			// send server response back
			return $retstg;
		}
	}


	#####################################################
	#
	#	F U N C T I O N    c u r l _ p r o c e s s ( )
	#
	#	process hash table or xml string table using
	#	curl, either with PHP built-in curl methods
	#	or binary executable curl
	#
	#####################################################

	function curl_process($data)
	{
		$using_xml = 0;
		$webspace = 1;

		if (isset($data["webspace"]))
		{
			if ($data["webspace"] == "false") // if explicitly set to false, don't use html output
				$webspace = 0;
		}

		if (isset($data["debugging"]) || isset($data["debug"]) )
		{
			if ($data["debugging"] == "true" || $data["debug"] == "true" )
			{
				$this->debugging = 1;

				# print out incoming hash
				if ($webspace)	// use html-friendly output
				{
					echo "at curl_process, incoming data: <br>";

					while (list($key, $value) = each($data))
						 echo htmlspecialchars($key) . " = " . htmlspecialchars($value) . "<BR>\n";
				}
				else      // don't use html output
				{
					echo "at curl_process, incoming data: \n";
					$this->sendData = "\nat curl_process, incoming data: \n";

					while (list($key, $value) = each($data)) {
						echo "$key = $value\n";
						if ($key != 'cardnumber' && $key != 'cvmvalue')	$this->sendData .= "$key = $value\n";
					}
				}

				reset($data);
			}
		}

// for logging purposes:
		$this->sendData = "";
		while (list($key, $value) = each($data)) {
			if ($key != 'cardnumber' && $key != 'cvmvalue')	$this->sendData .= "$key = " . (is_array($value) ? print_r($value, true) : $value) . "\n";
			if ($key == 'cardnumber' || $key == 'cvmvalue')	$this->sendData .= "$key = ******\n";
		}

		if (isset($data["xml"])) // if XML string is passed in, we'll use it
		{
			$using_xml = 1;
			$xml = $data["xml"];
		}
		else
		{
			// otherwise convert incoming hash to XML string
			$xml = $this->buildXML($data);
		}

		if ($this->debugging)
		{
			if ($webspace)
				echo "<br>sending xml string:<br>" . htmlspecialchars($xml) . "<br><br>";
			else
				echo "\nsending xml string:\n$xml\n\n";
				$this->xmlString .= "\nsending xml string:\n$xml\n\n";
		}
		$this->xmlString .= "\nsending xml string:\n$xml\n\n";

		// set up transaction variables
		$key = $data["keyfile"];
		$port = $data["port"];
		$host = "https://".$data["host"].":".$port."/LSGSXML";


		if (isset($data["cbin"])) //using BINARY curl methods
		{
			if ($data["cbin"] == "true")
			{
				if (isset($data["cpath"]))
					$cpath = $data["cpath"];

				else // curl path has not been set, try to find curl binary
				{
					if (getenv("OS") == "Windows_NT")
						$cpath = "c:\\curl\\curl.exe";
					else
						$cpath = "/usr/bin/curl";
				}

				// look for $cargs variable, otherwise use default curl arguments
				if (isset($data["cargs"]))
					$args = $data["cargs"];
				else
					$args = "-m 300 -s -S";		// default curl args; 5 min. timeout


				# TRANSACT #

				if (getenv("OS") == "Windows_NT")
				{
					if ($this->debugging)
						$result = exec ("$cpath -v -d \"$xml\" -E $key  -k $host", $retarr, $retnum);
					else
						$result = exec ("$cpath -d \"$xml\" -E $key  -k $host", $retarr, $retnum);
				}

				else	//*nix string
				{
					if ($this->debugging)
          $result = exec ("'$cpath' $args -v -k -E '$key' -d '$xml' '$host'", $retarr, $retnum);
					else
          $result = exec ("'$cpath' $args -v -k -E '$key' -d '$xml' '$host'", $retarr, $retnum);
				}

				# EVALUATE RESPONSE #

				if (strlen($result) < 2)    // no response
				{
					$result = "<r_approved>FAILURE</r_approved><r_error>Could not connect.</r_error>";
					return $result;
				}

				if ($this->debugging)
				{
					if ($this->webspace)
						echo "<br>server responds:<br>" . htmlspecialchars($result) . "<br><br>";
					else						// non html output
						echo "\nserver responds:\n $result\n\n";
				}
						$this->serverResponse .= "\nserver responds:\n $result\n\n";

				if ($using_xml == 1)
				{
					// return xml string straight from server
					return ($result);
				}
				else
				{
					// convert xml response back to hash
					$retarr = $this->decodeXML($result);

					// and send it back to caller. Done.
					return ($retarr);
				}
			}
		}

		else	// using BUILT-IN PHP curl methods
		{
			$ch = curl_init ();
			curl_setopt ($ch, CURLOPT_URL,$host);
			curl_setopt ($ch, CURLOPT_POST, 1);
			curl_setopt ($ch, CURLOPT_POSTFIELDS, $xml);
			curl_setopt ($ch, CURLOPT_SSLCERT, $key);
      curl_setopt ($ch, CURLOPT_CAINFO, $key);
      curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, false);
      curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt ($ch, CURLOPT_SSLVERSION, 3);
			curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);


      if (CURL_PROXY_REQUIRED == 'True') {
        $proxy_tunnel_flag = (defined('CURL_PROXY_TUNNEL_FLAG') && strtoupper(CURL_PROXY_TUNNEL_FLAG) == 'FALSE') ? false : true;
        curl_setopt ($ch, CURLOPT_HTTPPROXYTUNNEL, $proxy_tunnel_flag);
        curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
        curl_setopt ($ch, CURLOPT_PROXY, CURL_PROXY_SERVER_DETAILS);
      }

			if ($this->debugging)
				curl_setopt ($ch, CURLOPT_VERBOSE, 1);

			#  use curl to send the xml SSL string
			$result = curl_exec ($ch);
      $this->commInfo = @curl_getinfo($ch);
      if ($this->debugging)
      {
        if ($webspace)	// html-friendly output
        echo "<br>server responds:<br>" . htmlspecialchars(curl_error($ch)). ' <br>ErrNo#: ' . curl_errno($ch) . "<br><br>";
        else
        echo "\nserver responds:\n". curl_error($ch). " \nErrNo:" . curl_errno($ch)."\n\n";
      }
			$this->commError = (curl_errno($ch) != 0 ? "Communication Result: " . curl_errno($ch) . ' - ' . curl_error($ch) : '');
			curl_close($ch);
			if (strlen($result) < 2)    # no response
			{
				$result = "<r_approved>FAILURE</r_approved><r_error>Could not connect.</r_error>";
      if ($this->debugging)
      {
        if ($webspace)	// html-friendly output
        echo "<br>server responds:<br>" . htmlspecialchars($result) . "<br><br>";
        else
        echo "\nserver responds:\n $result\n\n";
				$this->serverResponse .= "\nCould Not Connect:\n $result\n\n";
      }
				return $result;
			}

			if ($this->debugging)
			{
				if ($webspace)	// html-friendly output
					echo "<br>server responds:<br>" . htmlspecialchars($result) . "<br><br>";
				else
					echo "\nserver responds:\n $result\n\n";
					$this->serverResponse .= "\nserver responds:\n $result\n\n";
			}

			if ($using_xml)
			{
				# send xml response back
				return $result;
			}
			else
			{
				#convert xml response to hash
				$retarr = $this->decodeXML($result);

				# and send it back
				return ($retarr);
			}
		}
	}


	#############################################
	#
	#	F U N C T I O N   d e c o d e X M L ( )
	#
	#	converts the LSGS response xml string
	#	to a hash of name-value pairs
	#
	#############################################

	function decodeXML($xmlstg)
	{
		preg_match_all ("/<(.*?)>(.*?)\</", $xmlstg, $out, PREG_SET_ORDER);

		$n = 0;
		while (isset($out[$n]))
		{
			$retarr[$out[$n][1]] = strip_tags($out[$n][0]);
			$n++;
		}

		return $retarr;
	}


	############################################
	#
	#	F U N C T I O N    b u i l d X M L ( )
	#
	#	converts a hash of name-value pairs
	#	to the correct XML format for LSGS
	#
	############################################

	function buildXML($pdata)
	{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?