1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* 类名 alipay_notify |
4
|
|
|
* 功能 支付宝外部服务接口控制 |
5
|
|
|
* 版本 0.6 |
6
|
|
|
* 日期 2006-6-10 |
7
|
|
|
* 作者 http://www.buybay.org |
8
|
|
|
* 联系 Email: [email protected] Homepage:http://www.buybay.org |
9
|
|
|
* 版权 Copyright2006 Buybay NetTech |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
View Code Duplication |
class alipay_notify { |
|
|
|
|
13
|
|
|
var $gateway; |
14
|
|
|
var $security_code; //安全校验码 |
15
|
|
|
var $partner; |
16
|
|
|
var $sign_type; |
17
|
|
|
var $mysign; |
18
|
|
|
var $_input_charset ; |
19
|
|
|
var $transport; |
20
|
|
|
function alipay_notify($partner,$security_code,$sign_type = "MD5",$_input_charset = "utf-8",$transport= "https") { |
|
|
|
|
21
|
|
|
$this->partner = $partner; |
22
|
|
|
$this->security_code = $security_code; |
23
|
|
|
$this->sign_type = $sign_type; |
24
|
|
|
$this->mysign = ""; |
25
|
|
|
$this->_input_charset = $_input_charset ; |
26
|
|
|
$this->transport = $transport; |
27
|
|
|
if($this->transport == "https") { |
28
|
|
|
$this->gateway = "https://www.alipay.com/cooperate/gateway.do?"; |
29
|
|
|
} else $this->gateway = "http://notify.alipay.com/trade/notify_query.do?"; |
30
|
|
|
|
31
|
|
|
} |
32
|
|
|
function notify_verify() { //对notify_url的认证 |
|
|
|
|
33
|
|
|
if($this->transport == "https") { |
34
|
|
|
$veryfy_url = $this->gateway. "service=notify_verify" ."&partner=" .$this->partner. "¬ify_id=".$_POST["notify_id"]; |
35
|
|
|
} else { |
36
|
|
|
$veryfy_url = $this->gateway. "notify_id=".$_POST["notify_id"]."&partner=" .$this->partner; |
37
|
|
|
} |
38
|
|
|
$veryfy_result = $this->get_verify($veryfy_url); |
39
|
|
|
$post = $this->para_filter($_POST); |
40
|
|
|
$sort_post = $this->arg_sort($post); |
41
|
|
|
while (list ($key, $val) = each ($sort_post)) { |
42
|
|
|
$arg.=$key."=".$val."&"; |
|
|
|
|
43
|
|
|
} |
44
|
|
|
$prestr = substr($arg,0,count($arg)-2); //去掉最后一个&号 |
45
|
|
|
$this->mysign = $this->sign($prestr.$this->security_code); |
46
|
|
|
if (eregi("true$",$veryfy_result) && $this->mysign == $_POST["sign"]) { |
47
|
|
|
return true; |
48
|
|
|
} else return false; |
49
|
|
|
} |
50
|
|
|
function return_verify() { //对return_url的认证 |
|
|
|
|
51
|
|
|
if($this->transport == "https") { |
52
|
|
|
$veryfy_url = $this->gateway. "service=notify_verify" ."&partner=" .$this->partner. "¬ify_id=".$_GET["notify_id"]; |
53
|
|
|
} else { |
54
|
|
|
$veryfy_url = $this->gateway. "notify_id=".$_GET["notify_id"]."&partner=" .$this->partner; |
55
|
|
|
} |
56
|
|
|
$veryfy_result = $this->get_verify($veryfy_url); |
57
|
|
|
$GET = $this->para_filter($_GET); |
|
|
|
|
58
|
|
|
$sort_get= $this->arg_sort($_GET); |
59
|
|
|
while (list ($key, $val) = each ($sort_get)) { |
60
|
|
|
if($key != "sign" && $key != "sign_type") |
61
|
|
|
$arg.=$key."=".$val."&"; |
|
|
|
|
62
|
|
|
} |
63
|
|
|
$prestr = substr($arg,0,count($arg)-2); //去掉最后一个&号 |
64
|
|
|
$this->mysign = $this->sign($prestr.$this->security_code); |
65
|
|
|
|
66
|
|
|
log_result("return_url_log=".$_GET["sign"]."-------------------".$this->mysign."&".$this->charset_decode(implode(",",$_GET),$this->_input_charset )); |
67
|
|
|
//**********************************上面写日志 |
68
|
|
|
if (eregi("true$",$veryfy_result) && $this->mysign == $_GET["sign"]) { |
69
|
|
|
return true; |
70
|
|
|
}else return false; |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
function get_verify($url,$time_out = "60") { |
|
|
|
|
74
|
|
|
$urlarr = parse_url($url); |
75
|
|
|
$errno = ""; |
76
|
|
|
$errstr = ""; |
77
|
|
|
$transports = ""; |
|
|
|
|
78
|
|
|
if($urlarr["scheme"] == "https") { |
79
|
|
|
$transports = "ssl://"; |
80
|
|
|
$urlarr["port"] = "443"; |
81
|
|
|
} else { |
82
|
|
|
$transports = "tcp://"; |
83
|
|
|
$urlarr["port"] = "80"; |
84
|
|
|
} |
85
|
|
|
$fp=@fsockopen($transports . $urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out); |
86
|
|
|
if(!$fp) { |
87
|
|
|
die("ERROR: $errno - $errstr<br />\n"); |
88
|
|
|
} else { |
89
|
|
|
fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n"); |
90
|
|
|
fputs($fp, "Host: ".$urlarr["host"]."\r\n"); |
91
|
|
|
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); |
92
|
|
|
fputs($fp, "Content-length: ".strlen($urlarr["query"])."\r\n"); |
93
|
|
|
fputs($fp, "Connection: close\r\n\r\n"); |
94
|
|
|
fputs($fp, $urlarr["query"] . "\r\n\r\n"); |
95
|
|
|
while(!feof($fp)) { |
96
|
|
|
$info[]=@fgets($fp, 1024); |
|
|
|
|
97
|
|
|
} |
98
|
|
|
|
99
|
|
|
fclose($fp); |
100
|
|
|
$info = implode(",",$info); |
|
|
|
|
101
|
|
|
while (list ($key, $val) = each ($_POST)) { |
102
|
|
|
$arg.=$key."=".$val."&"; |
|
|
|
|
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
|
106
|
|
|
log_result("return_url_log=".$url.$this->charset_decode($info,$this->_input_charset)); |
107
|
|
|
log_result("return_url_log=".$this->charset_decode($arg,$this->_input_charset)); |
108
|
|
|
return $info; |
109
|
|
|
} |
110
|
|
|
|
111
|
|
|
} |
112
|
|
|
|
113
|
|
|
function arg_sort($array) { |
|
|
|
|
114
|
|
|
ksort($array); |
115
|
|
|
reset($array); |
116
|
|
|
return $array; |
117
|
|
|
|
118
|
|
|
} |
119
|
|
|
|
120
|
|
|
function sign($prestr) { |
|
|
|
|
121
|
|
|
$sign=''; |
|
|
|
|
122
|
|
|
if($this->sign_type == 'MD5') { |
123
|
|
|
$sign = md5($prestr); |
124
|
|
|
}elseif($this->sign_type =='DSA') { |
125
|
|
|
//DSA 签名方法待后续开发 |
126
|
|
|
die("DSA 签名方法待后续开发,请先使用MD5签名方式"); |
127
|
|
|
}else { |
128
|
|
|
die("支付宝暂不支持".$this->sign_type."类型的签名方式"); |
129
|
|
|
} |
130
|
|
|
return $sign; |
131
|
|
|
|
132
|
|
|
} |
133
|
|
|
function para_filter($parameter) { //除去数组中的空值和签名模式 |
|
|
|
|
134
|
|
|
$para = array(); |
135
|
|
|
while (list ($key, $val) = each ($parameter)) { |
136
|
|
|
if($key == "sign" || $key == "sign_type" || $val == "")continue; |
137
|
|
|
else $para[$key] = $parameter[$key]; |
138
|
|
|
|
139
|
|
|
} |
140
|
|
|
return $para; |
141
|
|
|
} |
142
|
|
|
|
143
|
|
|
//实现多种字符编码方式 |
144
|
|
|
function charset_encode($input,$_output_charset ,$_input_charset ="utf-8" ) { |
|
|
|
|
145
|
|
|
$output = ""; |
|
|
|
|
146
|
|
|
if(!isset($_output_charset) )$_output_charset = $this->parameter['_input_charset ']; |
|
|
|
|
147
|
|
|
if($_input_charset == $_output_charset || $input ==null ) { |
148
|
|
|
$output = $input; |
149
|
|
|
} elseif (function_exists("mb_convert_encoding")){ |
150
|
|
|
$output = mb_convert_encoding($input,$_output_charset,$_input_charset); |
151
|
|
|
} elseif(function_exists("iconv")) { |
152
|
|
|
$output = iconv($_input_charset,$_output_charset,$input); |
153
|
|
|
} else die("sorry, you have no libs support for charset change."); |
154
|
|
|
return $output; |
155
|
|
|
} |
156
|
|
|
|
157
|
|
|
//实现多种字符解码方式 |
158
|
|
|
function charset_decode($input,$_input_charset ,$_output_charset="utf-8" ) { |
|
|
|
|
159
|
|
|
$output = ""; |
|
|
|
|
160
|
|
|
if(!isset($_input_charset) )$_input_charset = $this->_input_charset ; |
161
|
|
|
if($_input_charset == $_output_charset || $input ==null ) { |
162
|
|
|
$output = $input; |
163
|
|
|
} elseif (function_exists("mb_convert_encoding")){ |
164
|
|
|
$output = mb_convert_encoding($input,$_output_charset,$_input_charset); |
165
|
|
|
} elseif(function_exists("iconv")) { |
166
|
|
|
$output = iconv($_input_charset,$_output_charset,$input); |
167
|
|
|
} else die("sorry, you have no libs support for charset changes."); |
168
|
|
|
return $output; |
169
|
|
|
} |
170
|
|
|
} |
171
|
|
|
|
172
|
|
|
?> |
|
|
|
|
173
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.