分享

写回答

发帖

[提问] windows主机中支付宝接口问题

GoDaddy GoDaddy 1031 人阅读 | 9 人回复

发表于 2011-2-11 17:13:34 | 显示全部楼层 |阅读模式

各位好:

我使用windows主机,最近在网站上集成了支付宝asp即时到帐接口,支付过程一切正常,但是那个服务器异步通知页就是无法返回信息,请教一下,是不是GD的空间接收不到支付宝的服务器发过来的请求??

说明一下,接口的返回页工作正常,支付正常,就是当用户提前关闭了页面而导致网站数据库无法更新时,异步通知页无法补单.

望有经验的朋友指点迷津!

回答|共 9 个

lsok

发表于 2011-2-11 18:10:39 | 显示全部楼层

顶一下.
RAKSmart

帅哥小强

发表于 2011-2-11 20:18:08 | 显示全部楼层

我的GD空间支付宝集成应用是很正常的,你说的是提前关闭了支付宝页面(这个不太可能)或返回后的页面吗?程序中途中断,当然不能更新数据库,只能手动更新,为什么买家要提前关闭?是不是那个页面反应速度太慢?那是个代码很少的集成页面,一闪就过了,数据库瞬间更新了,哪个买家的手那么快那么准关了它?为什么要那么快那么准地去提前关闭它?

lsok

发表于 2011-2-11 20:48:36 | 显示全部楼层

呵呵,多谢! 不过,用户有时确实是会提前关闭页面,导致网站数据无法更新的,这就是一种"掉单"的原因,所以就需要这个服务器异步通知页来"补单".

当然,我们都希望用户不会这么快关闭页面,甚至也可以在一些帮助页面中明确提示用户支付成功后需等待页面跳转回网站相应页面,但是这种情况还是会发生,所以这个服务器异步通知页就很重要了.

我查看了所有支付宝社区上相关的贴子,还是没有解决.下面是我的通知页代码,能帮我看一下哪里有错误吗? 程序很简单的.

<!--#include file="conn.asp"-->
<%
        '功能:支付宝主动通知调用的页面(服务器异步通知页面)
        '版本:3.1
        '日期:2010-10-29
        '说明:
        '以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
        '该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
       
''''''''''''页面功能说明'''''''''''''''''''
'创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
'该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
'该页面调试工具请使用写文本函数log_result,该函数已被默认开启,见alipay_notify.asp中的函数notify_verify
'TRADE_FINISHED(表示交易已经成功结束,通用即时到帐反馈的交易状态成功标志);
'TRADE_SUCCESS(表示交易已经成功结束,高级即时到帐反馈的交易状态成功标志);
'该服务器异步通知页面面主要功能是:对于返回页面(return_url.asp)做补单处理。如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
'''''''''''''''''''''''''''''''''''''''''''
%>

<!--#include file="alipay_config.asp"-->
<!--#include file="class/alipay_notify.asp"-->

<%
'计算得出通知验证结果
verify_result = notify_verify()

