Authored by 郝肖肖

支付宝版本升级

@@ -23,16 +23,18 @@ class Yohobuy @@ -23,16 +23,18 @@ class Yohobuy
23 // const YOHOBUY_URL = 'http://www.yohobuy.com/'; 23 // const YOHOBUY_URL = 'http://www.yohobuy.com/';
24 24
25 //java API 25 //java API
26 - const API_URL = 'http://api.yoho.yohoops.org/';  
27 - const API_URL2 = 'http://api.yoho.yohoops.org/';  
28 - const SERVICE_URL = 'http://service.yoho.yohoops.org/';  
29 - const YOHOBUY_URL = 'http://www.yohobuy.com/';  
30 - const API_OLD = 'http://api2.open.yohobuy.com/'; 26 +// const API_URL = 'http://api.yoho.yohoops.org/';
  27 +// const API_URL2 = 'http://api.yoho.yohoops.org/';
  28 +// const SERVICE_URL = 'http://service.yoho.yohoops.org/';
  29 +// const YOHOBUY_URL = 'http://www.yohobuy.com/';
  30 +// const API_OLD = 'http://api2.open.yohobuy.com/';
  31 +// const SERVICE_NOTIFY = 'http://service.yoho.cn/';
31 32
32 // 测试环境 */ 33 // 测试环境 */
33 - // const API_URL = 'http://testapi.yoho.cn:28078/'; // 'http://192.168.102.205:8080/gateway/'  
34 - // const SERVICE_URL = 'http://testservice.yoho.cn:28077/';  
35 - // const YOHOBUY_URL = 'http://www.yohobuy.com/'; 34 + const API_URL = 'http://testapi.yoho.cn:28078/'; // 'http://192.168.102.205:8080/gateway/'
  35 + const SERVICE_URL = 'http://testservice.yoho.cn:28077/';
  36 + const YOHOBUY_URL = 'http://www.yohobuy.com/';
  37 + const SERVICE_NOTIFY = 'http://testapi.yoho.cn:28078/';
36 38
37 /* 预览环境 */ 39 /* 预览环境 */
38 // const API_URL = 'http://preapi.yoho.cn/'; 40 // const API_URL = 'http://preapi.yoho.cn/';
@@ -978,4 +978,21 @@ class Helpers @@ -978,4 +978,21 @@ class Helpers
978 { 978 {
979 return '//' . strtr($url, array('http://' => '', 'https://' => '')); 979 return '//' . strtr($url, array('http://' => '', 'https://' => ''));
980 } 980 }
  981 +
  982 + /**
  983 + * 除去数组中的空值和签名参数
  984 + * @param $para 签名参数组
  985 + * return 去掉空值与签名参数后的新签名参数组
  986 + */
  987 + public static function paraFilter(&$para)
  988 + {
  989 + $para_filter = array();
  990 + foreach ($para as $key => $val) {
  991 + if ($key === "sign" || $key === "sign_type" || $val === "") {
  992 + continue;
  993 + }
  994 + $para_filter[$key] = $val;
  995 + }
  996 + return $para_filter;
  997 + }
