VBScript ASP和Paypal IPN问题

时间:2017-04-03 14:45:33

标签: asp.net paypal vbscript paypal-ipn

亲爱的导师和大师,

我的问题是基本的,它与此处的其他IPN问题类似,但我还没有看到与VBScript相关的答案(似乎PHP有点低级,因此需要做更多的工作来正确发布响应 - 或者等等我认为) 我使用ASP / VBScript的PayPal示例代码创建IPN侦听器。使用Paypal模拟器,我调用我的脚本。我似乎无法得到一个经过验证的""来自Paypal的回复,始终'无效'。我已经在互联网上阅读了很多东西(比如charset)并试了一下没有进展。关于字符集差异的答案似乎比较老,因为我没有看到任何控制字符集的地方,特别是通过模拟器。我没有看到URL编码问题,因为回发的内容仍然/已经编码(GMT +问题似乎不存在,如其他IPN问题中所述)。   我发布到https://www.paypal.com/cgi-bin/webscr(参见代码),这给了我一个握手,但发布到沙盒(注释掉)不会导致握手。当然,Paypal正在与我的网站进行通信,我修改了代码以将收到的所有表单值转储到文本文件中。只是无法获得"验证"响应。 我认为GitHub上提供的代码已经准备好了#39;我遗失了什么noobie?

    <%@LANGUAGE="VBScript"%>
<%
Dim Item_name, Item_number, Payment_status, Payment_amount
Dim Txn_id, Receiver_email, Payer_email
Dim objHttp, str
' read post from PayPal system and add 'cmd'

' post back to PayPal system to validate
'set objHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")
'set objHttp = Server.CreateObject("Msxml2.ServerXMLHTTP.4.0")
set objHttp = Server.CreateObject("Microsoft.XMLHTTP")
str = Request.Form & "&cmd=_notify-validate"
objHttp.open "POST", "https://www.paypal.com/cgi-bin/webscr", false
'objHttp.open "POST", "https://www.sandbox.paypal.com/cgi-bin/webscr", false
'objHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
'objHttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

objHttp.Send str
' assign posted variables to local variables
'Dim responseText : responseText = objHttp.responseText
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")


Dim Folderpath, fs, fPayPal, fPP, FormArray, FormStr
Set fs = CreateObject("Scripting.FileSystemObject")
Folderpath=server.mappath(".\mdb") 
fPayPal=Folderpath &"\paypal.txt"
'Payer_email = "test@test.com"
Response.Write "File:" & fPayPal
Set fPP = fs.CreateTextFile(fPayPal,True)
fPP.WriteLine("PayPal")
fPP.WriteLine(str)
FormArray = Split(str, "&", -1, 1)
for each FormStr in FormArray
fPP.WriteLine(FormStr)
Next

' Check notification validation
if (objHttp.status <> 200 ) then
' HTTP error handling
 'Response.Write "Error:"
 fPP.WriteLine("Status <> 200")
elseif (objHttp.responseText = "VERIFIED") then
 fPP.WriteLine("VERIFIED")
 fPP.WriteLine(Payer_email)
' check that Payment_status=Completed
' check that Txn_id has not been previously processed
' check that Receiver_email is your Primary PayPal email
' check that Payment_amount/Payment_currency are correct
' process payment
elseif (objHttp.responseText = "INVALID") then
' log for manual investigation
' Response.Write "INVALID"
  fPP.WriteLine("INVALID")
else
' Response.Write "OTHER ERROR"
   fPP.WriteLine("OTHER ERROR")
end if

set objHttp = nothing
fPP.Close
Set fs=nothing
%>

你看到注释的东西是我尝试的东西或github上原始代码的评论。 Paypal IPN example code

这里的结果是paypal.txt,代码写的文件。最后一行是&#34; INVALID&#34;这是因为responseText设置为&#34; INVALID&#34;通过POST调用paypal。

