日期:2014-05-17  浏览次数:21091 次

用ASP接收Paypal的notify_url通知“偶尔”出错
向paypal提交支付申请的表单里面,我用hidden加了个notify_url的项目,value就是我要进行数据库处理的一个程序页面。
这个程序页面一般情况下没啥问题,但是偶尔会出现问题:就是paypal收到钱了,但是我这notify_url指向的Link却没有执行,导致数据库状态没更改过来。
查看日志文件,也没有保留,说明在这个异步请求里面,返回的值还是200。
当返回值是200,并且返回的字符串是“VERIFIED”的时候,我这就直接写数据库了(因为其他地方比较麻烦,我没做验证。)。
问题似乎就出在这个elseif上,因为其他错误我都写了日志的。

这个错误也不是说每次交易都出现,一般情况下是正常的。目前这个功能已经试运行了大约10天了,只出过两次错误,并且两次都是同一个用户提交了多个订单(因为我们还没做购物车),然后支付的时候明明已经付钱给paypal,但是我这数据库状态没更改过来。

如果说是因为多订单的问题,那这10天内也不止两个客户提交多个订单啊,绝大多数客户的订单都没问题的。
目前这个问题很头疼,求助。

notify_url返回的url中主要程序如下(其实就是paypal的官方文档说的那样):

VBScript code

Dim Item_name, Item_number, Payment_status, Payment_amount 
Dim Txn_id, Receiver_email, Payer_email 
Dim objHttp, str 
Dim OrderCode
'这里因为我们之前的程序员卷铺盖走人,我没办法才用querystring获取自定义订单号获取订单的ID
OrderCode=Trim(Request.QueryString("oc"))
'从PayPal 出读取POST 信息同时添加变量 "cmd? 
str = Request.Form & "&cmd=_notify-validate" 

'建议在此将接受到的信息记录到日志文件中以确认是否收到IPN 信息 
'将信息POST 回给PayPal 进行验证 
set objHttp = Server.CreateObject("Msxml2.ServerXMLHTTP") 
'set obj Http = Server.CreateObject("Msxml2.ServerXMLHTTP.4.0") 
'set obj Http = Server.CreateObject("Microsoft.XMLHTTP") 

objHttp.open "POST", "https://www.paypal.com/cgi-bin/webscr", false 
objHttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
objHttp.Send str 

Item_name = Request.Form("item_name") 
Item_number = Request.Form("item_number") 
Payment_status = Request.Form("payment_status") 
Payment_amount = Request.Form("mc_gross") 
Payment_currency = Request.Form("mc_currency") 
Txn_id = Request.Form("txn_id") 
Receiver_email = Request.Form("receiver_email") 
Payer_email = Request.Form("payer_email")
'检查通知是否合法 
if (objHttp.status <> 200 ) then 
    '写入日志,http错误
elseif (objHttp.responseText = "VERIFIED") then
    '一通验证之后执行rs.open sql,conn,1,3之类的写入数据库操作
elseif (objHttp.responseText = "INVALID") then
    '这个是服务器跟paypal核对的信息不一致的错误,paypal说是一般这是因为编码错误或者非法post变量导致。
    '这个也写入日志
else
    'paypal的官方文档说这是其他错误,我在错误日志里面没发现这个类型的错误
end if
set objHttp=Nothing




------解决方案--------------------

每一笔订单成功付款之后paypal都会向网站发送关于该订单的post字符串让网站进行数据处理,这些字符串登录paypal收款邮箱可以找到,在及时付款通知里面。

可以找到有问题订单的及时付款通知,把那些字符串拷贝出来放到本地模拟执行一下,看看问题出在哪
------解决方案--------------------
callback的url是否能PayPal返回的。最好检查一下。