if verify_result then        '验证成功
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '请在这里加上商户的业务逻辑程序代码
       
        '——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    '获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
       
    order_no                = request.Form("out_trade_no")        '获取订单号
    total_fee                = request.Form("total_fee")                '获取总金额
        extra_common_param = request.Form("extra_common_param")  '获取客户的注册用户名

       
        if request.Form("trade_status") = "TRADE_FINISHED" or request.Form("trade_status") = "TRADE_SUCCESS" then
               
                '判断该笔订单是否在商户网站中已做过处理,如果做过处理,则不执行程序
                dim rsd
        set rsd=server.createobject("ADODB.RECORDSET")
        rsd.open "select * from payzfb where ordnum='"&order_no&"' and username='"&extra_common_param&"' order by ID desc",conn,1,3,1
                 
           if rsd.eof or rsd.bof then
                 
                 rsd.addnew
                 rsd("ordnum")=order_no
                 rsd("ordsta")=1
                 rsd("username")=extra_common_param
                 rsd.update
                 
                 rsd.close
                 set rsd=nothing
               
       
                 dim rs
         set rs=server.createobject("ADODB.RECORDSET")
         rs.open "select * from account where buser='"&extra_common_param&"'order by btime asc",conn,1,3,1


         if rs.eof or rs.bof then

           rs.addnew
                    rs("balance")=total_fee
                        rs("byue")=total_fee
                        rs("balhelp")="网银支付"
                        rs("buser")=extra_common_param
                        rs("btime")=DateAdd("h",15,now())
                   rs.update
                 
                 
                 else
                 
         rs.movelast '获得该客户最新余额
         zuiyue=rs("byue")
   
                        rs.addnew
                        rs("balance")=total_fee
                        rs("byue")=zuiyue+total_fee
                        rs("balhelp")="网银支付"
                        rs("buser")=extra_common_param
                        rs("btime")=DateAdd("h",15,now())
                        rs.update
                         

          end if
                  
                  rs.close
                  set rs=nothing
                  
        end if
       
               
                response.Write "success"        '请不要修改或删除
               
                '调试用,写文本函数记录程序运行情况是否正常
        'log_result("这里写入想要调试的代码变量值,或其他运行的结果记录")
        else
                response.Write "success"        '其他状态判断。普通即时到帐中,其他状态不用判断,直接打印success。
                '调试用,写文本函数记录程序运行情况是否正常
                'log_result ("这里写入想要调试的代码变量值,或其他运行的结果记录")
        end if
        '——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
       
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
else '验证失败
    response.Write "fail"
        '调试用,写文本函数记录程序运行情况是否正常
        'log_result ("这里写入想要调试的代码变量值,或其他运行的结果记录")
end if
%>
RAKSmart

lsok

发表于 2011-2-11 20:49:22 | 显示全部楼层

这一段是我的程序:

'判断该笔订单是否在商户网站中已做过处理,如果做过处理,则不执行程序
                dim rsd
        set rsd=server.createobject("ADODB.RECORDSET")
        rsd.open "select * from payzfb where ordnum='"&order_no&"' and username='"&extra_common_param&"' order by ID desc",conn,1,3,1
                 
           if rsd.eof or rsd.bof then
                 
                 rsd.addnew
                 rsd("ordnum")=order_no
                 rsd("ordsta")=1
                 rsd("username")=extra_common_param
                 rsd.update
                 
                 rsd.close
                 set rsd=nothing
               
      
                 dim rs
         set rs=server.createobject("ADODB.RECORDSET")
         rs.open "select * from account where buser='"&extra_common_param&"'order by btime asc",conn,1,3,1


         if rs.eof or rs.bof then

           rs.addnew
                    rs("balance")=total_fee
                        rs("byue")=total_fee
                        rs("balhelp")="网银支付"
                        rs("buser")=extra_common_param
                        rs("btime")=DateAdd("h",15,now())
                   rs.update
                 
                 
                 else
                 
         rs.movelast '获得该客户最新余额
         zuiyue=rs("byue")
   
                        rs.addnew
                        rs("balance")=total_fee
                        rs("byue")=zuiyue+total_fee
                        rs("balhelp")="网银支付"
                        rs("buser")=extra_common_param
                        rs("btime")=DateAdd("h",15,now())
                        rs.update
                        

          end if
                  
                  rs.close
                  set rs=nothing
                  
        end if

帅哥小强

发表于 2011-2-11 21:48:44 | 显示全部楼层

哦,lsok兄,我用的是ACCESS数据库,不知道是不是比SQL数据库更快,这是其一,另外,我没有使用select*from这样的方式,而是直接用SELECT 字段from,也没有使用rs.addnew新增数据的方式,我是将支付宝返回的几项数据直接写入买家订购的订单并修改状态,然后跳转到该买家订单列表页面并显示该订单已付款,付款按钮关闭。返回页面里只有很短的几行代码,远没有您的这么多,不知道怎么回事,需要高人来指点,您是不是也可以试着把支付宝给的判断代码移到页未或是数据库写入(或更新)代码之后,试试看如果中断,支付宝会不会再次发送数据。