PayPal
payment_type=instant&payment_date=Mon%20Apr%2003%202017%2010%3A12%3A36%20GMT-0400%20%28Eastern%20Daylight%20Time%29&payment_status=Completed&address_status=confirmed&payer_status=verified&first_name=John&last_name=Smith&payer_email=buyer@paypalsandbox.com&payer_id=TESTBUYERID01&address_name=John%20Smith&address_country=United%20States&address_country_code=US&address_zip=95131&address_state=CA&address_city=San%20Jose&address_street=123%20any%20street&business=seller@paypalsandbox.com&receiver_email=seller@paypalsandbox.com&receiver_id=seller@paypalsandbox.com&residence_country=US&item_name1=something&item_number1=AK-1234&tax=2.02&mc_currency=USD&mc_fee=0.44&mc_gross=12.34&mc_gross_1=12.34&mc_handling=2.06&mc_handling1=1.67&mc_shipping=3.02&mc_shipping1=1.02&txn_type=cart&txn_id=283858647&notify_version=2.1&custom=xyz123&invoice=abc1234&test_ipn=1&verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31A4bCrzfIB.qeXiXSypZmZAhKwWUC&cmd=_notify-validate
payment_type=instant
payment_date=Mon%20Apr%2003%202017%2010%3A12%3A36%20GMT-0400%20%28Eastern%20Daylight%20Time%29
payment_status=Completed
address_status=confirmed
payer_status=verified
first_name=John
last_name=Smith
payer_email=buyer@paypalsandbox.com
payer_id=TESTBUYERID01
address_name=John%20Smith
address_country=United%20States
address_country_code=US
address_zip=95131
address_state=CA
address_city=San%20Jose
address_street=123%20any%20street
business=seller@paypalsandbox.com
receiver_email=seller@paypalsandbox.com
receiver_id=seller@paypalsandbox.com
residence_country=US
item_name1=something
item_number1=AK-1234
tax=2.02
mc_currency=USD
mc_fee=0.44
mc_gross=12.34
mc_gross_1=12.34
mc_handling=2.06
mc_handling1=1.67
mc_shipping=3.02
mc_shipping1=1.02
txn_type=cart
txn_id=283858647
notify_version=2.1
custom=xyz123
invoice=abc1234
test_ipn=1
verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31A4bCrzfIB.qeXiXSypZmZAhKwWUC
cmd=_notify-validate
INVALID

paypal simulator response

此响应仅在我发布到PayPal时可用。发布到sandbox.paypal.com并不表示发送了&#39;或者是一次握手&#39;我正在使用服务提供商提供的远程/托管网站,因此直到48小时后我才能使用这些网络日志。我通常在本地网络服务器上拥有的所有良好的调试功能都不可用(没有方法可以嗅探Paypal发布的原始数据或在远程机器上返回我知道的内容)。

1 个答案:

答案 0 :(得分:0)

我发现这是一个声明: 当您使用PayPal IPN模拟器时,您获得的响应将始终为无效。

不在我能说的文件中。如果有人可以确认,那么这个花絮会让我度过一个试用/错误的周末。

//更新 我已经学会了两件我将与社区分享的内容。 2017年使用的正确网址是: objHttp.open“POST”,“https://ipnpb.sandbox.paypal.com/cgi-bin/webscr”,false 或现场: objHttp.open“POST”,“https://ipnpb.paypal.com/cgi-bin/webscr”,false

我认为问题在于,现在的Sandbox URL只允许TLS 1.2 HTTPS连接(确保您必须使用HTTPS而不再使用HTTP)。 2017年6月,直播Paypal网址需要TLS 1.2 在objHttp.Send str发生此问题。它会在您的ASP中生成800c0005 500错误,因为Paypal Sandbox URL因服务器使用TLS 1.0和Paypal需要TLS 1.2而拒绝连接。

事实证明Godaddy(https://www.godaddy.com)托管不允许TLS 1.2如果您是“老客户”。我们在2009年与他们一起启动了Windows虚拟主机。我们不是更新我们托管下面的服务器是最新的,因为我们正在支付服务,他们认为我们分数购买了“旧服务器”并且坚持使用它。现在我们需要付费才能升级。尽管新客户在正常的最新服务器上托管的每月费用实际上低于我们现在的价格。

请注意社区。我花了一周的时间在这上面。您无法看到HTTPS握手,因此用户无法了解提供商的限制。

确认。曾经进入一个支持TLS 1.2的新(2017)服务器。需要开始新的网络托管,因为Godaddy不会更新您现有的帐户或您所拥有的网站下的服务器软件/操作系统。