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 + -
显示快捷键?