添加后台代理代码

This commit is contained in:
2026-03-15 01:27:05 +08:00
parent 11f9ac4dc1
commit ea08c9366a
5254 changed files with 721042 additions and 0 deletions

View File

@@ -0,0 +1,206 @@
<?php
/* *
* 支付宝接口公用函数
* 详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件
* 版本3.3
* 日期2012-07-19
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param array $para 需要拼接的数组
* @return string 拼接完成以后的字符串
*/
function createLinkstring($para)
{
$arg = "";
while (list ($key, $val) = each($para))
{
$arg .= $key . "=" . $val . "&";
}
//去掉最后一个&字符
$arg = substr($arg, 0, count($arg) - 2);
//如果存在转义字符,那么去掉转义
if (get_magic_quotes_gpc())
{
$arg = stripslashes($arg);
}
return $arg;
}
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串并对字符串做urlencode编码
* @param array $para 需要拼接的数组
* @return string 拼接完成以后的字符串
*/
function createLinkstringUrlencode($para)
{
$arg = "";
while (list ($key, $val) = each($para))
{
$arg .= $key . "=" . urlencode($val) . "&";
}
//去掉最后一个&字符
$arg = substr($arg, 0, count($arg) - 2);
//如果存在转义字符,那么去掉转义
if (get_magic_quotes_gpc())
{
$arg = stripslashes($arg);
}
return $arg;
}
/**
* 除去数组中的空值和签名参数
* @param array $para 签名参数组
* @return array 去掉空值与签名参数后的新签名参数组
*/
function paraFilter($para)
{
$para_filter = array();
while (list ($key, $val) = each($para))
{
if ($key == "sign" || $key == "sign_type" || $val == "")
continue;
else
$para_filter[$key] = $para[$key];
}
return $para_filter;
}
/**
* 对数组排序
* @param array $para 排序前的数组
* @return array 排序后的数组
*/
function argSort($para)
{
ksort($para);
reset($para);
return $para;
}
/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* 注意服务器需要开通fopen配置
* @param string $word 要写入日志里的文本内容 默认值:空值
*/
function logResult($word = '')
{
$fp = fopen("log.txt", "a");
flock($fp, LOCK_EX);
fwrite($fp, "执行日期:" . strftime("%Y%m%d%H%M%S", time()) . "\n" . $word . "\n");
flock($fp, LOCK_UN);
fclose($fp);
}
/**
* 远程获取数据POST模式
* 注意:
* 1.使用Crul需要修改服务器中php.ini文件的设置找到php_curl.dll去掉前面的";"就行了
* 2.文件夹中cacert.pem是SSL证书请保证其路径有效目前默认路径是getcwd().'\\cacert.pem'
* @param string $url 指定URL完整路径地址
* @param string $cacert_url 指定当前工作目录绝对路径
* @param mixed $para 请求的数据
* @param string $input_charset 编码格式。默认值:空值
* @return mixed 远程输出的数据
*/
function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '')
{
if (trim($input_charset) != '')
{
$url = $url . "_input_charset=" . $input_charset;
}
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
curl_setopt($curl, CURLOPT_CAINFO, $cacert_url);//证书地址
curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
curl_setopt($curl, CURLOPT_POST, true); // post传输数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $para);// post传输数据
$responseText = curl_exec($curl);
//var_dump( curl_error($curl) );//如果执行curl过程中出现异常可打开此开关以便查看异常内容
curl_close($curl);
return $responseText;
}
/**
* 远程获取数据GET模式
* 注意:
* 1.使用Crul需要修改服务器中php.ini文件的设置找到php_curl.dll去掉前面的";"就行了
* 2.文件夹中cacert.pem是SSL证书请保证其路径有效目前默认路径是getcwd().'\\cacert.pem'
* @param string $url 指定URL完整路径地址
* @param string $cacert_url 指定当前工作目录绝对路径
* @return mixed 远程输出的数据
*/
function getHttpResponseGET($url, $cacert_url)
{
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
curl_setopt($curl, CURLOPT_CAINFO, $cacert_url);//证书地址
$responseText = curl_exec($curl);
//var_dump( curl_error($curl) );//如果执行curl过程中出现异常可打开此开关以便查看异常内容
curl_close($curl);
return $responseText;
}
/**
* 实现多种字符编码方式
* @param string $input 需要编码的字符串
* @param string $_output_charset 输出的编码格式
* @param string $_input_charset 输入的编码格式
* @return string 编码后的字符串
*/
function charsetEncode($input, $_output_charset, $_input_charset)
{
if (!isset($_output_charset))
$_output_charset = $_input_charset;
if ($_input_charset == $_output_charset || $input == null)
$output = $input;
elseif (function_exists("mb_convert_encoding"))
$output = mb_convert_encoding($input, $_output_charset, $_input_charset);
elseif (function_exists("iconv"))
$output = iconv($_input_charset, $_output_charset, $input);
else
die("sorry, you have no libs support for charset change.");
return $output;
}
/**
* 实现多种字符解码方式
* @param string $input 需要解码的字符串
* @param string $_output_charset 输出的解码格式
* @param string $_input_charset 输入的解码格式
* @return string 解码后的字符串
*/
function charsetDecode($input, $_input_charset, $_output_charset)
{
if (!isset($_input_charset))
$_input_charset = $_output_charset;
if ($_input_charset == $_output_charset || $input == null)
$output = $input;
elseif (function_exists("mb_convert_encoding"))
$output = mb_convert_encoding($input, $_output_charset, $_input_charset);
elseif (function_exists("iconv"))
$output = iconv($_input_charset, $_output_charset, $input);
else
die("sorry, you have no libs support for charset changes.");
return $output;
}