981 } 998 }
@@ -4,14 +4,14 @@ namespace Plugin\Pay\aliwap; @@ -4,14 +4,14 @@ namespace Plugin\Pay\aliwap;
4 class AliwapConfig 4 class AliwapConfig
5 { 5 {
6 6
7 - var $pay_url = "http://wappaygw.alipay.com/service/rest.htm?"; 7 + var $pay_url = "https://mapi.alipay.com/gateway.do?";
8 8
9 /** 9 /**
10 * 服务名,即时到帐为alipay.wap.trade.create. direct 10 * 服务名,即时到帐为alipay.wap.trade.create. direct
11 * Enter description here ... 11 * Enter description here ...
12 * @var String 12 * @var String
13 */ 13 */
14 - var $service = "alipay.wap.trade.create.direct"; 14 + var $service = "alipay.wap.create.direct.pay.by.user";
15 15
16 /** 16 /**
17 * 合作伙伴在支付宝的用户ID 17 * 合作伙伴在支付宝的用户ID
@@ -32,14 +32,14 @@ class AliwapConfig @@ -32,14 +32,14 @@ class AliwapConfig
32 * Enter description here ... 32 * Enter description here ...
33 * @var String 33 * @var String
34 */ 34 */
35 - var $notify_url = 'http://service.yoho.cn/payment/alipaywap_notify';//"http://m.yohobuy.com/shopping/pay/aliwapnotice"; 35 + var $notify_url = 'payment/alipay_notify';
36 36
37 /** 37 /**
38 * 浏览器的返回 38 * 浏览器的返回
39 * Enter description here ... 39 * Enter description here ...
40 * @var string 40 * @var string
41 */ 41 */
42 - var $return_url = "http://m.yohobuy.com/shopping/pay/aliwapreturn"; 42 + var $return_url = "shopping/pay/aliwapreturn";
43 43
44 /** 44 /**
45 * 签名方式 45 * 签名方式
@@ -8,15 +8,23 @@ namespace Plugin\Pay\aliwap; @@ -8,15 +8,23 @@ namespace Plugin\Pay\aliwap;
8 class AliwapReqparams 8 class AliwapReqparams
9 { 9 {
10 10
11 - public function __construct($_orderCode, $_totalFee, $_goodName, $client_ip, $_orderTime, $_paymentParameter="", $_isTest=false) 11 + public function __construct($_orderCode, $_totalFee, $_goodName, $client_ip, $_orderTime, $_paymentParameter="", $_isTest=false, $_payExpire = '')
12 { 12 {
13 - $this->orderCode = $_orderCode;  
14 - $this->totalFee = $_totalFee;  
15 - $this->goodsName = $_goodName;  
16 - $this->spbill_create_ip = $client_ip;  
17 - $this->orderTime = $_orderTime;  
18 - $this->paymentParameter = $_paymentParameter;  
19 - $this->isTest = $_isTest; 13 + //到期时间,默认为当前时间加2个小时的时间戳
  14 + $_payExpire = empty($_payExpire) ? strtotime('+2 hours') : strtotime($_payExpire);
  15 + $payExpireMinute = 0;//剩余分钟数
  16 + if ($_payExpire && ($expireTime = $_payExpire - time()) > 0) {
  17 + $payExpireMinute = floor($expireTime / 60);
  18 + }
  19 +
  20 + $this->orderCode = $_orderCode;
  21 + $this->totalFee = $_totalFee;
  22 + $this->goodsName = $_goodName;
  23 + $this->spbill_create_ip = $client_ip;
  24 + $this->orderTime = $_orderTime;
  25 + $this->paymentParameter = $_paymentParameter;
  26 + $this->isTest = $_isTest;
  27 + $this->payExpireMinute = $payExpireMinute;
20 } 28 }
21 29
22 /** 30 /**
@@ -5,6 +5,8 @@ namespace Plugin\Pay\aliwap; @@ -5,6 +5,8 @@ namespace Plugin\Pay\aliwap;
5 use Plugin\Pay\aliwap\AliwapConfig; 5 use Plugin\Pay\aliwap\AliwapConfig;
6 use Plugin\Pay\aliwap\AliwapReqparams; 6 use Plugin\Pay\aliwap\AliwapReqparams;
7 use Plugin\Pay\aliwap\AliwapRspparams; 7 use Plugin\Pay\aliwap\AliwapRspparams;
  8 +use Api\Yohobuy;
  9 +use Plugin\Helpers;
8 10
9 /** 11 /**
10 * 支付宝手机网页支付 12 * 支付宝手机网页支付
@@ -41,54 +43,45 @@ class AliwapService @@ -41,54 +43,45 @@ class AliwapService
41 */ 43 */
42 public function getPayRequestPars(AliwapReqparams $params) 44 public function getPayRequestPars(AliwapReqparams $params)
43 { 45 {
44 - $para_token = array(  
45 - 'service' => 'alipay.wap.trade.create.direct',  
46 - 'partner' => $this->config->partner,  
47 - 'sec_id' => $this->config->sign_type,  
48 - 'format' => 'xml',  
49 - 'v' => '2.0',  
50 - 'req_id' => date('Ymdhis') . $params->orderCode,  
51 - 'req_data' => $this->getTokenReqData($params->orderCode, $params->goodsName, $params->totalFee / 100),  
52 - '_input_charset' => $this->config->input_charset  
53 - );  
54 - //建立请求  
55 - $alipaySubmit = new \AlipaySubmit($this->alipay_config);  
56 - $html_text = $alipaySubmit->buildRequestHttp($para_token);  
57 - //URLDECODE返回的信息  
58 - $html_text_decode = urldecode($html_text);  
59 - //解析远程模拟提交后返回的信息  
60 - $para_html_text = $alipaySubmit->parseResponse($html_text_decode);  
61 -  
62 - if (empty($para_html_text) || empty($para_html_text['request_token'])) {  
63 - return false;  
64 -// error_log("token获取失败:" . var_export($para_token, true) . "\n" . '返回结果:' . $html_text, 3, '/tmp/aliwap.log');  
65 -// throw new Exception('支付系统繁忙,请稍后再试');  
66 - }  
67 - //获取request_token  
68 - $request_token = $para_html_text['request_token'];  
69 - //业务详细  
70 - $req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>';  
71 - //必填  
72 //构造要请求的参数数组,无需改动 46 //构造要请求的参数数组,无需改动
73 $parameter = array( 47 $parameter = array(
74 - "service" => "alipay.wap.auth.authAndExecute", 48 + 'service' => $this->config->service,
75 'partner' => $this->config->partner, 49 'partner' => $this->config->partner,
76 - 'sec_id' => $this->config->sign_type,  
77 - "format" => 'xml',  
78 - "v" => '2.0',  
79 - "req_id" => date('Ymdhis') . $params->orderCode,  
80 - "req_data" => $req_data,  
81 - "_input_charset" => $this->config->input_charset 50 + '_input_charset' => $this->config->input_charset,
  51 + 'notify_url' => Yohobuy::SERVICE_NOTIFY . $this->config->notify_url,
  52 + 'return_url' => Helpers::url($this->config->return_url),
  53 + /* 业务参数 */
  54 + 'payment_type' => $this->config->payment_type,
  55 + 'seller_id' => $this->config->partner,
  56 + 'it_b_pay' => $params->payExpireMinute . 'm',
  57 + 'payment_type' => $this->config->payment_type,
  58 + 'out_trade_no' => $params->orderCode,
  59 + 'subject' => $params->goodsName,
  60 + 'total_fee' => $params->totalFee / 100, //单位为元
  61 + "show_url" => Helpers::url(''),
82 ); 62 );
83 63
84 - //建立请求  
85 - $alipaySubmit = new \AlipaySubmit($this->alipay_config);  
86 - $strUrl = $alipaySubmit->buildRequestUrl($parameter);  
87 - return array( 64 + ksort($parameter);
  65 + reset($parameter);
  66 + $param = '';
  67 + $sign = '';
  68 +
  69 + $parameter = Helpers::paraFilter($parameter);
  70 +
  71 + foreach ($parameter AS $key => $val) {
  72 + $param .= "$key=" . urlencode($val) . "&";
  73 + $sign .= "$key=$val&";
  74 + }
  75 +
  76 + $param = substr($param, 0, -1);
  77 + $sign = substr($sign, 0, -1) . $this->config->alipay_key;
  78 +
  79 + $result = array(
88 'pay_url' => $this->config->pay_url, 80 'pay_url' => $this->config->pay_url,
89 - 'pars' => $strUrl, 81 + 'pars' => $param . "&sign=" . md5($sign) . "&sign_type=" . $this->config->sign_type,
90 'reqType' => 'get' 82 'reqType' => 'get'
91 ); 83 );
  84 + return $result;
92 } 85 }
93 86
94 /** 87 /**
1 <?php 1 <?php
2 -  
3 /* * 2 /* *
4 * 支付宝接口公用函数 3 * 支付宝接口公用函数
5 * 详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件 4 * 详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件
@@ -15,85 +14,71 @@ @@ -15,85 +14,71 @@
15 * @param $para 需要拼接的数组 14 * @param $para 需要拼接的数组
16 * return 拼接完成以后的字符串 15 * return 拼接完成以后的字符串
17 */ 16 */
18 -function createLinkstring($para)  
19 -{  
20 - $arg = "";  
21 - while (list ($key, $val) = each($para)) {  
22 - $arg.=$key . "=" . $val . "&";  
23 - }  
24 - //去掉最后一个&字符  
25 - $arg = substr($arg, 0, count($arg) - 2);  
26 -  
27 - //如果存在转义字符,那么去掉转义  
28 - if (get_magic_quotes_gpc()) {  
29 - $arg = stripslashes($arg);  
30 - }  
31 -  
32 - return $arg; 17 +function createLinkstring($para) {
  18 + $arg = "";
  19 + while (list ($key, $val) = each ($para)) {
  20 + $arg.=$key."=".$val."&";
  21 + }
  22 + //去掉最后一个&字符
  23 + $arg = substr($arg,0,count($arg)-2);
  24 +
  25 + //如果存在转义字符,那么去掉转义
  26 + if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
  27 +
  28 + return $arg;
33 } 29 }
34 -  
35 /** 30 /**
36 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码 31 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
37 * @param $para 需要拼接的数组 32 * @param $para 需要拼接的数组
38 * return 拼接完成以后的字符串 33 * return 拼接完成以后的字符串
39 */ 34 */
40 -function createLinkstringUrlencode($para)  
41 -{  
42 - $arg = "";  
43 - while (list ($key, $val) = each($para)) {  
44 - $arg.=$key . "=" . urlencode($val) . "&";  
45 - }  
46 - //去掉最后一个&字符  
47 - $arg = substr($arg, 0, count($arg) - 2);  
48 -  
49 - //如果存在转义字符,那么去掉转义  
50 - if (get_magic_quotes_gpc()) {  
51 - $arg = stripslashes($arg);  
52 - }  
53 -  
54 - return $arg; 35 +function createLinkstringUrlencode($para) {
  36 + $arg = "";
  37 + while (list ($key, $val) = each ($para)) {
  38 + $arg.=$key."=".urlencode($val)."&";
  39 + }
  40 + //去掉最后一个&字符
  41 + $arg = substr($arg,0,count($arg)-2);
  42 +
  43 + //如果存在转义字符,那么去掉转义
  44 + if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
  45 +
  46 + return $arg;
55 } 47 }
56 -  
57 /** 48 /**
58 * 除去数组中的空值和签名参数 49 * 除去数组中的空值和签名参数
59 * @param $para 签名参数组 50 * @param $para 签名参数组
60 * return 去掉空值与签名参数后的新签名参数组 51 * return 去掉空值与签名参数后的新签名参数组
61 */ 52 */
62 -function paraFilter($para)  
63 -{  
64 - if (isset($para['q'])) {  
65 - unset($para['q']);  
66 - }  
67 - $para_filter = array();  
68 - while (list ($key, $val) = each($para)) {  
69 - if ($key == "sign" || $key == "sign_type" || $val == "")  
70 - continue;  
71 - else  
72 - $para_filter[$key] = $para[$key];  
73 - }  
74 - return $para_filter; 53 +function paraFilter($para) {
  54 + $para_filter = array();
  55 + while (list ($key, $val) = each ($para)) {
  56 + if($key == "sign" || $key == "sign_type" || $val == "")continue;
  57 + else $para_filter[$key] = $para[$key];
  58 + }
  59 + return $para_filter;
75 } 60 }
76 -  
77 /** 61 /**
78 * 对数组排序 62 * 对数组排序
79 * @param $para 排序前的数组 63 * @param $para 排序前的数组
80 * return 排序后的数组 64 * return 排序后的数组
81 */ 65 */
82 -function argSort($para)  
83 -{  
84 - ksort($para);  
85 - reset($para);  
86 - return $para; 66 +function argSort($para) {
  67 + ksort($para);
  68 + reset($para);
  69 + return $para;
87 } 70 }
88 -  
89 /** 71 /**
90 * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库) 72 * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
91 * 注意:服务器需要开通fopen配置 73 * 注意:服务器需要开通fopen配置
92 * @param $word 要写入日志里的文本内容 默认值:空值 74 * @param $word 要写入日志里的文本内容 默认值:空值
93 */ 75 */
94 -function logResult($word = '')  
95 -{  
96 - error_log("执行日期:" . strftime("%Y%m%d%H%M%S", time()) . "\n" . $word . "\n", 3, '/tmp/aliwap.log'); 76 +function logResult($word='') {
  77 + $fp = fopen("log.txt","a");
  78 + flock($fp, LOCK_EX) ;
  79 + fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n");
  80 + flock($fp, LOCK_UN);
  81 + fclose($fp);
97 } 82 }
98 83
99 /** 84 /**
@@ -107,25 +92,24 @@ function logResult($word = '') @@ -107,25 +92,24 @@ function logResult($word = '')
107 * @param $input_charset 编码格式。默认值:空值 92 * @param $input_charset 编码格式。默认值:空值
108 * return 远程输出的数据 93 * return 远程输出的数据
109 */ 94 */
110 -function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '')  
111 -{  
112 -  
113 - if (trim($input_charset) != '') {  
114 - $url = $url . "_input_charset=" . $input_charset;  
115 - }  
116 - $curl = curl_init($url);  
117 - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); //SSL证书认证  
118 - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); //严格认证  
119 - curl_setopt($curl, CURLOPT_CAINFO, $cacert_url); //证书地址  
120 - curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头  
121 - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 显示输出结果  
122 - curl_setopt($curl, CURLOPT_POST, true); // post传输数据  
123 - curl_setopt($curl, CURLOPT_POSTFIELDS, $para); // post传输数据  
124 - $responseText = curl_exec($curl);  
125 - //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容  
126 - curl_close($curl);  
127 -  
128 - return $responseText; 95 +function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '') {
  96 +
  97 + if (trim($input_charset) != '') {
  98 + $url = $url."_input_charset=".$input_charset;
  99 + }
  100 + $curl = curl_init($url);
  101 + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
  102 + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
  103 + curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
  104 + curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
  105 + curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
  106 + curl_setopt($curl,CURLOPT_POST,true); // post传输数据
  107 + curl_setopt($curl,CURLOPT_POSTFIELDS,$para);// post传输数据
  108 + $responseText = curl_exec($curl);
  109 + //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
  110 + curl_close($curl);
  111 +
  112 + return $responseText;
129 } 113 }
130 114
131 /** 115 /**
@@ -137,19 +121,18 @@ function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '') @@ -137,19 +121,18 @@ function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '')
137 * @param $cacert_url 指定当前工作目录绝对路径 121 * @param $cacert_url 指定当前工作目录绝对路径
138 * return 远程输出的数据 122 * return 远程输出的数据
139 */ 123 */
140 -function getHttpResponseGET($url, $cacert_url)  
141 -{  
142 - $curl = curl_init($url);  
143 - curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头  
144 - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 显示输出结果  
145 - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); //SSL证书认证  
146 - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); //严格认证  
147 - curl_setopt($curl, CURLOPT_CAINFO, $cacert_url); //证书地址  
148 - $responseText = curl_exec($curl);  
149 - //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容  
150 - curl_close($curl);  
151 -  
152 - return $responseText; 124 +function getHttpResponseGET($url,$cacert_url) {
  125 + $curl = curl_init($url);
  126 + curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
  127 + curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
  128 + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
  129 + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
  130 + curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
  131 + $responseText = curl_exec($curl);
  132 + //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
  133 + curl_close($curl);
  134 +
  135 + return $responseText;
153 } 136 }
154 137
155 /** 138 /**
@@ -159,22 +142,18 @@ function getHttpResponseGET($url, $cacert_url) @@ -159,22 +142,18 @@ function getHttpResponseGET($url, $cacert_url)
159 * @param $_input_charset 输入的编码格式 142 * @param $_input_charset 输入的编码格式
160 * return 编码后的字符串 143 * return 编码后的字符串
161 */ 144 */
162 -function charsetEncode($input, $_output_charset, $_input_charset)  
163 -{  
164 - $output = "";  
165 - if (!isset($_output_charset))  
166 - $_output_charset = $_input_charset;  
167 - if ($_input_charset == $_output_charset || $input == null) {  
168 - $output = $input;  
169 - } elseif (function_exists("mb_convert_encoding")) {  
170 - $output = mb_convert_encoding($input, $_output_charset, $_input_charset);  
171 - } elseif (function_exists("iconv")) {  
172 - $output = iconv($_input_charset, $_output_charset, $input);  
173 - } else  
174 - die("sorry, you have no libs support for charset change.");  
175 - return $output; 145 +function charsetEncode($input,$_output_charset ,$_input_charset) {
  146 + $output = "";
  147 + if(!isset($_output_charset) )$_output_charset = $_input_charset;
  148 + if($_input_charset == $_output_charset || $input ==null ) {
  149 + $output = $input;
  150 + } elseif (function_exists("mb_convert_encoding")) {
  151 + $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
  152 + } elseif(function_exists("iconv")) {
  153 + $output = iconv($_input_charset,$_output_charset,$input);
  154 + } else die("sorry, you have no libs support for charset change.");
  155 + return $output;
176 } 156 }
177 -  
178 /** 157 /**
179 * 实现多种字符解码方式 158 * 实现多种字符解码方式
180 * @param $input 需要解码的字符串 159 * @param $input 需要解码的字符串
@@ -182,20 +161,16 @@ function charsetEncode($input, $_output_charset, $_input_charset) @@ -182,20 +161,16 @@ function charsetEncode($input, $_output_charset, $_input_charset)
182 * @param $_input_charset 输入的解码格式 161 * @param $_input_charset 输入的解码格式
183 * return 解码后的字符串 162 * return 解码后的字符串
184 */ 163 */
185 -function charsetDecode($input, $_input_charset, $_output_charset)  
186 -{  
187 - $output = "";  
188 - if (!isset($_input_charset))  
189 - $_input_charset = $_input_charset;  
190 - if ($_input_charset == $_output_charset || $input == null) {  
191 - $output = $input;  
192 - } elseif (function_exists("mb_convert_encoding")) {  
193 - $output = mb_convert_encoding($input, $_output_charset, $_input_charset);  
194 - } elseif (function_exists("iconv")) {  
195 - $output = iconv($_input_charset, $_output_charset, $input);  
196 - } else  
197 - die("sorry, you have no libs support for charset changes.");  
198 - return $output; 164 +function charsetDecode($input,$_input_charset ,$_output_charset) {
  165 + $output = "";
  166 + if(!isset($_input_charset) )$_input_charset = $_input_charset ;
  167 + if($_input_charset == $_output_charset || $input ==null ) {
  168 + $output = $input;
  169 + } elseif (function_exists("mb_convert_encoding")) {
  170 + $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
  171 + } elseif(function_exists("iconv")) {
  172 + $output = iconv($_input_charset,$_output_charset,$input);
  173 + } else die("sorry, you have no libs support for charset changes.");
  174 + return $output;
199 } 175 }
200 -  
201 ?> 176 ?>
1 <?php 1 <?php
2 -  
3 /* * 2 /* *
4 * MD5 3 * MD5
5 * 详细:MD5加密 4 * 详细:MD5加密
@@ -16,10 +15,9 @@ @@ -16,10 +15,9 @@
16 * @param $key 私钥 15 * @param $key 私钥
17 * return 签名结果 16 * return 签名结果
18 */ 17 */
19 -function md5Sign($prestr, $key)  
20 -{  
21 - $prestr = $prestr . $key;  
22 - return md5($prestr); 18 +function md5Sign($prestr, $key) {
  19 + $prestr = $prestr . $key;
  20 + return md5($prestr);
23 } 21 }
24 22
25 /** 23 /**
@@ -29,15 +27,15 @@ function md5Sign($prestr, $key) @@ -29,15 +27,15 @@ function md5Sign($prestr, $key)
29 * @param $key 私钥 27 * @param $key 私钥
30 * return 签名结果 28 * return 签名结果
31 */ 29 */
32 -function md5Verify($prestr, $sign, $key)  
33 -{  
34 - $prestr = $prestr . $key;  
35 - $mysgin = md5($prestr);  
36 - if ($mysgin == $sign) {  
37 - return true;  
38 - } else {  
39 - return false;  
40 - }  
41 -} 30 +function md5Verify($prestr, $sign, $key) {
  31 + $prestr = $prestr . $key;
  32 + $mysgin = md5($prestr);
42 33
  34 + if($mysgin == $sign) {
  35 + return true;
  36 + }
  37 + else {
  38 + return false;
  39 + }
  40 +}
