向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返回的。最好检查一下。