/*
*说明
*构造参数 $mode 为支付接口文件夹名
*文件夹内要求三个文件
*index.php 支付接口网关程序 入口函数为
* string makeurl(
*string$order_no,//订单号
*float$total_fee,//订单总额
*stringsubject,//标题,买家付款看到的提示
*stringcontent//详细说明
*)
*要求返回支付接口网关地址
*
*$pay->by.php 支付接口通知程序
*需要在程序中建立一个本对象实例,调用本对象的
*bool $pay->getData() 方法获得数据,本方法使用 order_no 属性查找,扩展接口在本函数中指定要获得的字段
*在验证合法后
*调用本对象的
*bool setStatus(
*integer$status//要设置的订单状态码 取值如下的常量定义
*string$remark//操作说明,非必需
*) 方法设置订单状态
*
*
*
*
*/
define('PAY_DIR', dirname(__FILE__) . '/');//定义本文件的服务器绝对路径。以”/“结尾,下同
empty($db) && require_once(dirname(PAY_DIR) . '/general.inc.php');
define('PAY_PATH', $cms_abs.'include/paygate/');//定义本文件的URL绝对路径
error_reporting(0);
//订单状态常量
define('PAY_FAIL', -2);
define('PAY_FINISHED', -1);
define('PAY_WAIT_PAY', 1);
define('PAY_WAIT_GOODS', 2);
define('PAY_CONFIRM_GOODS', 3);
class pay_base{
var $by;
var $mode;
var $service;
var $notify_url;
var $return_url;
var $order_sn;
var $order_id;
var $status;
var $totalfee;
var $subject;
var $content;
var $dataok;
function pay_base($mode){
$this->__construct($mode);
}
function __construct($mode){
$this->mode = $mode;
}
function send($sn, $subject, $content, $jumpurl = ''){
$this->order_sn= $sn;
$this->subject= $subject;
$this->content= $content;
$this->jumpurl= $jumpurl;
$this->service= "$this->mode/index.php";
$this->notify_url= "$this->mode/$this->by.php";
if(!is_dir(PAY_DIR.$this->mode) || !is_file(PAY_DIR.$this->service) || !is_file(PAY_DIR.$this->notify_url))
$this->message(
array(
'title'=>'调用错误',
'content'=>'指定支付接口不在在或不完整!'
)
);
if(!$this->getData())
$this->message(
array(
'title'=>'调用错误',
'content'=>'获取指定参数失败!'
)
);
$this->notify_url= PAY_PATH . $this->notify_url;
$this->return_url= PAY_PATH . "$this->mode/return_$this->by.php";
require_once(PAY_DIR.$this->service);
if(!function_exists('makeurl'))
$this->message(
array(
'title'=>'调用错误',
'content'=>'未定义指定支付接口函数 makeurl!'
)
);
if(!$url = makeurl($this))
$this->message(
array(
'title'=>'调用错误',
'content'=>'指定支付接口函数 makeurl 返回网关地址失败!'
)
);
$this->show($url);
}
function getData(){
if($this->dataok)return true;
global $db, $tblprefix, $cfg_alipay, $cfg_alipay_partnerid, $cfg_alipay_keyt, $cfg_tenpay, $cfg_tenpay_keyt;
switch($this->mode){
case 'alipay':
$fields = array(
'alipay'=> 'account',
'alipid'=> 'partner',
'alikeyt'=> 'keyt',
);
$system = array(
'account'=> $cfg_alipay,
'partner'=> $cfg_alipay_partnerid,
'keyt'=> $cfg_alipay_keyt,
);
break;
case 'tenpay':
$fields = array(
'tenpay'=> 'account',
'tenkeyt'=> 'keyt',
);
$system = array(
'account'=> $cfg_tenpay,
'keyt'=> $cfg_tenpay_keyt,
);
break;
}
switch($this->by){
case 'orders':
$tmp = '';
foreach($fields as $k => $v)$tmp .= ",$k as $v";
$key = 'tomid';
$sql1 = "SELECT $key,mid,oid as order_id,state as status,totalfee FROM {
$tblprefix
}orders WHERE ordersn='$this->order_sn'";
$sql2 = "SELECT " . substr($tmp, 1) . " FROM {
$tblprefix
}members_sub WHERE mid=";
break;
case 'pays':
$sql1 = "SELECT pid as order_id,mid,amount as totalfee FROM {
$tblprefix
}pays WHERE ordersn='$this->order_sn'";
$this->status = 0;
break;
default :
$sql1 = '';
}
if($sql1 && $tmp = $db->fetch_one($sql1)){
if(empty($key) || empty($tmp[$key]) || empty($sql2)){
foreach($system as $k => $v)$this->$k = $v;
}else{
if(!$sql2 = $db->fetch_one($sql2 . $tmp[$key]))return false;
foreach($sql2 as $k => $v)$this->$k = $v;
}
if(!empty($key) && !empty($tmp[$key]))unset($tmp[$key]);
foreach($tmp as $k => $v)$this->$k = $v;
$this->dataok = 1;
return true;
}else{
return false;
}
}
function setStatus($status, $remark = ''){
global $db, $tblprefix, $timestamp, $onlineautosaving;
$ret = false;
switch($this->status = $status){
case PAY_FINISHED ://交易完成
$remark || $remark = '交易完成';
break;
case PAY_FAIL ://交易失败
$remark || $remark = '交易失败';
break;
case PAY_WAIT_PAY ://等待付款
$remark || $remark = '等待付款';
break;
case PAY_WAIT_GOODS ://等待发货
$remark || $remark = '等待发货';
break;
case PAY_CONFIRM_GOODS ://等待买家确认收货
$remark || $remark = '等待买家确认收货';
break;
default :
$this->message(
array(
'title'=>'调用错误',
'content'=>"未定义的交易状态 “$status”!"
)
);
}
switch($this->by){
case 'orders':
/*
$upsql = ",remark='" . addslashes($remark) . "'";
($status == PAY_WAIT_GOODS || ($status ==
...
...
(完整源码请下载查看)
...
展开> <收缩