43 ?> 41 ?>
1 <?php 1 <?php
2 -  
3 /* * 2 /* *
4 * 类名:AlipayNotify 3 * 类名:AlipayNotify
5 * 功能:支付宝通知处理类 4 * 功能:支付宝通知处理类
@@ -10,171 +9,131 @@ @@ -10,171 +9,131 @@
10 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 9 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
11 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考 10 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考
12 11
13 - * ************************注意************************* 12 + *************************注意*************************
14 * 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常 13 * 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
15 */ 14 */
16 15
17 require_once("alipay_core.function.php"); 16 require_once("alipay_core.function.php");
18 -require_once("alipay_rsa.function.php");  
19 require_once("alipay_md5.function.php"); 17 require_once("alipay_md5.function.php");
20 18
21 -class AlipayNotify  
22 -{  
23 - 19 +class AlipayNotify {
24 /** 20 /**
25 * HTTPS形式消息验证地址 21 * HTTPS形式消息验证地址
26 */ 22 */
27 - var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';  
28 -  
29 - /** 23 + var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
  24 + /**
30 * HTTP形式消息验证地址 25 * HTTP形式消息验证地址
31 */ 26 */
32 - var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?';  
33 - var $alipay_config;  
34 -  
35 - function __construct($alipay_config)  
36 - {  
37 - $this->alipay_config = $alipay_config;  
38 - }  
39 -  
40 - function AlipayNotify($alipay_config)  
41 - {  
42 - $this->__construct($alipay_config); 27 + var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?';
  28 + var $alipay_config;
  29 +
  30 + function __construct($alipay_config){
  31 + $this->alipay_config = $alipay_config;
  32 + }
  33 + function AlipayNotify($alipay_config) {
  34 + $this->__construct($alipay_config);
43 } 35 }
44 -  
45 /** 36 /**
46 * 针对notify_url验证消息是否是支付宝发出的合法消息 37 * 针对notify_url验证消息是否是支付宝发出的合法消息
47 * @return 验证结果 38 * @return 验证结果
48 */ 39 */
49 - function verifyNotify()  
50 - {  
51 - if (empty($_POST)) {//判断POST来的数组是否为空  
52 - return false;  
53 - } else {  
54 -  
55 - //对notify_data解密  
56 - $decrypt_post_para = $_POST;  
57 - if ($this->alipay_config['sign_type'] == '0001') {  
58 - $decrypt_post_para['notify_data'] = rsaDecrypt($decrypt_post_para['notify_data'], $this->alipay_config['private_key_path']);  
59 - }  
60 -  
61 - //notify_id从decrypt_post_para中解析出来(也就是说decrypt_post_para中已经包含notify_id的内容)  
62 - $doc = new DOMDocument();  
63 - $doc->loadXML($decrypt_post_para['notify_data']);  
64 - $notify_id = $doc->getElementsByTagName("notify_id")->item(0)->nodeValue;  
65 -  
66 - //生成签名结果  
67 - return $this->getSignVeryfy($decrypt_post_para, $_POST["sign"], false);  
68 - //写日志记录  
69 - //if ($isSign) {  
70 - // $isSignStr = 'true';  
71 - //}  
72 - //else {  
73 - // $isSignStr = 'false';  
74 - //}  
75 - //$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";  
76 - //$log_text = $log_text.createLinkString($_POST);  
77 - //logResult($log_text);  
78 - //验证  
79 - //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关  
80 - //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关  
81 - }  
82 - }  
83 - 40 + function verifyNotify(){
  41 + if(empty($_POST)) {//判断POST来的数组是否为空
  42 + return false;
  43 + }
  44 + else {
  45 + //生成签名结果
  46 + $isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
  47 + //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
  48 + $responseTxt = 'false';
  49 + if (! empty($_POST["notify_id"])) {$responseTxt = $this->getResponse($_POST["notify_id"]);}
  50 +
  51 + //写日志记录
  52 + //if ($isSign) {
  53 + // $isSignStr = 'true';
  54 + //}
  55 + //else {
  56 + // $isSignStr = 'false';
  57 + //}
  58 + //$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";
  59 + //$log_text = $log_text.createLinkString($_POST);
  60 + //logResult($log_text);
  61 +
  62 + //验证
  63 + //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
  64 + //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
  65 + if (preg_match("/true$/i",$responseTxt) && $isSign) {
  66 + return true;
  67 + } else {
  68 + return false;
  69 + }
  70 + }
  71 + }
  72 +
84 /** 73 /**
85 * 针对return_url验证消息是否是支付宝发出的合法消息 74 * 针对return_url验证消息是否是支付宝发出的合法消息
86 * @return 验证结果 75 * @return 验证结果
87 */ 76 */
88 - function verifyReturn()  
89 - {  
90 - if (empty($_GET)) {//判断GET来的数组是否为空  
91 - return false;  
92 - } else {  
93 - //生成签名结果  
94 - $isSign = $this->getSignVeryfy($_GET, $_GET["sign"], true);  
95 - //写日志记录  
96 - //if ($isSign) {  
97 - // $isSignStr = 'true';  
98 - //}  
99 - //else {  
100 - // $isSignStr = 'false';  
101 - //}  
102 - //$log_text = "return_url_log:isSign=".$isSignStr.",";  
103 - //$log_text = $log_text.createLinkString($_GET);  
104 - //logResult($log_text);  
105 - //验证  
106 - //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关  
107 - //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关  
108 - if ($isSign) {  
109 - return true;  
110 - } else {  
111 - return false;  
112 - }  
113 - }  
114 - }  
115 -  
116 - /**  
117 - * 解密  
118 - * @param $input_para 要解密数据  
119 - * @return 解密后结果  
120 - */  
121 - function decrypt($prestr)  
122 - {  
123 - return rsaDecrypt($prestr, trim($this->alipay_config['private_key_path']));  
124 - }  
125 -  
126 - /**  
127 - * 异步通知时,对参数做固定排序  
128 - * @param $para 排序前的参数组  
129 - * @return 排序后的参数组  
130 - */  
131 - function sortNotifyPara($para)  
132 - {  
133 - $para_sort['service'] = $para['service'];  
134 - $para_sort['v'] = $para['v'];  
135 - $para_sort['sec_id'] = $para['sec_id'];  
136 - $para_sort['notify_data'] = $para['notify_data'];  
137 - return $para_sort;  
138 - }  
139 - 77 + function verifyReturn(){
  78 + if(empty($_GET)) {//判断POST来的数组是否为空
  79 + return false;
  80 + }
  81 + else {
  82 + //生成签名结果
  83 + $isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
  84 + //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
  85 + $responseTxt = 'false';
  86 + if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}
  87 +
  88 + //写日志记录
  89 + //if ($isSign) {
  90 + // $isSignStr = 'true';
  91 + //}
  92 + //else {
  93 + // $isSignStr = 'false';
  94 + //}
  95 + //$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
  96 + //$log_text = $log_text.createLinkString($_GET);
  97 + //logResult($log_text);
  98 +
  99 + //验证
  100 + //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
  101 + //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
  102 + if (preg_match("/true$/i",$responseTxt) && $isSign) {
  103 + return true;
  104 + } else {
  105 + return false;
  106 + }
  107 + }
  108 + }
  109 +
140 /** 110 /**
141 * 获取返回时的签名验证结果 111 * 获取返回时的签名验证结果
142 * @param $para_temp 通知返回来的参数数组 112 * @param $para_temp 通知返回来的参数数组
143 * @param $sign 返回的签名结果 113 * @param $sign 返回的签名结果
144 - * @param $isSort 是否对待签名数组排序  
145 * @return 签名验证结果 114 * @return 签名验证结果
146 */ 115 */
147 - function getSignVeryfy($para_temp, $sign, $isSort)  
148 - {  
149 - //除去待签名参数数组中的空值和签名参数  
150 - $para = paraFilter($para_temp);  
151 -  
152 - //对待签名参数数组排序  
153 - if ($isSort) {  
154 - $para = argSort($para);  
155 - } else {  
156 - $para = $this->sortNotifyPara($para);  
157 - }  
158 -  
159 - //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串  
160 - $prestr = createLinkstring($para);  
161 - $isSgin = false;  
162 - switch (strtoupper(trim($this->alipay_config['sign_type']))) {  
163 - case "MD5" :  
164 - $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);  
165 - break;  
166 - case "RSA" :  
167 - $isSgin = rsaVerify($prestr, trim($this->alipay_config['ali_public_key_path']), $sign);  
168 - break;  
169 - case "0001" :  
170 - $isSgin = rsaVerify($prestr, trim($this->alipay_config['ali_public_key_path']), $sign);  
171 - break;  
172 - default :  
173 - $isSgin = false;  
174 - }  
175 -  
176 - return $isSgin;  
177 - } 116 + function getSignVeryfy($para_temp, $sign) {
  117 + //除去待签名参数数组中的空值和签名参数
  118 + $para_filter = paraFilter($para_temp);
  119 +
  120 + //对待签名参数数组排序
  121 + $para_sort = argSort($para_filter);
  122 +
  123 + //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  124 + $prestr = createLinkstring($para_sort);
  125 +
  126 + $isSgin = false;
  127 + switch (strtoupper(trim($this->alipay_config['sign_type']))) {
  128 + case "MD5" :
  129 + $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
  130 + break;
  131 + default :
  132 + $isSgin = false;
  133 + }
  134 +
  135 + return $isSgin;
  136 + }
