用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5801|回复: 0
收起左侧

[中级] CI框架集成支付宝

[复制链接]
发表于 2015-1-22 22:49:51 | 显示全部楼层 |阅读模式
本帖最后由 Closer 于 2015-1-22 23:37 编辑

  示例代码下载地址 http://wangwx.net/?p=21


1.注册支付宝账户,开通相关的服务(快捷支付(无线)、手机网站支付);
    获取相关的parent,key;
2.到支付宝网站https://b.alipay.com/order/techService.htm下载相关的集成资料;
3.按照资料的步骤进行集成;


一.网页端发起支付、验证流程;
1.构造请求参数
//构造要请求的参数数组
$parameter = array(
“service” => “create_direct_pay_by_user”,
“partner” => trim($alipay_config[‘partner’]),
“payment_type”=> $payment_type,
“notify_url”=> $notify_url,
“return_url”=> $return_url,
“seller_email”=> $seller_email,
“out_trade_no”=> $out_trade_no,
“subject”=> $subject,
“total_fee”=> $total_fee,
“body”=> $body,
“show_url”=> $show_url,
“anti_phishing_key”=> $anti_phishing_key,
“exter_invoke_ip”=> $exter_invoke_ip,
“_input_charset”=> trim(strtolower($alipay_config[‘input_charset’]))
);
2.对参数进行签名
<1>.除去待签名参数数组中的空值和签名参数(’sign’,’sign_type’)
<2>.对待签名参数数组排序
<3>.把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
<4>.利用key对步骤(3)生成的参数字符串进行sign_type(MD5/RSA)加密德到sign
<5>.把构造的参数数组及生成的加加密字符串sign及sign_type组装好向支付宝发起请求;

二、验证支付宝发回的消息
1.在用户支付完成后,支付宝会发送发送一个异步通知notify,网页支付的话会跳转回商户设置的return_url;
2.在支付宝通知(notify,return_url)是,需要进行两步验证,来验证是否是支付宝发起的请求;
   2.1对于notify,参数封装在$_POST里,return_url封装在$_GET里;
   2.2对返回的参数按照【步骤一】的方式进行加密,将得到的加密结果sign跟支付宝返回的$_POST[‘sign’]/$_GET[‘sign’]进行对比,如果相等则证明此数据正确;
    2.3验证此请求是否是支付宝发来的
   对 $_POST[“notify_id”]/$_GET[“notify_id”]参数进行验证,验证方法见示例DEMO里的
$this->getResponse($_GET["notify_id"]); 3.在2.2和2.3都返回正确的情况下,则可以进行用户支付成功下的处理逻辑,如开通相关的产品等;


三、手机APP支付,用的时RSA加密,验证流程跟步骤二类似,只是在加密的时候用的是RSA加密,需要额外用到商户的RSA私钥和支付宝的公钥;


四,在集成支付宝的过程中遇到的问题


问题一:在进行RSA验证的时候,openssl_get_publickey($pubKey),无法获取到pem证书的信息;
1).$pubKey = file_get_contents($ali_public_key_path);是能获取到值的;
2).服务器也支持openssl;
3).那么问题出现在哪里呢?经过一番排查后,发现同事给的.pem文件的类型是错误的,按照支付宝手册重新生成一个.pem文件后,把自己的信息拷贝进去即可;


问题二:网页支付完成后,验证签名的时候,无法通过;
经过排查,发现问题出现在paraFilter($para)这个函数里,这个函数的功能是除去数组中的空值和签名参数;
不知为何,竟然吧$_GET/$_POST里的body参数给过滤掉了,
所以在paraFilter后,加了个if(!array_key_exists('body',$para_filter) && (strlen($body)!=0)){ $para_filter['body'] = $body;};
更简单的方法可以直接修改paraFilter里的实现,修改list each为while的方式即可

示例代码下载地址:http://wangwx.net/?p=21



评分

参与人数 1威望 +3 收起 理由
Closer + 3 赞一个!

查看全部评分

本版积分规则