最近在做移动网页支付宝,下载了官方的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(),结果还是一样。百思不得其解。晚上回
来,改用将全部的参数和参数值自己拼写成字符串返回,但是打印出来的结果还是不变。终于意识到可能是¬转义了,去百度,果真找到。坑死了。。。
解决方法,采用htmlspecialchars()函数避免将¬转义了:
/** * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 * @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签名,成功。