www.gusucode.com > 4127网博士成品网站管理系统 PHP网站源码程序 > 4127/4127/member/paycenter/alipay_notify.php
<?php /* *功能:付款过程中服务器通知类 *版本:2.0 *日期:2008-08-01 *作者:支付宝公司销售部技术支持团队 *联系:0571-26888888 *版权:支付宝公司 */ 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); 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<br />\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; } /*********************************************************************************/ } //日志消息,把支付宝反馈的参数记录下来 function log_result($word) { $fp = fopen("alipay_db_log.txt","a"); flock($fp, LOCK_EX) ; fwrite($fp,$word.":执行日期:".strftime("%Y%m%d%H%I%S",time())."\t\n"); flock($fp, LOCK_UN); fclose($fp); } ?>