<?php
/*
版本: Ali_VM 1.0
功能: 将支付宝即时到账接口融合到VM中
开发: sanion(影枫)
qq: 285972719
email: mail@shadowsnow.cn
版权归 影雪[www.shadowsnow.cn]所有, 转载请注明出处!
安装步骤:
1. 根目录新建文件夹alipay, 放入压缩包里面的所有php文件
2. 配制好alipay_config.php
3. 在vm后台支付方式,选择基于HTML的方式,贴入index.php的代码
4. 大家可以测试了.
5. 有错误务必指出!谢了
*/
require_once ( JPATH_BASE .DS.'alipay'.DS.'alipay_service.php' );
require_once ( JPATH_BASE .DS.'alipay'.DS.'alipay_config.php' );
$yuan = number_format($db->f("order_total"),2);
$orders = substr($db->f("order_number"),0,16);
$subject = $db->f("user_id");
$body = $db->f("order_id");
$parameter = array(
"service" => "create_direct_pay_by_user", //交易类型,此处为即时到账
"partner" => $partner, //合作商户号
"return_url" => $return_url, //同步返回
"notify_url" => $notify_url, //异步返回
"_input_charset" => $_input_charset, //字符集,默认为GBK
"subject" => $subject, //商品名称,必填
"body" => $body, //商品描述,必填
"out_trade_no" => $orders, //商品外部交易号,必填(保证唯一性)
"total_fee" => $yuan, //商品单价,必填(价格不能为0)
"payment_type" => "1", //默认为1,不需要修改
"show_url" => $show_url, //商品相关网站
"seller_email" => $seller_email //卖家邮箱,必填
);
$alipay = new alipay_service($parameter,$security_code,$sign_type);
$link=$alipay->create_url();
exit("<script>window.location ="$link";</script>");
?>
<?php
$partner = "10000000000000"; //合作伙伴ID
$security_code = "sssssssssssssssssssssss"; //安全检验码
$seller_email = "mail@shadowsnow.cn"; //卖家支付宝帐户
$_input_charset = "GBK"; //字符编码格式 目前支持 GBK 或 utf-8
$sign_type = "MD5"; //加密方式 系统默认(不要修改)
$transport = "https"; //访问模式,你可以根据自己的服务器是否支持ssl访问而选择http以及https访问模式(系统默认,不要修改)
$notify_url = "http://localhost/alipay/notify_url.php"; //交易过程中服务器通知的页面 要用 http://格式的完整路径
$return_url = "http://localhost/alipay/return_url.php"; //付完款后跳转的页面 要用 http://格式的完整路径
$show_url = "http://localhost/index.php"; //你网站商品的展示地址
$ok_url = "http://localhost/ok.asp"; //成功返回页面
$err_url = "http://localhost/err.asp"; //失败返回界面
$host_ = "localhost"; //mysql的地址
$user_ = "root"; //mysql的账户
$pwd_ = "123456"; //mysql的密码
$dbname_ = "shadowsnow"; //mysql数据库名
$j_pix = "jos_" //joomla数据库的前缀
$vm_pix = "vm_" //vm数据库的前缀
?>
<?php
/*
版本: Ali_VM 1.0
功能: 将支付宝即时到账接口融合到VM中
开发: sanion(影枫)
qq: 285972719
email: mail@shadowsnow.cn
版权归 影雪[www.shadowsnow.cn]所有, 转载请注明出处!
安装步骤:
1. 根目录新建文件夹alipay, 放入压缩包里面的所有php文件
2. 配制好alipay_config.php
3. 在vm后台支付方式,选择基于HTML的方式,贴入index.php的代码
4. 大家可以测试了.
5. 有错误务必指出!谢了
*/
require_once ( JPATH_BASE .DS.'alipay'.DS.'alipay_service.php' );
require_once ( JPATH_BASE .DS.'alipay'.DS.'alipay_config.php' );
$yuan = number_format($db->f("order_total"),2);
$orders = substr($db->f("order_number"),0,16);
$subject = $db->f("user_id");
$body = $db->f("order_id");
$parameter = array(
"service" => "create_direct_pay_by_user", //交易类型,此处为即时到账
"partner" => $partner, //合作商户号
"return_url" => $return_url, //同步返回
"notify_url" => $notify_url, //异步返回
"_input_charset" => $_input_charset, //字符集,默认为GBK
"subject" => $subject, //商品名称,必填
"body" => $body, //商品描述,必填
"out_trade_no" => $orders, //商品外部交易号,必填(保证唯一性)
"total_fee" => $yuan, //商品单价,必填(价格不能为0)
"payment_type" => "1", //默认为1,不需要修改
"show_url" => $show_url, //商品相关网站
"seller_email" => $seller_email //卖家邮箱,必填
);
$alipay = new alipay_service($parameter,$security_code,$sign_type);
$link=$alipay->create_url();
exit("<script>window.location ="$link";</script>");
?>
<?php
require_once("alipay_notify.php");
require_once("alipay_config.php");
require_once("alipay_db.php");
$dbs = new DBconn();
$alipay = new alipay_notify($partner,$security_code,$sign_type,$_input_charset,$transport);
$verify_result = $alipay->notify_verify();
if($verify_result) {
empty($_POST['out_trade_no'])? $orders = $_POST['out_trade_no']: exit("fail");
empty($_POST['total_fee'])? $yuan = $_POST['total_fee']: exit("fail");
empty($_POST['subject'])? $user_id = $_POST['subject']: exit("fail");
empty($_POST['body'])? $order_id = $_POST['body']: exit("fail");
if (!isset($_POST['trade_status'])) exit("fail");
if (!preg_match('/^[0-9]{1,16}$/',$orders)) exit("fail");
number_format($yuan,2)? $yuan=number_format($yuan,2): exit("fail");
ctype_digit($user_id)? $user_id=intval($user_id): exit("fail");
ctype_digit($order_id)? $order_id=intval($order_id): exit("fail");
if($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
$exe = "SELECT `order_number`,`order_total` FROM `".$j_pix.$vm_pix."orders` where `order_id` = $order_id and `user_id` = $user_id and `order_status` = 1 limit 1 ";
if(!$dbs->query($exe)) exit("fail");
$rows = $dbs->fetch();
$order_number = substr($rows->order_number,0,16);
$order_total = number_format($rows->order_total,2);
if ( $yuan != $order_total || $orders != $order_total ) exit("fail");
$exe = "UPDATE `".$j_pix.$vm_pix."orders` SET `order_status` = 5 where `order_id` =$order_id and `user_id`=$user_id and `order_status` = 1 limit 1";
if (!$dbs->execute($exe)) exit("fail");
exit("success");
}
else if($_POST['trade_status'] == 'TRADE_FINISHED' ||$_POST['trade_status'] == 'TRADE_SUCCESS') {
$exe = "SELECT `order_number`,`order_total` FROM `".$j_pix.$vm_pix."orders` where `order_id` =$order_id and `user_id`=$user_id and `order_status` = 5 limit 1 ";
if(!$dbs->query($exe)) exit("fail");
$rows = $dbs->fetch();
$order_number = substr($rows->order_number,0,16);
$order_total = number_format($rows->order_total,2);
if ( $yuan != $order_total || $orders != $order_total ) exit("fail");
$exe = "UPDATE `".$j_pix.$vm_pix."orders` SET `order_status` = 2 where `order_id` =$order_id and `user_id`=$user_id and `order_status` = 5 limit 1";
if (!$dbs->execute($exe)) exit("fail");
exit("success");
}
else {
exit("fail");
}
}
else {
exit("fail");
}
unset($dbs);
?>
<?php
class alipay_notify {
var $gateway; //支付接口
var $security_code; //安全校验码
var $partner; //合作伙伴ID
var $sign_type; //加密方式 系统默认
var $mysign; //签名
var $_input_charset; //字符编码格式
var $transport; //访问模式
function alipay_notify($partner,$security_code,$sign_type = "MD5",$_input_charset = "GBK",$transport= "https") {
$this->partner = $partner;
$this->security_code = $security_code;
$this->sign_type = $sign_type;
$this->mysign = "";
$this->_input_charset = $_input_charset ;
$this->transport = $transport;
if($this->transport == "https") {
$this->gateway = "https://www.alipay.com/cooperate/gateway.do?";
}else $this->gateway = "http://notify.alipay.com/trade/notify_query.do?";
}
//对notify_url的认证
function notify_verify() {
if($this->transport == "https") {
$veryfy_url = $this->gateway. "service=notify_verify" ."&partner=" .$this->partner. "¬ify_id=".$_POST["notify_id"];
} else {
$veryfy_url = $this->gateway. "partner=".$this->partner."¬ify_id=".$_POST["notify_id"];
}
$veryfy_result = $this->get_verify($veryfy_url);
$post = $this->para_filter($_POST);
$sort_post = $this->arg_sort($post);
while (list ($key, $val) = each ($sort_post)) {
$arg.=$key."=".$val."&";
}
$prestr = substr($arg,0,count($arg)-2); //去掉最后一个&号
$this->mysign = $this->sign($prestr.$this->security_code);
log_result("notify_url_log:sign=".$_POST["sign"]."&mysign=".$this->mysign."&".$this->charset_decode(implode(",",$_POST),$this->_input_charset ));
if (eregi("true$",$veryfy_result) && $this->mysign == $_POST["sign"]) {
return true;
} else return false;
}
//对return_url的认证
function return_verify() {
$sort_get= $this->arg_sort($_GET);
while (list ($key, $val) = each ($sort_get)) {
if($key != "sign" && $key != "sign_type")
$arg.=$key."=".$val."&";
}
$prestr = substr($arg,0,count($arg)-2); //去掉最后一个&号
$this->mysign = $this->sign($prestr.$this->security_code);
/*while (list ($key, $val) = each ($_GET)) {
$arg_get.=$key."=".$val."&";
}*/
log_result("return_url_log=".$_GET["sign"]."&".$this->mysign."&".$this->charset_decode(implode(",",$_GET),$this->_input_charset ));
if ($this->mysign == $_GET["sign"]) return true;
else return false;
}
function get_verify($url,$time_out = "60") {
$urlarr = parse_url($url);
$errno = "";
$errstr = "";
$transports = "";
if($urlarr["scheme"] == "https") {
$transports = "ssl://";
$urlarr["port"] = "443";
} else {
$transports = "tcp://";
$urlarr["port"] = "80";
}
$fp=@fsockopen($transports . $urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out);
if(!$fp) {
die("ERROR: $errno - $errstr
\n");
} else {
fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
fputs($fp, "Host: ".$urlarr["host"]."\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($urlarr["query"])."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $urlarr["query"] . "\r\n\r\n");
while(!feof($fp)) {
$info[]=@fgets($fp, 1024);
}
fclose($fp);
$info = implode(",",$info);
while (list ($key, $val) = each ($_POST)) {
$arg.=$key."=".$val."&";
}
log_result("notify_url_log=".$url.$this->charset_decode($info,$this->_input_charset));
log_result("notify_url_log=".$this->charset_decode($arg,$this->_input_charset));
return $info;
}
}
function arg_sort($array) {
ksort($array);
reset($array);
return $array;
}
function sign($prestr) {
$sign='';
if($this->sign_type == 'MD5') {
$sign = md5($prestr);
}elseif($this->sign_type =='DSA') {
//DSA 签名方法待后续开发
die("DSA 签名方法待后续开发,请先使用MD5签名方式");
}else {
die("支付宝暂不支持".$this->sign_type."类型的签名方式");
}
return $sign;
}
//除去数组中的空值和签名模式
function para_filter($parameter) {
$para = array();
while (list ($key, $val) = each ($parameter)) {
if($key == "sign" || $key == "sign_type" || $val == "")continue;
else $para[$key] = $parameter[$key];
}
return $para;
}
//实现多种字符编码方式
function charset_encode($input,$_output_charset ,$_input_charset ="GBK" ) {
$output = "";
if(!isset($_output_charset) )$_output_charset = $this->parameter['_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;
}
//实现多种字符解码方式
function charset_decode($input,$_input_charset ,$_output_charset="GBK" ) {
$output = "";
if(!isset($_input_charset) )$_input_charset = $this->_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;
}
}
?>
<?php
require_once("alipay_notify.php");
require_once("alipay_config.php");
require_once("alipay_db.php");
$dbs = new DBconn();
$alipay = new alipay_notify($partner,$security_code,$sign_type,$_input_charset,$transport);
$verify_result = $alipay->return_verify();
if (!isset($_POST['trade_status'])) $dbs->alertu('Pay Error !' ,$err_url);
if($verify_result) {
if($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
$dbs->alertu('Please Pay First !' ,$err_url);
}
else if($_POST['trade_status'] == 'TRADE_FINISHED' ||$_POST['trade_status'] == 'TRADE_SUCCESS') {
$dbs->alertu('Pay Successed !' ,$ok_url);
}
else {
$dbs->alertu('Pay Error !' ,$err_url);
}
}
else {
$dbs->alertu('Pay Error !' ,$err_url);
}
unset($dbs);
?>
<?php
class alipay_service {
var $gateway = "https://www.alipay.com/cooperate/gateway.do?"; //支付接口
var $parameter; //全部需要传递的参数
var $security_code; //安全校验码
var $mysign; //签名
//构造支付宝外部服务接口控制
function alipay_service($parameter,$security_code,$sign_type = "MD5",$transport= "https") {
$this->parameter = $this->para_filter($parameter);
$this->security_code = $security_code;
$this->sign_type = $sign_type;
$this->mysign = '';
$this->transport = $transport;
if($parameter['_input_charset'] == "")
$this->parameter['_input_charset']='GBK';
if($this->transport == "https") {
$this->gateway = "https://www.alipay.com/cooperate/gateway.do?";
} else $this->gateway = "http://www.alipay.com/cooperate/gateway.do?";
$sort_array = array();
$arg = "";
$sort_array = $this->arg_sort($this->parameter);
while (list ($key, $val) = each ($sort_array)) {
$arg.=$key."=".$this->charset_encode($val,$this->parameter['_input_charset'])."&";
}
$prestr = substr($arg,0,count($arg)-2); //去掉最后一个问号
$this->mysign = $this->sign($prestr.$this->security_code);
}
function create_url() {
$url = $this->gateway;
$sort_array = array();
$arg = "";
$sort_array = $this->arg_sort($this->parameter);
while (list ($key, $val) = each ($sort_array)) {
$arg.=$key."=".urlencode($this->charset_encode($val,$this->parameter['_input_charset']))."&";
}
$url.= $arg."sign=" .$this->mysign ."&sign_type=".$this->sign_type;
return $url;
}
function arg_sort($array) {
ksort($array);
reset($array);
return $array;
}
function sign($prestr) {
$mysign = "";
if($this->sign_type == 'MD5') {
$mysign = md5($prestr);
}elseif($this->sign_type =='DSA') {
//DSA 签名方法待后续开发
die("DSA 签名方法待后续开发,请先使用MD5签名方式");
}else {
die("支付宝暂不支持".$this->sign_type."类型的签名方式");
}
return $mysign;
}
function para_filter($parameter) { //除去数组中的空值和签名模式
$para = array();
while (list ($key, $val) = each ($parameter)) {
if($key == "sign" || $key == "sign_type" || $val == "")continue;
else $para[$key] = $parameter[$key];
}
return $para;
}
//实现多种字符编码方式
function charset_encode($input,$_output_charset ,$_input_charset ="GBK" ) {
$output = "";
if(!isset($_output_charset) )$_output_charset = $this->parameter['_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;
}
}
?>
<?php
class DBconn{
private $host;
private $user;
private $pwd;
private $dbname;
private $conn;
private $sql;
private $result;
function __construct(){
$this->host=$GLOBALS['host_'] ;
$this->user=$GLOBALS['user_'] ;
$this->pwd=$GLOBALS['pwd_'] ;
$this->dbname=$GLOBALS['dbname_'] ;
$this->conn=mysql_connect($this->host,$this->user,$this->pwd) or exit("MySQL Error : " . mysql_error());
mysql_select_db($this->dbname,$this->conn) or exit("MySQL Error : " . mysql_error());
}
function __destruct(){
mysql_close($this->conn) or exit("MySQL Error : " . mysql_error());
}
function __get($property_name){
if (isset($this->property_name)){
return $this->property_name;
}
else{
return NULL;
}
}
function __set($property_name,$value){
$this->property_name=$this->value;
}
//增删改
function execute($sql){
$this->sql=$sql;
$this->result=mysql_query($sql,$this->conn) or exit("MySQL Error : " . mysql_error());
$affected_rows=mysql_affected_rows($this->conn);
return $affected_rows;
}
//查询
function query($sql){
$this->sql=$sql;
$this->result=mysql_query($sql,$this->conn) or exit("MySQL Error : " . mysql_error());
$num_rows=mysql_num_rows($this->result);
return $num_rows;
}
//获取记录集
function result($sql){
$this->sql=$sql;
$this->result=mysql_query($sql,$this->conn) or exit("MySQL Error : " . mysql_error());
return $this->result;
}
//获取当前记录行
function fetch(){
$fetch_object=mysql_fetch_object($this->result);
return $fetch_object;
}
//32次md5加密
function md8($data){
for ($i = 0; $i < 32; $i ) {
$data = md5($data);
}
return $data;
}
//24次md5加密, 明文
function md7($data){
for ($i = 0; $i < 24; $i ) {
$data = md5($data);
}
return $data;
}
//8次md5加密,密文, 注: md1(md7($str))=md8($str)
function md1($data){
for ($i = 0; $i < 8; $i ) {
$data = md5($data);
}
return $data;
}
function alertu($astr,$aurl){
exit("<Script Language=JavaScript>alert('".$astr."');location.href='".$aurl."';</Script>");
}
}
?>
提个建议:你期望用户在 Joomla 网站上怎样去用你的“支付宝接口”?跟什么来“接”?
这个问题对于编程高手来说,可以换来一句讥讽:有了接口做什么都行啊,想接什么就接什么。
但是,我想说说普通用户的心声:对于我这样的编程文盲来说,“跟什么程序都能接”也就意味着“跟什么都接不上”。因为我不懂编程,我怎么能把这个支付宝整合到我的 VM 商店程序去卖商品?或者整合到我的下载系统去卖软件?
所以,建议楼主再辛苦一下:如果你希望造福于 Joomla 用户,就把产品做成“Joomla 标准”,也就是说,我们点击下鼠标就能挂接好,而不是去研究代码。
VirtueMart 商店组件后台有“添加支付网关”的功能,但是你的软件必须做成 VM 要求的那种安装包,才能即插即用。像楼上贴出的这种代码,只能由高手去用了,跟普通用户无关。