最近在做移动网页支付宝,下载了官方的demo,配置好后集成到项目中去,运行结果一直报错 ILLEGAL_SIGN,看提交的参数,发现sign一直为空,于是开始排查错误。

  发现demo中的createLinkstring()方法得到的结果中notify_url这个参数一直被改成ify_url:

/**
 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
 * @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;
}

  刚开始以为是其中“去掉转义”函数stripslashes()导致的,但将其注释掉后仍是一样。实际上,经过while()方法处理后就出现问题,于是自己放弃while方法,改用foreach(),结果还是一样。百思不得其解。晚上回

来,改用将全部的参数和参数值自己拼写成字符串返回,但是打印出来的结果还是不变。终于意识到可能是&not转义了,去百度,果真找到。坑死了。。。

  解决方法,采用htmlspecialchars()函数避免将&not转义了:

/**
 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
 * @param $para 需要拼接的数组
 * return 拼接完成以后的字符串
 */
function createLinkstring($para) {
    $arg  = "";
    while (list ($key, $val) = each ($para)) {
        $arg.=htmlspecialchars($key."=".$val."&");
    }
    //去掉最后一个&字符
    $arg = substr($arg,0,count($arg)-6);    
    //如果存在转义字符,那么去掉转义
    if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}    
    return $arg;
}

  这个问题解决后,发现sign一直为空,原因在于rsa签名需要用到商户私钥,而在alipay.config.php配置文件中的私钥路径未配置正确,将其改为绝对路径即解决问题:‘E:\xxx\xxx\key\rsa_private_key.pem’

$alipay_config['private_key_path']    = 'key/rsa_private_key.pem';//错误写法
 接下来又出现签名错误ILLEGAL_SIGN,暂时还没有找到原因,果断改到md5签名,成功。
 
posted on 2016-06-17 23:06  微笑女孩  阅读(1333)  评论(0编辑  收藏  举报