[PHP]误读支付宝接口可能引发的乌龙

------------------------------------------------------------------------------------

之所以发现这个坑,源起项目中的支付宝页面跳转同步通知页return_url中的$verify_result始终返回false。

$alipayNotify = new Alipaynotify($alipay_config); //支付宝通知处理类

$verify_result = $alipayNotify->verifyReturn();

verifyReturn函数用于针对return_url验证消息是否是支付宝发出的合法消息

其中生成签名结果一项,$isSign = $this->getSignVeryfy($_GET, $_GET[‘sign‘]);返回true或false

getSignVeryfy是获取返回时的签名验证结果,该函数做以下三件事(调用的均为支付宝公用函数):

1. 除去待签名参数数组中的空值和签名参数,paraFilter

2. 对签名参数数组排序,argSort

3. 把数组所有元素,按照‘参数=参数值’的模式用“&”字符拼接成字符串,createLinkstring

4. 如果是MD5加密,使用md5Verify验证签名,返回true或false

第1,2两步都没有问题,到第3步时,我们所期待的结果是这样子的:

而打印后返回的结果是这样的:

显然,这里转换出了问题,下面来看一下createLinkstring函数的具体实现

/**
 * 把数组所有元素,按照"参数=参数值"的模式用“&”字符拼接成字符串
 * @param $para 需要拼接的数组
 * return 拼接完成以后的字符串
 */
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;
}

上面连接字符串部分使用foreach实现都不影响$arg, substr使用rtrim实现也不影响$arg, get_agic_quotes_gpc在5.4以上才废弃,但是里面不存在转义字符;再看上面打印的结果,很有可能是 “&” 符号出了问题,程序部分将 “&” 符改为 “&” 后终于得到了期望的结果。

$arg .= $key ."=".$val ."&";

大家猜想一下,如果把上面的双引号改为单引号后,能不能得到期望的结果,如下(回复中解答):

$arg .= $key .‘=‘.$val .‘&‘;

另外,出现这种情况不排除PHP版本问题,大家试过之后不妨留言告诉我 你们的情况。

异步通知url和同步通知url中都不能有自定义参数,由于提交支付宝时的参数加密与跳转商家页面的验证加密机制是一致的,所以一旦url中含有自定义参数,导致提交前与提交后不相等,$verify_result将返回false,即无法通过验证;不通过这一步验证,商户的数据操作始终无法进行,如果就此忽略$verify_result必然存在安全问题。

对于mvc形式的动态url,需要去除提交时不需要的参数,保证干净,如:

  unset($_GET[‘controller‘]);

  unset($_GET[‘method‘]);

  $alipayNotify = new Alipaynotify($alipay_config);

  $verify_result = $alipayNotify->verifyReturn();

  if($verify_result) {

    //验证成功(商户逻辑代码)

  } else {

    //验证失败(调试请看Alipaynotify.php页面的verifyReturn函数)

  }

  

  同步url的参数保证了干净,同样别忘了提交时不要带有,如:

  unset($_GET[‘controller‘]);

  unset($_GET[‘method‘]);

  $this->load->library(‘Alipaysubmit‘);

  $alipay_config = $this->alipay_config;

  $alipaySubmit = new Alipaysubmit($alipay_config);

  ...

  

  为什么异步notify_url会失效?

  如果异步notify_url地址是mvc形式,因为你的控制器和方法已经被支付宝过滤掉,那么支付宝将找不到页面,所以无法通知到这个指定的地址。

Link:http://www.cnblogs.com/farwish/p/4309520.html

@黑眼诗人 <www.farwish.com>

时间: 2024-10-07 06:13:33

[PHP]误读支付宝接口可能引发的乌龙的相关文章

wap支付宝接口的问题

今天在支付宝接口开发时,遇到的两个坑 第一个: https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.8nHr4i&treeId=62&articleId=103740&docType=1 支付宝的PC版即时到账接口中,发起的请求可带此参数extra_common_param 公用回传参数 String(100) 如果用户请求时传递了该参数,则返回给商户时会回传该参数. 于是,不管在同步或者异步通知中,均

对代理ARP技术的误读、无法完成代理ARP实验的故障分析