[ 本帖最后由 帅哥小强 于 2011-2-11 10:12 PM 编辑 ]

评分

参与人数 1威望 +2 金币 +5 银币 +6 收起 理由
add.c + 2 + 5 + 6 助人为乐

查看全部评分

lsok

发表于 2011-2-12 09:54:48 | 显示全部楼层

非常感谢你,我的返回页程序可能笨拙了些,不过执行正常,所以不太可能是这里的问题,不过我再按你说的方法试试吧.

再有: 下面这段接口中原来的代码我未修改过,这里应该没问题吧?你的通知页代码这里是如何处理的?

response.Write "success"        '请不要修改或删除
               
                '调试用,写文本函数记录程序运行情况是否正常
        'log_result("这里写入想要调试的代码变量值,或其他运行的结果记录")
        else
                response.Write "success"        '其他状态判断。普通即时到帐中,其他状态不用判断,直接打印success。
                '调试用,写文本函数记录程序运行情况是否正常
                'log_result ("这里写入想要调试的代码变量值,或其他运行的结果记录")
        end if
        '——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
else '验证失败
    response.Write "fail"
        '调试用,写文本函数记录程序运行情况是否正常
        'log_result ("这里写入想要调试的代码变量值,或其他运行的结果记录")
end if
%>

帅哥小强

发表于 2011-2-12 17:29:02 | 显示全部楼层

LSOK兄说谢客气了,因为时间关系,我也不能仔细去探讨这个问题。返回页面代码多、以及数据库例遍时间更长只是给买家一个提前关闭的机会,它的确算不上是个问题,支付宝集成文件里提示说用户可以根据自己的实际情况进行修改,您的返回页面可能需要做些调整,包括该页面所包含的其它集成文件要一起调出来做调整和修改,我的思路是将支付宝异步补单验证的相关代码修改到写数据库之后,或者尽量靠页尾,这样至少可以保证数据库没来得及写入时异步验证不会给支付宝正确信号的吧,我记得原来的范本文件中是把验证文件包含在页头写数据库之前的,验证了却来不及写数据库就被顾客中断了,支付宝就不会补单了,订单也就没有机会更新。简单的移动它们估计是不行,要把几个相关文件一起拆散了做修改,然后自己将订单价格修改成1角钱去做测试,我用了多次1角钱修改测试集成,没扣手续费。
实在不行的话,要联系支付宝技术部门请求专业帮助,问题可能会得到更快解决。

lsok

发表于 2011-2-13 12:25:57 | 显示全部楼层

非常感谢你的耐心帮助,不过时间紧张,不打算在这上面花时间了.支付过程也是很流畅的,估计掉单的机率不高,而且就算真的掉单了,也可以提示用户要求查帐,这个应该不是问题.

总体的感觉是支付宝的这个接口比较麻烦,不像网银在线,很简单的接口.不过网银在线收费太高,而且可能公司要垮了,因为彻底取消了单笔扣费的接口,如果想用,至少需要几千元的"预存费用"。

lsok

发表于 2011-2-13 18:36:16 | 显示全部楼层

今天看到了访问日志,终于发现了支付宝服务器的几次通知确实发送了,只是显示500错误,这证明是我的通知页程序有问题. 修改了程序,正在测试.不过还有一点疑问,接口文档中关于通知页的说明有这一句:

"必须保证页面上无任何字符,如空格、HTML标签、开发系统自带抛出异常提示信息等"

这个"无任何字符"的含义是什么?是除了“success”之外不能输出任何字符?还是连程序中需要的任何字符也不允许?就像我的通知页中有向数据表写入“网银支付”这样的字符,这个也不行吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则