2020.02新版
This commit is contained in:
21
plugins/aliold/config.ini
Normal file
21
plugins/aliold/config.ini
Normal file
@@ -0,0 +1,21 @@
|
||||
[config]
|
||||
;支付插件英文名称,需和目录名称一致,不能有重复
|
||||
name = "aliold"
|
||||
|
||||
;支付插件显示名称
|
||||
showname = "支付宝旧版接口"
|
||||
|
||||
;支付插件作者
|
||||
author = "支付宝"
|
||||
|
||||
;支付插件作者链接
|
||||
link = "https://b.alipay.com/signing/productSetV2.htm"
|
||||
|
||||
;支付插件支持的支付方式,多种方式用英文,隔开,可选的有alipay,qqpay,wxpay,bank
|
||||
types = "alipay"
|
||||
|
||||
;支付插件要求传入的参数以及参数显示名称,可选的有appid,appkey,appsecret,appurl,appmchid
|
||||
inputs = "appid:合作者身份(PID),appkey:安全校验码(Key)"
|
||||
|
||||
;支付插件要求传入的支付方式参数
|
||||
select = "1:电脑网站支付,2:手机网站支付"
|
||||
44
plugins/aliold/inc/alipay.config.php
Normal file
44
plugins/aliold/inc/alipay.config.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/* *
|
||||
* 配置文件
|
||||
* 版本:3.3
|
||||
* 日期:2012-07-19
|
||||
* 说明:
|
||||
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
|
||||
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
|
||||
|
||||
* 提示:如何获取安全校验码和合作身份者id
|
||||
* 1.用您的签约支付宝账号登录支付宝网站(www.alipay.com)
|
||||
* 2.点击“商家服务”(https://b.alipay.com/order/myorder.htm)
|
||||
* 3.点击“查询合作者身份(pid)”、“查询安全校验码(key)”
|
||||
|
||||
* 安全校验码查看时,输入支付密码后,页面呈灰色的现象,怎么办?
|
||||
* 解决方法:
|
||||
* 1、检查浏览器配置,不让浏览器做弹框屏蔽设置
|
||||
* 2、更换浏览器或电脑,重新登录查询。
|
||||
*/
|
||||
|
||||
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
||||
//合作身份者id,以2088开头的16位纯数字
|
||||
$alipay_config['partner'] = $channel['appid'];
|
||||
|
||||
//安全检验码,以数字和字母组成的32位字符
|
||||
$alipay_config['key'] = $channel['appkey'];
|
||||
|
||||
|
||||
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
|
||||
|
||||
|
||||
//签名方式 不需修改
|
||||
$alipay_config['sign_type'] = strtoupper('MD5');
|
||||
|
||||
//字符编码格式 目前支持 gbk 或 utf-8
|
||||
$alipay_config['input_charset']= strtolower('utf-8');
|
||||
|
||||
//ca证书路径地址,用于curl中ssl校验
|
||||
//请保证cacert.pem文件在当前文件夹目录中
|
||||
$alipay_config['cacert'] = getcwd().'\\cacert.pem';
|
||||
|
||||
//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
|
||||
$alipay_config['transport'] = 'https';
|
||||
?>
|
||||
168
plugins/aliold/inc/alipay_core.function.php
Normal file
168
plugins/aliold/inc/alipay_core.function.php
Normal file
@@ -0,0 +1,168 @@
|
||||
<?php
|
||||
/* *
|
||||
* 支付宝接口公用函数
|
||||
* 详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件
|
||||
* 版本:3.3
|
||||
* 日期:2012-07-19
|
||||
* 说明:
|
||||
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
|
||||
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
|
||||
*/
|
||||
|
||||
/**
|
||||
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
|
||||
* @param $para 需要拼接的数组
|
||||
* return 拼接完成以后的字符串
|
||||
*/
|
||||
function createLinkstring($para) {
|
||||
$arg = "";
|
||||
foreach ($para as $key=>$val) {
|
||||
$arg.=$key."=".$val."&";
|
||||
}
|
||||
//去掉最后一个&字符
|
||||
$arg = substr($arg,0,-1);
|
||||
|
||||
return $arg;
|
||||
}
|
||||
/**
|
||||
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
|
||||
* @param $para 需要拼接的数组
|
||||
* return 拼接完成以后的字符串
|
||||
*/
|
||||
function createLinkstringUrlencode($para) {
|
||||
$arg = "";
|
||||
foreach ($para as $key=>$val) {
|
||||
$arg.=$key."=".urlencode($val)."&";
|
||||
}
|
||||
//去掉最后一个&字符
|
||||
$arg = substr($arg,0,-1);
|
||||
|
||||
return $arg;
|
||||
}
|
||||
/**
|
||||
* 除去数组中的空值和签名参数
|
||||
* @param $para 签名参数组
|
||||
* return 去掉空值与签名参数后的新签名参数组
|
||||
*/
|
||||
function paraFilter($para) {
|
||||
$para_filter = array();
|
||||
foreach ($para as $key=>$val) {
|
||||
if($key == "sign" || $key == "sign_type" || $val == "")continue;
|
||||
else $para_filter[$key] = $para[$key];
|
||||
}
|
||||
return $para_filter;
|
||||
}
|
||||
/**
|
||||
* 对数组排序
|
||||
* @param $para 排序前的数组
|
||||
* return 排序后的数组
|
||||
*/
|
||||
function argSort($para) {
|
||||
ksort($para);
|
||||
reset($para);
|
||||
return $para;
|
||||
}
|
||||
/**
|
||||
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
|
||||
* 注意:服务器需要开通fopen配置
|
||||
* @param $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 $url 指定URL完整路径地址
|
||||
* @param $cacert_url 指定当前工作目录绝对路径
|
||||
* @param $para 请求的数据
|
||||
* @param $input_charset 编码格式。默认值:空值
|
||||
* return 远程输出的数据
|
||||
*/
|
||||
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, false);//SSL证书认证
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);//严格认证
|
||||
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 $url 指定URL完整路径地址
|
||||
* @param $cacert_url 指定当前工作目录绝对路径
|
||||
* return 远程输出的数据
|
||||
*/
|
||||
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, false);//SSL证书认证
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);//严格认证
|
||||
$responseText = curl_exec($curl);
|
||||
//var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
|
||||
curl_close($curl);
|
||||
|
||||
return $responseText;
|
||||
}
|
||||
|
||||
/**
|
||||
* 实现多种字符编码方式
|
||||
* @param $input 需要编码的字符串
|
||||
* @param $_output_charset 输出的编码格式
|
||||
* @param $_input_charset 输入的编码格式
|
||||
* return 编码后的字符串
|
||||
*/
|
||||
function charsetEncode($input,$_output_charset ,$_input_charset) {
|
||||
$output = "";
|
||||
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 $input 需要解码的字符串
|
||||
* @param $_output_charset 输出的解码格式
|
||||
* @param $_input_charset 输入的解码格式
|
||||
* return 解码后的字符串
|
||||
*/
|
||||
function charsetDecode($input,$_input_charset ,$_output_charset) {
|
||||
$output = "";
|
||||
if(!isset($_input_charset) )$_input_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 changes.");
|
||||
return $output;
|
||||
}
|
||||
?>
|
||||
41
plugins/aliold/inc/alipay_md5.function.php
Normal file
41
plugins/aliold/inc/alipay_md5.function.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
/* *
|
||||
* MD5
|
||||
* 详细:MD5加密
|
||||
* 版本:3.3
|
||||
* 日期:2012-07-19
|
||||
* 说明:
|
||||
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
|
||||
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
|
||||
*/
|
||||
|
||||
/**
|
||||
* 签名字符串
|
||||
* @param $prestr 需要签名的字符串
|
||||
* @param $key 私钥
|
||||
* return 签名结果
|
||||
*/
|
||||
function md5Sign($prestr, $key) {
|
||||
$prestr = $prestr . $key;
|
||||
return md5($prestr);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证签名
|
||||
* @param $prestr 需要签名的字符串
|
||||
* @param $sign 签名结果
|
||||
* @param $key 私钥
|
||||
* return 签名结果
|
||||
*/
|
||||
function md5Verify($prestr, $sign, $key) {
|
||||
$prestr = $prestr . $key;
|
||||
$mysgin = md5($prestr);
|
||||
|
||||
if($mysgin == $sign) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
?>
|
||||
139
plugins/aliold/inc/alipay_notify.class.php
Normal file
139
plugins/aliold/inc/alipay_notify.class.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
/* *
|
||||
* 类名:AlipayNotify
|
||||
* 功能:支付宝通知处理类
|
||||
* 详细:处理支付宝各接口通知返回
|
||||
* 版本:3.2
|
||||
* 日期:2011-03-25
|
||||
* 说明:
|
||||
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
|
||||
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考
|
||||
|
||||
*************************注意*************************
|
||||
* 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
|
||||
*/
|
||||
|
||||
require_once(PAY_ROOT."inc/alipay_core.function.php");
|
||||
require_once(PAY_ROOT."inc/alipay_md5.function.php");
|
||||
|
||||
class AlipayNotify {
|
||||
/**
|
||||
* HTTPS形式消息验证地址
|
||||
*/
|
||||
var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
|
||||
/**
|
||||
* HTTP形式消息验证地址
|
||||
*/
|
||||
var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?';
|
||||
var $alipay_config;
|
||||
|
||||
function __construct($alipay_config){
|
||||
$this->alipay_config = $alipay_config;
|
||||
}
|
||||
function AlipayNotify($alipay_config) {
|
||||
$this->__construct($alipay_config);
|
||||
}
|
||||
/**
|
||||
* 针对notify_url验证消息是否是支付宝发出的合法消息
|
||||
* @return 验证结果
|
||||
*/
|
||||
function verifyNotify(){
|
||||
if(empty($_POST)) {//判断POST来的数组是否为空
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
//生成签名结果
|
||||
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
|
||||
//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
|
||||
$responseTxt = $this->getResponse($_POST["notify_id"]);
|
||||
|
||||
//验证
|
||||
//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
|
||||
//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
|
||||
if (preg_match("/true$/i",$responseTxt) && $isSign) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 针对return_url验证消息是否是支付宝发出的合法消息
|
||||
* @return 验证结果
|
||||
*/
|
||||
function verifyReturn(){
|
||||
if(empty($_GET)) {//判断POST来的数组是否为空
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
//生成签名结果
|
||||
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
|
||||
//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
|
||||
$responseTxt = $this->getResponse($_GET["notify_id"]);
|
||||
|
||||
//验证
|
||||
//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
|
||||
//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
|
||||
if (preg_match("/true$/i",$responseTxt) && $isSign) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取返回时的签名验证结果
|
||||
* @param $para_temp 通知返回来的参数数组
|
||||
* @param $sign 返回的签名结果
|
||||
* @return 签名验证结果
|
||||
*/
|
||||
function getSignVeryfy($para_temp, $sign) {
|
||||
//除去待签名参数数组中的空值和签名参数
|
||||
$para_filter = paraFilter($para_temp);
|
||||
|
||||
//对待签名参数数组排序
|
||||
$para_sort = argSort($para_filter);
|
||||
|
||||
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
|
||||
$prestr = createLinkstring($para_sort);
|
||||
|
||||
$isSgin = false;
|
||||
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
|
||||
case "MD5" :
|
||||
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
|
||||
break;
|
||||
default :
|
||||
$isSgin = false;
|
||||
}
|
||||
|
||||
return $isSgin;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取远程服务器ATN结果,验证返回URL
|
||||
* @param $notify_id 通知校验ID
|
||||
* @return 服务器ATN结果
|
||||
* 验证结果集:
|
||||
* invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
|
||||
* true 返回正确信息
|
||||
* false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
|
||||
*/
|
||||
function getResponse($notify_id) {
|
||||
$transport = strtolower(trim($this->alipay_config['transport']));
|
||||
$partner = trim($this->alipay_config['partner']);
|
||||
$veryfy_url = '';
|
||||
if($transport == 'https') {
|
||||
$veryfy_url = $this->https_verify_url;
|
||||
}
|
||||
else {
|
||||
$veryfy_url = $this->http_verify_url;
|
||||
}
|
||||
$veryfy_url = $veryfy_url."partner=" . $partner . "¬ify_id=" . $notify_id;
|
||||
$responseTxt = getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']);
|
||||
|
||||
return $responseTxt;
|
||||
}
|
||||
}
|
||||
?>
|
||||
165
plugins/aliold/inc/alipay_submit.class.php
Normal file
165
plugins/aliold/inc/alipay_submit.class.php
Normal file
@@ -0,0 +1,165 @@
|
||||
<?php
|
||||
/* *
|
||||
* 类名:AlipaySubmit
|
||||
* 功能:支付宝各接口请求提交类
|
||||
* 详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据
|
||||
* 版本:3.3
|
||||
* 日期:2012-07-23
|
||||
* 说明:
|
||||
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
|
||||
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
|
||||
*/
|
||||
require_once(PAY_ROOT."inc/alipay_core.function.php");
|
||||
require_once(PAY_ROOT."inc/alipay_md5.function.php");
|
||||
|
||||
class AlipaySubmit {
|
||||
|
||||
var $alipay_config;
|
||||
/**
|
||||
*支付宝网关地址(新)
|
||||
*/
|
||||
var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';
|
||||
|
||||
function __construct($alipay_config){
|
||||
$this->alipay_config = $alipay_config;
|
||||
}
|
||||
function AlipaySubmit($alipay_config) {
|
||||
$this->__construct($alipay_config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成签名结果
|
||||
* @param $para_sort 已排序要签名的数组
|
||||
* return 签名结果字符串
|
||||
*/
|
||||
function buildRequestMysign($para_sort) {
|
||||
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
|
||||
$prestr = createLinkstring($para_sort);
|
||||
|
||||
$mysign = "";
|
||||
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
|
||||
case "MD5" :
|
||||
$mysign = md5Sign($prestr, $this->alipay_config['key']);
|
||||
break;
|
||||
default :
|
||||
$mysign = "";
|
||||
}
|
||||
|
||||
return $mysign;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成要请求给支付宝的参数数组
|
||||
* @param $para_temp 请求前的参数数组
|
||||
* @return 要请求的参数数组
|
||||
*/
|
||||
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->alipay_config['sign_type']));
|
||||
|
||||
return $para_sort;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成要请求给支付宝的参数数组
|
||||
* @param $para_temp 请求前的参数数组
|
||||
* @return 要请求的参数数组字符串
|
||||
*/
|
||||
function buildRequestParaToString($para_temp) {
|
||||
//待请求参数数组
|
||||
$para = $this->buildRequestPara($para_temp);
|
||||
|
||||
//把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
|
||||
$request_data = createLinkstringUrlencode($para);
|
||||
|
||||
return $request_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 建立请求,以表单HTML形式构造(默认)
|
||||
* @param $para_temp 请求参数数组
|
||||
* @param $method 提交方式。两个值可选:post、get
|
||||
* @param $button_name 确认按钮显示文字
|
||||
* @return 提交表单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->alipay_config['input_charset']))."' method='".$method."'>";
|
||||
foreach ($para as $key=>$val) {
|
||||
$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
|
||||
}
|
||||
|
||||
//submit按钮控件请不要含有name属性
|
||||
$sHtml = $sHtml."<input type='submit' value='".$button_name."'></form>";
|
||||
|
||||
$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
|
||||
|
||||
return $sHtml;
|
||||
}
|
||||
|
||||
/**
|
||||
* 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果
|
||||
* @param $para_temp 请求参数数组
|
||||
* @return 支付宝处理结果
|
||||
*/
|
||||
function buildRequestHttp($para_temp) {
|
||||
$sResult = '';
|
||||
|
||||
//待请求参数数组字符串
|
||||
$request_data = $this->buildRequestPara($para_temp);
|
||||
|
||||
//远程获取数据
|
||||
$sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->alipay_config['cacert'],$request_data,trim(strtolower($this->alipay_config['input_charset'])));
|
||||
|
||||
return $sResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果,带文件上传功能
|
||||
* @param $para_temp 请求参数数组
|
||||
* @param $file_para_name 文件类型的参数名
|
||||
* @param $file_name 文件完整绝对路径
|
||||
* @return 支付宝返回处理结果
|
||||
*/
|
||||
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->alipay_config['cacert'],$para,trim(strtolower($this->alipay_config['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->alipay_config['partner']))."&_input_charset=".trim(strtolower($this->alipay_config['input_charset']));
|
||||
$encrypt_key = "";
|
||||
|
||||
$doc = new DOMDocument();
|
||||
$doc->load($url);
|
||||
$itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
|
||||
$encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
|
||||
|
||||
return $encrypt_key;
|
||||
}
|
||||
}
|
||||
?>
|
||||
57
plugins/aliold/notify.php
Normal file
57
plugins/aliold/notify.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/* *
|
||||
* 功能:支付宝服务器异步通知页面
|
||||
* 版本:3.3
|
||||
* 日期:2012-07-23
|
||||
* 说明:
|
||||
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
|
||||
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
|
||||
|
||||
|
||||
*************************页面功能说明*************************
|
||||
* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
|
||||
* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
|
||||
* 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify
|
||||
* 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
|
||||
*/
|
||||
if(!defined('IN_PLUGIN'))exit();
|
||||
|
||||
require_once(PAY_ROOT."inc/alipay.config.php");
|
||||
require_once(PAY_ROOT."inc/alipay_notify.class.php");
|
||||
|
||||
//计算得出通知验证结果
|
||||
$alipayNotify = new AlipayNotify($alipay_config);
|
||||
$verify_result = $alipayNotify->verifyNotify();
|
||||
|
||||
if($verify_result) {//验证成功
|
||||
//商户订单号
|
||||
|
||||
$out_trade_no = daddslashes($_POST['out_trade_no']);
|
||||
|
||||
//支付宝交易号
|
||||
|
||||
$trade_no = daddslashes($_POST['trade_no']);
|
||||
|
||||
//交易状态
|
||||
$trade_status = $_POST['trade_status'];
|
||||
|
||||
//交易金额
|
||||
$total_fee = $_POST['total_fee'];
|
||||
|
||||
if ($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {
|
||||
//付款完成后,支付宝系统发送该交易状态通知
|
||||
if($out_trade_no == TRADE_NO && round($total_fee,2)==round($order['money'],2)){
|
||||
if($order['status']==0){
|
||||
if($DB->exec("update `pre_order` set `status` ='1' where `trade_no`='".TRADE_NO."'")){
|
||||
$DB->exec("update `pre_order` set `api_trade_no` ='$trade_no',`endtime` ='$date',`date` =NOW() where `trade_no`='".TRADE_NO."'");
|
||||
processOrder($order);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo "success";
|
||||
}
|
||||
else {
|
||||
//验证失败
|
||||
echo "fail";
|
||||
64
plugins/aliold/return.php
Normal file
64
plugins/aliold/return.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/* *
|
||||
* 功能:支付宝页面跳转同步通知页面
|
||||
* 版本:3.3
|
||||
* 日期:2012-07-23
|
||||
* 说明:
|
||||
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
|
||||
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
|
||||
|
||||
*************************页面功能说明*************************
|
||||
* 该页面可在本机电脑测试
|
||||
* 可放入HTML等美化页面的代码、商户业务逻辑程序代码
|
||||
* 该页面可以使用PHP开发工具调试,也可以使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyReturn
|
||||
*/
|
||||
if(!defined('IN_PLUGIN'))exit();
|
||||
|
||||
require_once(PAY_ROOT."inc/alipay.config.php");
|
||||
require_once(PAY_ROOT."inc/alipay_notify.class.php");
|
||||
|
||||
@header('Content-Type: text/html; charset=UTF-8');
|
||||
|
||||
//计算得出通知验证结果
|
||||
$alipayNotify = new AlipayNotify($alipay_config);
|
||||
$verify_result = $alipayNotify->verifyReturn();
|
||||
if($verify_result) {
|
||||
//商户订单号
|
||||
|
||||
$out_trade_no = daddslashes($_GET['out_trade_no']);
|
||||
|
||||
//支付宝交易号
|
||||
|
||||
$trade_no = daddslashes($_GET['trade_no']);
|
||||
|
||||
//交易状态
|
||||
$trade_status = $_GET['trade_status'];
|
||||
|
||||
//交易金额
|
||||
$total_fee = $_GET['total_fee'];
|
||||
|
||||
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
|
||||
if($out_trade_no == TRADE_NO && round($total_fee,2)==round($order['money'],2)){
|
||||
$url=creat_callback($order);
|
||||
|
||||
if($order['status']==0){
|
||||
if($DB->exec("update `pre_order` set `status` ='1' where `trade_no`='".TRADE_NO."'")){
|
||||
$DB->exec("update `pre_order` set `api_trade_no` ='$trade_no',`endtime` ='$date',`date` =NOW() where `trade_no`='".TRADE_NO."'");
|
||||
processOrder($order,false);
|
||||
}
|
||||
echo '<script>window.location.href="'.$url['return'].'";</script>';
|
||||
}else{
|
||||
echo '<script>window.location.href="'.$url['return'].'";</script>';
|
||||
}
|
||||
}else{
|
||||
sysmsg('订单信息校验失败');
|
||||
}
|
||||
}
|
||||
else {
|
||||
echo "trade_status=".$_GET['trade_status'];
|
||||
}
|
||||
}
|
||||
else {
|
||||
//验证失败
|
||||
sysmsg('支付宝返回验证失败!');
|
||||
}
|
||||
42
plugins/aliold/submit.php
Normal file
42
plugins/aliold/submit.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
if(!defined('IN_PLUGIN'))exit();
|
||||
|
||||
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')!==false && !$submit2){
|
||||
echo "<script>window.location.href='/submit2.php?typeid={$order['type']}&trade_no={$trade_no}';</script>";exit;
|
||||
}
|
||||
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')!==false){
|
||||
include(SYSTEM_ROOT.'pages/wxopen.php');
|
||||
exit;
|
||||
}
|
||||
if(!empty($conf['localurl_alipay']) && !strpos($conf['localurl_alipay'],$_SERVER['HTTP_HOST'])){
|
||||
echo "<script>window.location.href='{$conf['localurl_alipay']}submit2.php?typeid={$order['type']}&trade_no={$trade_no}';</script>";exit;
|
||||
}
|
||||
|
||||
require_once(PAY_ROOT."inc/alipay.config.php");
|
||||
require_once(PAY_ROOT."inc/alipay_submit.class.php");
|
||||
|
||||
if(checkmobile()==true && in_array('2',$channel['apptype'])){
|
||||
$alipay_service = "alipay.wap.create.direct.pay.by.user";
|
||||
}else{
|
||||
$alipay_service = "create_direct_pay_by_user";
|
||||
}
|
||||
$parameter = array(
|
||||
"service" => $alipay_service,
|
||||
"partner" => trim($alipay_config['partner']), //合作身份者id
|
||||
"seller_id" => trim($alipay_config['partner']), //收款支付宝用户号
|
||||
"payment_type" => "1", //支付方式
|
||||
"notify_url" => $conf['localurl'].'pay/aliold/notify/'.TRADE_NO.'/', //服务器异步通知页面路径
|
||||
"return_url" => $siteurl.'pay/aliold/return/'.TRADE_NO.'/', //页面跳转同步通知页面路径
|
||||
"out_trade_no" => $trade_no, //商户订单号
|
||||
"subject" => $ordername, //订单名称
|
||||
"total_fee" => $order['money'], //付款金额
|
||||
"_input_charset" => strtolower('utf-8')
|
||||
);
|
||||
if($alipay_service=="alipay.wap.create.direct.pay.by.user"){
|
||||
$parameter['app_pay'] = "Y";
|
||||
}
|
||||
|
||||
//建立请求
|
||||
$alipaySubmit = new AlipaySubmit($alipay_config);
|
||||
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "正在跳转");
|
||||
echo $html_text;
|
||||
Reference in New Issue
Block a user