对代理ARP技术的误读.无法完成代理ARP实验的故障分析 问题的提出:     网络工程技术人员和或者学习者面对ARP代理技术时,通常能理解ARP代理的作用和技术要点是什么,但是无法根据技术描述去实现ARP代理的功能!   首先来看一般对代理ARP的定义: 通常根据上述文字的描述,就意味着在如图1所示的环境中,主机192.168.2.2/24可以在不配置默认网关的情况下成功的与路由器R2的192.168.3.2/24通信.其实这种理解是没有错的,但是当用户使用实验来证实代理ARP的作用时,结果却

(实用篇)php支付宝接口用法分析

本文实例讲述了php支付宝接口用法.分享给大家供大家参考.具体分析如下: 现在流行的网站支持平台,支付宝当仁不让的老大了,现在我们就来告诉你如何使用支付宝api来做第三方支付,把支付宝放到自己网站来, alipay_config.php配置程序如下: <?php */ //alipay_config.php 配置程序 $interfaceurl = "https://www.alipay.com/payto:"; $sitename = "网站名称"; $we

转载:PHP支付宝接口RSA验证

这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SDK,PHP确实可以实现RSA方式的签名,这点其实很重要,由于不熟悉,在遇到困难的时候,经常会不由自主地想到是否PHP不支持RSA签名,干脆用MD5得了,这样就没有了前进的动力.其实说穿了MD5和RSA签名,不同的只是签名方式的区别,其他的都一样,因此我这里主要说一下如何用RSA进行签名和验签. 首先你需要

Android 开发之Android 应用程序如何调用支付宝接口

1.到支付宝官网,下载支付宝集成开发包 由于android设备一般用的都是无线支付,所以我们申请的就是支付宝无线快捷支付接口.下面是申请的地址以及下载接口开发包的网址:https://b.alipay.com/order/productDetail.htm?productId=2014110308141993(如果链接失效,你可以到支付宝官网商家服务模块中找到 快捷支付(无线)这个服务.)  下载集成开发包(http://download.alipay.com/public/api/base/W

YunCart电商网站支付宝接口出现500错误

yuncart 是一套易与集成的php开源商城系统,方便多人同时经行二次开发,Yuncart 可以以非常方便的方式切换到sql server,oracle等数据库,大小1.9MB,感兴趣的朋友,可以去官网下载. 最近帮朋友用php做了一个电商网站,化妆品方面的.上网看了相关方面的程序源码,最后选择了yuncart,它轻量.简单.功能丰富等特点,闲暇时,做了些修改.下面就今天出现的问题,简单的说下,希望能帮助到有类似问题的童鞋. 下图为我朋友的网站:  问题描述:       在网站上购买支付成功

支付宝接口开发提示错误代码 invalid-signature 错误原因: 无效签名

今天做支付宝接口开发,参照官方的实例代码,但是一直提示报错:错误代码 invalid-signature 错误原因: 无效签名 而官方的例子却不报错,经过反复的测试发现,是因为官方代码里参数是通过POST赋值的 $out_trade_no = trim($_POST['WIDout_trade_no']);//商户订单号,商户网站订单系统中唯一订单号,必填 $subject = trim($_POST['WIDsubject']);//订单名称,必填 $total_amount = trim($

支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url

原文:http://blog.csdn.net/m13666368773/article/details/6888513/ 支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类. 1-服务器通知(支付宝通知我们的服务器),对应的参数为notify_url,支付宝通知使用POST方式 2-页面跳转通知(支付成功后,从支付宝跳转到指定的地址),对应的参数为return_url,支付宝通知使用GET方式 (通知地址不需要像以前一样去账户内设置,而

网站支付宝接口错误代码:TRADE_DATA_MATCH_ERROR怎么处理?

网站支付宝接口错误代码:TRADE_DATA_MATCH_ERROR怎么处理? 做过支付宝支付接口应该都知道,这是因为订单重复的原因所造成. 今天在处理客户一网站的时候,经客户反馈,在顾客通过支付宝提交订单出现“错误代码:TRADE_DATA_MATCH_ERROR”,经过在支付宝对接平台手册上的查阅问题出在,顾客已经在支付宝平台上将订单生成,只是还未支付就关闭了的支付窗口,在次进入客户网站会员后台点击支付,这时候出现了上面的错误代码“TRADE_DATA_MATCH_ERROR”,这说明肯定这