1、为了安全,支付宝建议签名在服务端进行。
实际上,支付宝签名需要将要签名的数据,转换为&号连接的URL字符串。标准SDK中,转换函数如下:
/** * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 * @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; }
纯粹用此函数转换后,结果例如
out_trade_no=r1239123129&partner=223424123239&payment_type=1
而真正的
out_trade_no="r1239123129"&partner="223424123239"&payment_type="1"
因此需要增加一个转换函数
/** * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,带有引号,用于生成启动签名 * @param $para 需要拼接的数组 * return 拼接完成以后的字符串 */ function createLinkstring_fix($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; }
这样可以正常签名了。
2、然则,签名字符串,还需要进行urlencode处理,否则你懂的。
3、最后将所有数据,包含URLencod处置的sign,组合在一起,用上面生成带引号的方法处置好。传递给APP。
剩下的就不需要说了。
4、其中有个很奇葩的东西就是¬ify_url=这块,显示成了¬ify_url= 这个请忽略。。无关大碍。