| @@ 12-170 (lines=159) @@ | ||
| 9 | * 版权 Copyright2006 Buybay NetTech |
|
| 10 | */ |
|
| 11 | ||
| 12 | 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 | ||
| @@ 12-170 (lines=159) @@ | ||
| 9 | ��* ��Ȩ Copyright2006 Buybay NetTech |
|
| 10 | ��*/ |
|
| 11 | ||
| 12 | 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 = "GBK",$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 ="GBK" ) { |
|
| 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="GBK" ) { |
|
| 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 | ||