View File

@@ -0,0 +1,38 @@
<?php
/* *
* MD5
* 详细MD5加密
* 版本3.3
* 日期2012-07-19
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
/**
* 签名字符串
* @param string $prestr 需要签名的字符串
* @param string $key 私钥
* @return string 签名结果
*/
function md5Sign($prestr, $key)
{
$prestr = $prestr . $key;
return md5($prestr);
}
/**
* 验证签名
* @param string $prestr 需要签名的字符串
* @param string $sign 签名结果
* @param string $key 私钥
* @return 签名结果
*/
function md5Verify($prestr, $sign, $key)
{
$prestr = $prestr . $key;
$mysgin = md5($prestr);
return $mysgin == $sign ? true : false;
}

View File

@@ -0,0 +1,164 @@
<?php
/* *
* 类名AlipayNotify
* 功能:支付宝通知处理类
* 详细:处理支付宝各接口通知返回
* 版本3.2
* 日期2011-03-25
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考
*************************注意*************************
* 调试通知返回时可查看或改写log日志的写入TXT里的数据来检查通知返回是否正常
*/
require_once __DIR__ . '/alipay_core.function.php';
require_once __DIR__ . '/alipay_rsa.function.php';
class AlipayNotify
{
public $partner = ''; ///
public $sign_type = ''; /// 签名方式md5或rsa
public $md5_key = ''; /// md5签名key
public $rsa_private_key_path; /// rsa私钥文件全名
public $rsa_public_key_path; /// rsa公钥文件全名
public $alipay_public_key; /// alipay公钥文件全名
public $input_charset = 'UTF-8'; /// 字符集
public $cacert_file_path = __DIR__ . '/cacert.pem'; /// ca证书路径地址用于curl中ssl校验
public $transport = 'https'; /// 访问模式,根据自己的服务器是否支持ssl访问若支持请选择https若不支持请选择http
function __construct($config)
{
$class_name = get_class($this);
$Reflect = new ReflectionClass($this);
foreach ($config as $key => $value)
{
if ($Property = $Reflect->GetProperty($key))
{
if ($Property->IsPublic())
$Property->SetValue($this, $value);
elseif ($Property->IsPrivate())
throw new Exception('can not access private property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
elseif ($Property->IsProtected())
throw new Exception('can not access protected property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
else
throw new Exception('can not access unknown property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
$Property = null;
} else
throw new Exception('undefined property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
}
}
function AlipayNotify($config)
{
$this->__construct($config);
}
/**
*
* @return 验证结果
*/
function verifyNotify()
{
if (empty($_POST)) /// 判断POST来的数组是否为空
return false;
/// 生成签名结果
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
/// isSign的结果不是true与安全校验码、请求时的参数格式带自定义参数等、编码格式有关
return $isSign ? true : false;
}
/**
* 针对return_url验证消息是否是支付宝发出的合法消息
* @return 验证结果
*/
function verifyReturn()
{
if (empty($_GET)) //判断POST来的数组是否为空
return false;
//生成签名结果
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
//获取支付宝远程服务器ATN结果验证是否是支付宝发来的消息
$responseTxt = 'false';
if (!empty($_GET["notify_id"]))
{
$responseTxt = $this->getResponse($_GET["notify_id"]);
}
//写日志记录
//if ($isSign)
// $isSignStr = 'true';
//else
// $isSignStr = 'false';
//$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
//$log_text = $log_text.createLinkString($_GET);
//logResult($log_text);
//验证
//$responsetTxt的结果不是true与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
//isSign的结果不是true与安全校验码、请求时的参数格式带自定义参数等、编码格式有关
return (preg_match("/true$/i", $responseTxt) && $isSign) ? true : false;
}
/**
* 获取返回时的签名验证结果
* @param array $para_temp 通知返回来的参数数组
* @param string $sign 返回的签名结果
* @return 签名验证结果
*/
function getSignVeryfy($para_temp, $sign)
{
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = argSort($para_filter);
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);
switch (strtoupper(trim($this->sign_type)))
{
case 'RSA':
$isSgin = rsaVerify($prestr, trim($this->alipay_public_key), $sign);
break;
case 'MD5':
$isSgin = md5Verify($prestr, $sign, $this->md5_key);
break;
default :
$isSgin = false;
}
return $isSgin;
}
/**
* 获取远程服务器ATN结果,验证返回URL
* @param string $notify_id 通知校验ID
* @return 服务器ATN结果
* 验证结果集:
* invalid命令参数不对 出现这个错误请检测返回处理中partner和key是否为空
* true 返回正确信息
* false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
*/
function getResponse($notify_id)
{
$transport = strtolower(trim($this->transport));
$partner = trim($this->partner);
if ($transport == 'https')
$veryfy_url = $this->https_verify_url;
else
$veryfy_url = $this->http_verify_url;
$veryfy_url = "{$veryfy_url}partner={$partner}&notify_id={$notify_id}";
$responseTxt = getHttpResponseGET($veryfy_url, $this->cacert_file_path);
return $responseTxt;
}
}

View File

@@ -0,0 +1,68 @@
<?php
/* *
* 支付宝接口RSA函数
* 详细RSA签名、验签、解密
* 版本3.3
* 日期2012-07-23
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
/**
* RSA签名
* @param string $data 待签名数据
* @param string $private_key_path 商户私钥文件路径
* @return string 签名结果
*/
function rsaSign($data, $private_key_path)
{
$priKey = file_get_contents($private_key_path);
$res = openssl_get_privatekey($priKey);
openssl_sign($data, $sign, $res);
openssl_free_key($res);
//base64编码
$sign = base64_encode($sign);
return $sign;
}
/**
* RSA验签
* @param string $data 待签名数据
* @param string $ali_public_key_path 支付宝的公钥文件路径
* @param string $sign 要校对的的签名结果
* @return bool 验证结果
*/
function rsaVerify($data, $ali_public_key_path, $sign)
{
$pubKey = file_get_contents($ali_public_key_path);
$res = openssl_get_publickey($pubKey);
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
openssl_free_key($res);
return $result;
}
/**
* RSA解密
* @param string $content 需要解密的内容,密文
* @param string $private_key_path 商户私钥文件路径
* @return string 解密后内容,明文
*/
function rsaDecrypt($content, $private_key_path)
{
$priKey = file_get_contents($private_key_path);
$res = openssl_get_privatekey($priKey);
//用base64将内容还原成二进制
$content = base64_decode($content);
//把需要解密的内容按128位拆开解密
$result = '';
for ($i = 0; $i < strlen($content) / 128; $i++)
{
$data = substr($content, $i * 128, 128);
openssl_private_decrypt($data, $decrypt, $res);
$result .= $decrypt;
}
openssl_free_key($res);
return $result;
}

View File

@@ -0,0 +1,196 @@
<?php
/* *
* 类名AlipaySubmit
* 功能:支付宝各接口请求提交类
* 详细构造支付宝各接口表单HTML文本获取远程HTTP数据
* 版本3.3
* 日期2012-07-23
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
require_once __DIR__ . '/alipay_core.function.php';
require_once __DIR__ . '/alipay_rsa.function.php';
require_once __DIR__ . '/alipay_md5.function.php';
class AlipaySubmit
{
public $partner = ''; ///
public $sign_type = ''; /// 签名方式md5或rsa
public $md5_key = ''; /// md5签名key
public $rsa_private_key_path; /// rsa私钥文件全名
public $rsa_public_key_path; /// rsa公钥文件全名
public $alipay_public_key; /// alipay公钥文件全名
public $input_charset = 'UTF-8'; /// 字符集
public $cacert_file_path = __DIR__ . '/cacert.pem'; /// ca证书路径地址用于curl中ssl校验
public $transport = 'https'; /// 访问模式,根据自己的服务器是否支持ssl访问若支持请选择https若不支持请选择http
/** 支付宝网关地址(新) */
var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';
function __construct($config)
{
$class_name = get_class($this);
$Reflect = new ReflectionClass($this);
foreach ($config as $key => $value)
{
if ($Property = $Reflect->GetProperty($key))
{
if ($Property->IsPublic())
$Property->SetValue($this, $value);
elseif ($Property->IsPrivate())
throw new Exception('can not access private property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
elseif ($Property->IsProtected())
throw new Exception('can not access protected property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
else
throw new Exception('can not access unknown property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
$Property = null;
} else
throw new Exception('undefined property: ' . $class_name . '::' . $key . ' in ' . __FILE__ . ' on line ' . __LINE__);
}
}
function AlipaySubmit($config)
{
$this->__construct($config);
}
/**
* 生成签名结果
* @param array $para_sort 已排序要签名的数组
* @return string 签名结果字符串
*/
function buildRequestMysign($para_sort)
{
/// 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);
switch (strtoupper(trim($this->sign_type)))
{
case 'RSA':
$mysign = rsaSign($prestr, $this->rsa_private_key_path);
break;
case 'MD5':
$mysign = md5Sign($prestr, $this->md5_key);
break;
default :
$mysign = '';
}
return $mysign;
}
/**
* 生成要请求给支付宝的参数数组
* @param array $para_temp 请求前的参数数组
* @return array 要请求的参数数组
*/
function buildRequestPara($para_temp)
{
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = argSort($para_filter);
//生成签名结果
$mysign = $this->buildRequestMysign($para_sort);
//签名结果与签名方式加入请求提交参数组中
$para_sort['sign'] = $mysign;
$para_sort['sign_type'] = strtoupper(trim($this->sign_type));
return $para_sort;
}
/**
* 生成要请求给支付宝的参数数组
* @param array $para_temp 请求前的参数数组
* @return 要请求的参数数组字符串
*/
function buildRequestParaToString($para_temp)
{
/// 待请求参数数组
$para = $this->buildRequestPara($para_temp);
/// 把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串并对字符串做urlencode编码
$request_data = createLinkstringUrlencode($para);
return $request_data;
}
/**
* 建立请求以表单HTML形式构造默认
* @param array $para_temp 请求参数数组
* @param string $method 提交方式。两个值可选post、get
* @param string $button_name 确认按钮显示文字
* @return string 提交表单HTML文本
*/
function buildRequestForm($para_temp, $method, $button_name)
{
/// 待请求参数数组
$para = $this->buildRequestPara($para_temp);
$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='" . $this->alipay_gateway_new . "_input_charset=" . trim(strtolower($this->input_charset)) . "' method='" . $method . "'>";
while (list ($key, $val) = each($para))
{
$sHtml .= "<input type='hidden' name='" . $key . "' value='" . $val . "'/>";
}
/// submit按钮控件请不要含有name属性
$sHtml = $sHtml . "<input type='submit' value='" . $button_name . "' style='display:none;'></form>";
$sHtml = $sHtml . "<script>document.forms['alipaysubmit'].submit();</script>";
return $sHtml;
}
/**
* 建立请求以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果
* @param array $para_temp 请求参数数组
* @return string 支付宝处理结果
*/
function buildRequestHttp($para_temp)
{
/// 待请求参数数组字符串
$request_data = $this->buildRequestPara($para_temp);
/// 远程获取数据
$sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->cacert_file_path, $request_data, trim(strtolower($this->input_charset)));
return $sResult;
}
/**
* 建立请求以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果带文件上传功能
* @param array $para_temp 请求参数数组
* @param string $file_para_name 文件类型的参数名
* @param string $file_name 文件完整绝对路径
* @return string 支付宝返回处理结果
*/
function buildRequestHttpInFile($para_temp, $file_para_name, $file_name)
{
/// 待请求参数数组
$para = $this->buildRequestPara($para_temp);
$para[$file_para_name] = "@".$file_name;
/// 远程获取数据
$sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->cacert_file_path, $para, trim(strtolower($this->input_charset)));
return $sResult;
}
/**
* 用于防钓鱼调用接口query_timestamp来获取时间戳的处理函数
* 注意该功能PHP5环境及以上支持因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
* return 时间戳字符串
*/
function query_timestamp()
{
$url = $this->alipay_gateway_new . "service=query_timestamp&partner=" . trim(strtolower($this->partner)) . "&_input_charset=" . trim(strtolower($this->input_charset));
$doc = new DOMDocument();
$doc->load($url);
$itemEncrypt_key = $doc->getElementsByTagName("encrypt_key");
$encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
return $encrypt_key;
}
}

File diff suppressed because it is too large Load Diff