1
Sunyanzi 2015-01-23 04:58:50 +08:00 2
输出的数组格式没问题 ... 所以原因只可能有三点 ...
第一检查你的 api key 有没有写对 ... 就是附在待签名部分尾巴上的那个 ... 第二你的待签名字符串根本没有打全让人怎么看 ... 第三也是可能性最大的一点 ... ¬ 在 html 里面是 ¬ 这个符号 ... 如果你是通过 HTML 跳转支付宝的时候记得转义 URL ... 细心比什么都重要 ... |
2
Sunyanzi 2015-01-23 05:02:19 +08:00
咦我刚知道 V2 居然不转义 HTML 的吗 ... @Livid 这是个 feature 还是个 bug ..?
我是说 &not 在 HTML 里面是 ¬ 这个符号 ... 这会干扰到 notify 传值 ... |
6
xoxo 2015-01-23 08:31:18 +08:00 1
这个是不是因为楼主用了框架( $_GET['a'] $_GET['c'] )? 然后支付宝验签直接取的$_GET、$_POST
|
7
baocaixiong 2015-01-23 09:30:39 +08:00 1
@xoxo
如果框架对$_GET和$_POST修改过,需要重新赋值回来的。 |
8
cevincheung 2015-01-23 09:37:21 +08:00 1
|
9
konakona OP @Sunyanzi
@xoxo @cevincheung @baocaixiong 这个是发送过去的SIGN验证不通过,不是callback或者notify的时候,我这边不通过。 没有用http_build_query(),处理待签名数字和生成签名,都是用的官方DEMO里的函数。(本来我是自己写的,但是签名一直有问题,索性就将官方DEMO中的关键函数整个移植到了我的代码中,以肯定2者的处理方式一模一样) 所有数组ksort了,去掉了空格,生成了a=b&b=c&c=d这样的格式。 ` /** * 生成要请求给支付宝的参数数组 * @param $para_temp 请求前的参数数组 * @return 要请求的参数数组字符串 */ private function buildRequestParaToString($para_temp) { //待请求参数数组 $para = $this->buildRequestPara($para_temp); dump($para); //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码 $request_data = createLinkstringUrlencode($para); dump($request_data); return $request_data; } /** * 生成签名结果 * @param $para_sort 已排序要签名的数组 * return 签名结果字符串 */ private function buildRequestMysign($para_sort) { //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 $prestr = $this->createLinkstring($para_sort); $mysign = md5($prestr . $this->alipay_secret_key); return $mysign; } /** * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 * @param $para 需要拼接的数组 * return 拼接完成以后的字符串 */ private function createLinkstring($para) { $arg = ""; while (list ($key, $val) = each($para)) { $arg .= $key . "=" . $val . "&"; } //去掉最后一个&字符 $arg = substr($arg, 0, count($arg) - 2); //如果存在转义字符,那么去掉转义 if (get_magic_quotes_gpc()) { $arg = stripslashes($arg); } return $arg; } ` |
10
cevincheung 2015-01-23 15:19:01 +08:00
@konakona
function get_payment_url($trade_id,$price) { $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."?action=notify"; $partner = 'xxxx'; $secret = 'xxxxxxxxx'; $p = array(); $p['logistics_type'] = 'EXPRESS'; $p['logistics_fee'] = '0'; $p['logistics_payment'] = 'BUYER_PAY_AFTER_RECEIVE'; $p['service'] = 'create_direct_pay_by_user'; $p['partner'] = $partner; $p['_input_charset'] = 'utf-8'; $p['notify_url'] = $url; $p['return_url'] = $url; $p['out_trade_no'] = $trade_id; $p['subject'] = "支付订单 {$trade_id}"; $p['payment_type'] = 1; $p['seller_id'] = $partner; //$p['total_fee'] = $price; $p['price'] = $price; $p['quantity'] = 1; $p['body'] = "支付订单 {$trade_id}"; ksort($p); $sign_str = null;foreach ($p as $k=>$v) $sign_str .= "{$k}={$v}&";$sign_str = substr($sign_str,0,-1); $p['sign'] = md5($sign_str.$secret); $p['sign_type'] = 'MD5'; $query_string = http_build_query($p); return 'https://mapi.alipay.com/gateway.do?'.$query_string; } 签名的值不能经过urlencode |
11
konakona OP @Sunyanzi
=.= 果然..我刚刚恍然大悟...尼玛用HTML生成的含有¬被转义后的URL肯定访问不了..现在已经OK了! |
12
Sunyanzi 2015-01-23 16:28:12 +08:00
|