178 137
179 /** 138 /**
180 * 获取远程服务器ATN结果,验证返回URL 139 * 获取远程服务器ATN结果,验证返回URL
@@ -185,22 +144,20 @@ class AlipayNotify @@ -185,22 +144,20 @@ class AlipayNotify
185 * true 返回正确信息 144 * true 返回正确信息
186 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 145 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
187 */ 146 */
188 - function getResponse($notify_id)  
189 - {  
190 - $transport = strtolower(trim($this->alipay_config['transport']));  
191 - $partner = trim($this->alipay_config['partner']);  
192 - $veryfy_url = '';  
193 - if ($transport == 'https') {  
194 - $veryfy_url = $this->https_verify_url;  
195 - } else {  
196 - $veryfy_url = $this->http_verify_url;  
197 - }  
198 - $veryfy_url = $veryfy_url . "partner=" . $partner . "&notify_id=" . $notify_id;  
199 - $responseTxt = getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']);  
200 -  
201 - return $responseTxt;  
202 - }  
203 - 147 + function getResponse($notify_id) {
  148 + $transport = strtolower(trim($this->alipay_config['transport']));
  149 + $partner = trim($this->alipay_config['partner']);
  150 + $veryfy_url = '';
  151 + if($transport == 'https') {
  152 + $veryfy_url = $this->https_verify_url;
  153 + }
  154 + else {
  155 + $veryfy_url = $this->http_verify_url;
  156 + }
  157 + $veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
  158 + $responseTxt = getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']);
  159 +
  160 + return $responseTxt;
  161 + }
