【转】PHP 做支付宝支付接口 总结

发布时间:2012-4-3浏览:

核心提示:【转】PHP 做支付宝支付接口 总结

以前曾写过一篇关于 paypal 支付接口的文章:  ,   这两天做了关于支付宝接口的测试, 看似不太一样,但支付接口都是一样的,

其业务逻辑都是:   订单详情 -> 提交接口 -> 返回信息 -> 更新本站订单信息  的流程 !

现在写支付宝接口时也有一些个问题:

1. 攻击者是否可以通过伪造一个数据 POST 或 GET 上来导致订单状态被修改呢? 这是第一个担心 !

    其一  这个问题在支付宝接口里完美解决的,在 notify_url.php 或 return_url.php 接收数据时,同时也认证了是否从支付宝官方传来的信息,这信息包含了支付宝保密的加密算法, 这基本上避免了另外的域名或伪造数据攻击。

    其二  如果攻击都应付 10 元 , 而其在提交过程中将数据进行修改为 1 元, 并支付成功,此时订单是不能支付成功的,所以为了避免此种攻击,在 notify 里最好还是做一个总价格的核对。

 

2. notify_url.php 模块儿为什么接收不到数据?

    这个问题可能有很多种原因,但可以通过写日志的方法来判断和调试这个文件,因为这个文件是用来接收支付宝传来的信息的,所以首先要确认这个页面在公网可以访问,另外里面不要有任何的 SESSION 和 COOKIE  的存在, 我遇到的问题却是,这个页面只有登录的会员才可访问,结果让人调试了好半天才找到原因所在,因为我自己是登录后操作的,所以这个问题很隐蔽 !

 

3.  支付宝官方并没有提供给用户收货的接口,那怎么办呢?

    经过我测试,完全可以通过, 支付接口引导用户到支付宝上确认收货,支付宝会通过订单状态来引导你做进一步操作的

4.  我的操作已经在本站和支付宝方产生订单,但没有付款,现在再本站直接支付会新建一个新的订单吗?

    经过我的测试,不会有新订单产生,只要你站上的订单号等订单信息没有改变,你传到支付宝这些数据时,支付宝也会做一个判断的,看你的订单是否已存在,如果存在就是直接转入支付,否则就是先建立订单再转入支付流程 !

 

这两天也就这些心得了,记录一下,分享给朋友,如有问题,可以留言讨论下,一起成长

 

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

以下是解决以上问题查的相关资料:

 

使用支付宝对企业金流接口的注意事项--URL参数警报
  现在许多企业与组织都有网上卖东西的需求,而在线付款成为B2C的最大难题,因为银行不能能直接与那么多企业(而且是中小企业)实施技术对接,幸好有类似支付宝这样的中间件,这个问题才得以解决,但是在付款给支付宝时,有一个“URL参数问题”,如果处理不当,就会给粗心的接口使用者造成损失。

  这样讲的意思是:如果支付宝可以更加严谨的处理或B2C企业技术人员能够严谨处理,这个损失是可以避免的。

  为了说明问题所在,先说一下支付宝接口在处理客户付款时的流程:

  1.顾客浏览B2C网站并选择产品,并点击类似“支付宝支付”的按钮--2.B2C网站后台程序处理,根据顾客所选商品金额、订单号等信息生成URL,跳转至支付宝网站--3.支付宝网站根据URL参数生成付款数额,用户在支付宝界面选择网银并支付给支付宝--4.支付宝收到银行款项,将款项打入B2C企业的支付宝帐户,并主动访问B2C网站的一个页面,将付款结果以参数形式返回给该页--5.该页面接收到参数后,根据URL MD5验证与付款状态成功字段,修改订单状态为“已付款”--6.B2C网站管理员看到“已付款”后发货。

  问题出在步骤2与步骤5。

  首先说说步骤2的具体环节:B2C网站按照支付宝接口的要求,将商品金额、订单号码等参数拼接为一个URL,并将此URL参数的MD5值做为最后一个参数(应该是支付宝那边做验证用)传递给支付宝网站,支付宝网站根据参数中的信息生成付款项。而URL中的所有参数都是明文传递的,虽然有MD5值做校验,但无法防止人为修改URL中的参数。攻击者完全可以在下完订单后,获得此URL并修改订单金额参数的值,并生成新的MD5校验值,而后拼接新的URL传递给支付宝,这样一来,一张订单的应付款项就被修改了。

  再来说说步骤5:B2C网站的程序员在接收到反馈后,发现付款状态为成功,就会更新整张订单状态为“已付款”,而往往忽略了一个及其重要的事情,那就是检测用户付款数额!因为支付宝只保证某订单是否付款成功,而并不能保证付款数额为订单额!(原因上面说的很清楚了)

  解决方案:

  支付宝公司改进方面:将URL参数以可逆密文形式传递,算法保密,不可对企业程序人员开放!

  B2C企业方面:接收到支付宝反馈后,如果付款标志为“True”,先不要急于更新订单状态,要判断一下付款金额是否为订单额,然后在处理。


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