204 } 162 }
205 -  
206 ?> 163 ?>
1 <?php 1 <?php
2 -  
3 /* * 2 /* *
4 * 支付宝接口RSA函数 3 * 支付宝接口RSA函数
5 * 详细:RSA签名、验签、解密 4 * 详细:RSA签名、验签、解密
@@ -16,13 +15,12 @@ @@ -16,13 +15,12 @@
16 * @param $private_key_path 商户私钥文件路径 15 * @param $private_key_path 商户私钥文件路径
17 * return 签名结果 16 * return 签名结果
18 */ 17 */
19 -function rsaSign($data, $private_key_path)  
20 -{ 18 +function rsaSign($data, $private_key_path) {
21 $priKey = file_get_contents($private_key_path); 19 $priKey = file_get_contents($private_key_path);
22 $res = openssl_get_privatekey($priKey); 20 $res = openssl_get_privatekey($priKey);
23 openssl_sign($data, $sign, $res); 21 openssl_sign($data, $sign, $res);
24 openssl_free_key($res); 22 openssl_free_key($res);
25 - //base64编码 23 + //base64编码
26 $sign = base64_encode($sign); 24 $sign = base64_encode($sign);
27 return $sign; 25 return $sign;
28 } 26 }
@@ -34,12 +32,11 @@ function rsaSign($data, $private_key_path) @@ -34,12 +32,11 @@ function rsaSign($data, $private_key_path)
34 * @param $sign 要校对的的签名结果 32 * @param $sign 要校对的的签名结果
35 * return 验证结果 33 * return 验证结果
36 */ 34 */
37 -function rsaVerify($data, $ali_public_key_path, $sign)  
38 -{  
39 - $pubKey = file_get_contents($ali_public_key_path); 35 +function rsaVerify($data, $ali_public_key_path, $sign) {
  36 + $pubKey = file_get_contents($ali_public_key_path);
40 $res = openssl_get_publickey($pubKey); 37 $res = openssl_get_publickey($pubKey);
41 - $result = (bool) openssl_verify($data, base64_decode($sign), $res);  
42 - openssl_free_key($res); 38 + $result = (bool)openssl_verify($data, base64_decode($sign), $res);
  39 + openssl_free_key($res);
43 return $result; 40 return $result;
44 } 41 }
45 42
@@ -49,15 +46,14 @@ function rsaVerify($data, $ali_public_key_path, $sign) @@ -49,15 +46,14 @@ function rsaVerify($data, $ali_public_key_path, $sign)
49 * @param $private_key_path 商户私钥文件路径 46 * @param $private_key_path 商户私钥文件路径
50 * return 解密后内容,明文 47 * return 解密后内容,明文
51 */ 48 */
52 -function rsaDecrypt($content, $private_key_path)  
53 -{ 49 +function rsaDecrypt($content, $private_key_path) {
54 $priKey = file_get_contents($private_key_path); 50 $priKey = file_get_contents($private_key_path);
55 $res = openssl_get_privatekey($priKey); 51 $res = openssl_get_privatekey($priKey);
56 - //用base64将内容还原成二进制 52 + //用base64将内容还原成二进制
57 $content = base64_decode($content); 53 $content = base64_decode($content);
58 - //把需要解密的内容,按128位拆开解密  
59 - $result = '';  
60 - for ($i = 0; $i < strlen($content) / 128; $i++) { 54 + //把需要解密的内容,按128位拆开解密
  55 + $result = '';
  56 + for($i = 0; $i < strlen($content)/128; $i++ ) {
61 $data = substr($content, $i * 128, 128); 57 $data = substr($content, $i * 128, 128);
62 openssl_private_decrypt($data, $decrypt, $res); 58 openssl_private_decrypt($data, $decrypt, $res);
63 $result .= $decrypt; 59 $result .= $decrypt;
@@ -65,5 +61,4 @@ function rsaDecrypt($content, $private_key_path) @@ -65,5 +61,4 @@ function rsaDecrypt($content, $private_key_path)
65 openssl_free_key($res); 61 openssl_free_key($res);
66 return $result; 62 return $result;
67 } 63 }
68 -  
69 ?> 64 ?>
1 <?php 1 <?php
2 -  
3 /* * 2 /* *
4 * 类名:AlipaySubmit 3 * 类名:AlipaySubmit
5 * 功能:支付宝各接口请求提交类 4 * 功能:支付宝各接口请求提交类
@@ -11,99 +10,81 @@ @@ -11,99 +10,81 @@
11 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 10 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
12 */ 11 */
13 require_once("alipay_core.function.php"); 12 require_once("alipay_core.function.php");
14 -require_once("alipay_rsa.function.php");  
15 require_once("alipay_md5.function.php"); 13 require_once("alipay_md5.function.php");
16 14
17 -class AlipaySubmit  
18 -{  
19 -  
20 - var $alipay_config;  
21 -  
22 - /**  
23 - * 支付宝网关地址  
24 - */  
25 - //var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';  
26 - var $alipay_gateway_new = 'http://wappaygw.alipay.com/service/rest.htm?'; 15 +class AlipaySubmit {
27 16
28 - function __construct($alipay_config)  
29 - {  
30 - $this->alipay_config = $alipay_config;  
31 - } 17 + var $alipay_config;
  18 + /**
  19 + *支付宝网关地址(新)
  20 + */
  21 + var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';
32 22
33 - function AlipaySubmit($alipay_config)  
34 - {  
35 - $this->__construct($alipay_config); 23 + function __construct($alipay_config){
  24 + $this->alipay_config = $alipay_config;
  25 + }
  26 + function AlipaySubmit($alipay_config) {
  27 + $this->__construct($alipay_config);
36 } 28 }
37 -  
38 - /**  
39 - * 生成签名结果  
40 - * @param $para_sort 已排序要签名的数组  
41 - * return 签名结果字符串  
42 - */  
43 - function buildRequestMysign($para_sort)  
44 - {  
45 - //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串  
46 - $prestr = createLinkstring($para_sort);  
47 -  
48 - $mysign = "";  
49 - switch (strtoupper(trim($this->alipay_config['sign_type']))) {  
50 - case "MD5" :  
51 - $mysign = md5Sign($prestr, $this->alipay_config['key']);  
52 - break;  
53 - case "RSA" :  
54 - $mysign = rsaSign($prestr, $this->alipay_config['private_key_path']);  
55 - break;  
56 - case "0001" :  
57 - $mysign = rsaSign($prestr, $this->alipay_config['private_key_path']);  
58 - break;  
59 - default :  
60 - $mysign = "";  
61 - }  
62 -  
63 - return $mysign;  
64 - }  
65 -  
66 - /** 29 +
  30 + /**
  31 + * 生成签名结果
  32 + * @param $para_sort 已排序要签名的数组
  33 + * return 签名结果字符串
  34 + */
  35 + function buildRequestMysign($para_sort) {
  36 + //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  37 + $prestr = createLinkstring($para_sort);
  38 +
  39 + $mysign = "";
  40 + switch (strtoupper(trim($this->alipay_config['sign_type']))) {
  41 + case "MD5" :
  42 + $mysign = md5Sign($prestr, $this->alipay_config['key']);
  43 + break;
  44 + default :
  45 + $mysign = "";
  46 + }
  47 +
  48 + return $mysign;
  49 + }
  50 +
  51 + /**
67 * 生成要请求给支付宝的参数数组 52 * 生成要请求给支付宝的参数数组
68 * @param $para_temp 请求前的参数数组 53 * @param $para_temp 请求前的参数数组
69 * @return 要请求的参数数组 54 * @return 要请求的参数数组
70 */ 55 */
71 - function buildRequestPara($para_temp)  
72 - {  
73 - //除去待签名参数数组中的空值和签名参数  
74 - $para_filter = paraFilter($para_temp);  
75 -  
76 - //对待签名参数数组排序  
77 - $para_sort = argSort($para_filter);  
78 -  
79 - //生成签名结果  
80 - $mysign = $this->buildRequestMysign($para_sort);  
81 -  
82 - //签名结果与签名方式加入请求提交参数组中  
83 - $para_sort['sign'] = $mysign;  
84 - if ($para_sort['service'] != 'alipay.wap.trade.create.direct' && $para_sort['service'] != 'alipay.wap.auth.authAndExecute') {  
85 - $para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));  
86 - }  
87 -  
88 - return $para_sort;  
89 - }  
90 -  
91 - /** 56 + function buildRequestPara($para_temp) {
  57 + //除去待签名参数数组中的空值和签名参数
  58 + $para_filter = paraFilter($para_temp);
  59 +
  60 + //对待签名参数数组排序
  61 + $para_sort = argSort($para_filter);
  62 +
  63 + //生成签名结果
  64 + $mysign = $this->buildRequestMysign($para_sort);
  65 +
  66 + //签名结果与签名方式加入请求提交参数组中
  67 + $para_sort['sign'] = $mysign;
  68 + $para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));
  69 +
  70 + return $para_sort;
  71 + }
  72 +
  73 + /**
92 * 生成要请求给支付宝的参数数组 74 * 生成要请求给支付宝的参数数组
93 * @param $para_temp 请求前的参数数组 75 * @param $para_temp 请求前的参数数组
94 * @return 要请求的参数数组字符串 76 * @return 要请求的参数数组字符串
95 */ 77 */
96 - function buildRequestParaToString($para_temp)  
97 - {  
98 - //待请求参数数组  
99 - $para = $this->buildRequestPara($para_temp);  
100 -  
101 - //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码  
102 - $request_data = createLinkstringUrlencode($para);  
103 -  
104 - return $request_data;  
105 - }  
106 - 78 + function buildRequestParaToString($para_temp) {
  79 + //待请求参数数组
  80 + $para = $this->buildRequestPara($para_temp);
  81 +
  82 + //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
  83 + $request_data = createLinkstringUrlencode($para);
  84 +
  85 + return $request_data;
  86 + }
  87 +
107 /** 88 /**
108 * 建立请求,以表单HTML形式构造(默认) 89 * 建立请求,以表单HTML形式构造(默认)
109 * @param $para_temp 请求参数数组 90 * @param $para_temp 请求参数数组
@@ -111,111 +92,39 @@ class AlipaySubmit @@ -111,111 +92,39 @@ class AlipaySubmit
111 * @param $button_name 确认按钮显示文字 92 * @param $button_name 确认按钮显示文字
112 * @return 提交表单HTML文本 93 * @return 提交表单HTML文本
113 */ 94 */
114 - function buildRequestUrl($para_temp)  
115 - {  
116 - //待请求参数数组  
117 - $para = $this->buildRequestPara($para_temp);  
118 - $urlArr = array();  
119 - foreach ($para as $k => $v) {  
120 - $urlArr[] = $k . '=' . $v;  
121 - }  
122 - return implode('&', $urlArr);  
123 - }  
124 -  
125 - /**  
126 - * 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果  
127 - * @param $para_temp 请求参数数组  
128 - * @return 支付宝处理结果  
129 - */  
130 - function buildRequestHttp($para_temp)  
131 - {  
132 - $sResult = '';  
133 -  
134 - //待请求参数数组字符串  
135 - $request_data = $this->buildRequestPara($para_temp);  
136 -  
137 - //远程获取数据  
138 - $sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->alipay_config['cacert'], $request_data, trim(strtolower($this->alipay_config['input_charset'])));  
139 -  
140 - return $sResult;  
141 - }  
142 -  
143 - /**  
144 - * 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果,带文件上传功能  
145 - * @param $para_temp 请求参数数组  
146 - * @param $file_para_name 文件类型的参数名  
147 - * @param $file_name 文件完整绝对路径  
148 - * @return 支付宝返回处理结果  
149 - */  
150 - function buildRequestHttpInFile($para_temp, $file_para_name, $file_name)  
151 - {  
152 -  
153 - //待请求参数数组  
154 - $para = $this->buildRequestPara($para_temp);  
155 - $para[$file_para_name] = "@" . $file_name;  
156 -  
157 - //远程获取数据  
158 - $sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->alipay_config['cacert'], $para, trim(strtolower($this->alipay_config['input_charset'])));  
159 -  
160 - return $sResult;  
161 - }  
162 -  
163 - /**  
164 - * 解析远程模拟提交后返回的信息  
165 - * @param $str_text 要解析的字符串  
166 - * @return 解析结果  
167 - */  
168 - function parseResponse($str_text)  
169 - {  
170 - //以“&”字符切割字符串  
171 - $para_split = explode('&', $str_text);  
172 - //把切割后的字符串数组变成变量与数值组合的数组  
173 - foreach ($para_split as $item) {  
174 - //获得第一个=字符的位置  
175 - $nPos = strpos($item, '=');  
176 - //获得字符串长度  
177 - $nLen = strlen($item);  
178 - //获得变量名  
179 - $key = substr($item, 0, $nPos);  
180 - //获得数值  
181 - $value = substr($item, $nPos + 1, $nLen - $nPos - 1);  
182 - //放入数组中  
183 - $para_text[$key] = $value;  
184 - }  
185 -  
186 - if (!empty($para_text['res_data'])) {  
187 - //解析加密部分字符串  
188 - if ($this->alipay_config['sign_type'] == '0001') {  
189 - $para_text['res_data'] = rsaDecrypt($para_text['res_data'], $this->alipay_config['private_key_path']);  
190 - }  
191 -  
192 - //token从res_data中解析出来(也就是说res_data中已经包含token的内容)  
193 - $doc = new DOMDocument();  
194 - $doc->loadXML($para_text['res_data']);  
195 - $para_text['request_token'] = $doc->getElementsByTagName("request_token")->item(0)->nodeValue; 95 + function buildRequestForm($para_temp, $method, $button_name) {
  96 + //待请求参数数组
  97 + $para = $this->buildRequestPara($para_temp);
  98 +
  99 + $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
  100 + while (list ($key, $val) = each ($para)) {
  101 + $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
196 } 102 }
197 103
198 - return $para_text;  
199 - }  
200 -  
201 - /** 104 + //submit按钮控件请不要含有name属性
  105 + $sHtml = $sHtml."<input type='submit' value='".$button_name."' style='display:none;'></form>";
  106 +
  107 + $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
  108 +
  109 + return $sHtml;
  110 + }
  111 +
  112 +
  113 + /**
202 * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 114 * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数
203 - * 注意:该功能PHP5环境及以上支持,因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件 115 + * 注意:该功能PHP5环境及以上支持,因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
204 * return 时间戳字符串 116 * return 时间戳字符串
205 - */  
206 - function query_timestamp()  
207 - {  
208 - $url = $this->alipay_gateway_new . "service=query_timestamp&partner=" . trim(strtolower($this->alipay_config['partner'])) . "&_input_charset=" . trim(strtolower($this->alipay_config['input_charset']));  
209 - $encrypt_key = "";  
210 -  
211 - $doc = new DOMDocument();  
212 - $doc->load($url);  
213 - $itemEncrypt_key = $doc->getElementsByTagName("encrypt_key");  
214 - $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;  
215 -  
216 - return $encrypt_key;  
217 - }  
218 - 117 + */
  118 + function query_timestamp() {
  119 + $url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(strtolower($this->alipay_config['partner']))."&_input_charset=".trim(strtolower($this->alipay_config['input_charset']));
  120 + $encrypt_key = "";
  121 +
  122 + $doc = new DOMDocument();
  123 + $doc->load($url);
  124 + $itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
  125 + $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
  126 +
  127 + return $encrypt_key;
  128 + }
219 } 129 }
220 -  
221 ?> 130 ?>
@@ -65,7 +65,9 @@ class PayController extends AbstractAction @@ -65,7 +65,9 @@ class PayController extends AbstractAction
65 UdpLog::info("【锁订单接口】,orderCode:{$orderCode}", array('prePayInfo' => $prePayInfo)); 65 UdpLog::info("【锁订单接口】,orderCode:{$orderCode}", array('prePayInfo' => $prePayInfo));
66 66
67 $totalFee = $orderDetail['data']['payment_amount'] * 100; 67 $totalFee = $orderDetail['data']['payment_amount'] * 100;
68 - $reqParams = new AliwapReqparams($orderCode, $totalFee, '有货订单号:' . $orderCode, '', $orderDetail['data']['create_time'], '', false); 68 + $reqParams = new AliwapReqparams($orderCode, $totalFee, '有货订单号:' . $orderCode, '',
  69 + $orderDetail['data']['create_time'], '', false, $orderDetail['data']['pay_expire']
  70 + );
69 $aliwapService = new AliwapService(); 71 $aliwapService = new AliwapService();
70 $payRequestPars = $aliwapService->getPayRequestPars($reqParams); 72 $payRequestPars = $aliwapService->getPayRequestPars($reqParams);
71 if (empty($payRequestPars)) { 73 if (empty($payRequestPars)) {