经检查,您收到我们发来的通知后,反馈给我们乱码的字符。由于乱码变成三个问号了,所以也不知反馈给我们的是什么字符。

出现错误的原因(仅供参考)
原因:
通知页面文件(参数notify_url对应的页面文件)由于程序抛出异常、页面文件无法访问等原因致使通知页面中的程序没有执行完毕

检查方法:
步骤一:检查服务器配置
参考检查方向:
1、服务器是否开启写入权限、
2、DNS解析,是否能够解析支付宝IP。支付宝IP范围是:121.0.26.0~121.0.26.255(支付宝主站所使用的IP地址是:121.0.26.11,支付宝主站备用IP地址:110.75.132.21、110.75.134.101,支付宝通知信息的IP主地址:121.0.26.1、121.0.26.2、121.0.27.1、121.0.27.2、110.75.130.1、110.75.130.2、110.75.132.1、110.75.132.2、110.75.136.1、110.75.136.2)
3、防火墙是否有拦截
4、端口443或80是否有开启,且不是假死状态,也没有被占用
5、服务器的IP地址是否有做过更换,详细可参考:
http://club.alipay.com/read.php?tid=8687408
步骤二:检查notify_url页面文件
1、notify_url的路径互联网上可以访问得到,确保访问到该页面时,页面没有为空白或开发软件自带系统提示错误信息
2、有且只有输出success,notify_url页面必须保证为空白页面,无任何HTML标签、空格、回车换行等字符。
各开发语言输出success代码:
ASP.NET:Response.Write("success");
ASP:response.write "success"
PHP:echo "success";
JAVA:out.println("success");
3、notify_url不要有seesion或cookies,不要做页面自动跳转
步骤三:必须把接口放置在服务器里做调试
步骤四:notify_url的路径互联网上可以访问得到,确保访问到该页面时,页面没有为空白或开发软件自带系统提示错误信息
步骤五:完成一笔1分钱(0.01)的支付
步骤六:检查程序运行到alipay_notify文件的return_verify()函数中,在mysign与sign是否相等的判断与responseTxt是否为true(PHP代码:$veryfy_result)的判断这两个判断上,是哪个判断出了问题
步骤七:检查程序运行到商户网站自己编写的业务逻辑处理程序代码段时,断点调试或使用写日志函数(函数名:log_result)逐行检查代码,监控各个参数变量

另:http://www.v2you.com/index.php/vip/notify_url页面请不要加自动跳转的程序代码,如:登陆验证的判断


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

notify 接收的$_POST 信息:


Array
(
    [discount]   => 0.00
    [payment_type] => 1
    [subject]   => 产品名称
    [trade_no]   => 支付宝订单号
    [buyer_email]  => 购买者支付宝帐叼
    [gmt_create]  => 2011-07-29 13:49:30
    [notify_type]  => trade_status_sync
    [quantity]   => 1
    [out_trade_no]  => 商家订单号
    [body]   => 产品不错
    [notify_time]  => 2011-07-29 13:49:30
    [seller_id]  =>
    [trade_status]  => WAIT_BUYER_PAY
    [is_total_fee_adjust] => Y
    [total_fee]  => 0.01
    [seller_email]  =>
    [price]   => 0.01
    [buyer_id]   =>
    [notify_id]  =>
    [use_coupon]  => N
    [sign_type]  => MD5
    [sign]  =>
)


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

只有下了订单之后才会得到上面的值

 http://hi.baidu.com/zwfec/blog/item/52b56d092915c1d53bc763aa.html


前一篇:定做程序设计
后一篇:Vs2008评估期的处理方法
分享到: