Google apps script 使用Google Apps脚本管理Paypal IPN
要管理IPN,有4个步骤:Google apps script 使用Google Apps脚本管理Paypal IPN,google-apps-script,paypal-ipn,urlfetch,Google Apps Script,Paypal Ipn,Urlfetch,要管理IPN,有4个步骤: 通过邮寄方式接收Paypal支付的请求信息 返回HTTP 200响应 将完整的未更改消息返回paypal 3之后从Paypal接收验证或无效 要做到这一点,有一个例子。 我为自己的需要定制了一些Romain脚本,但理念是一样的,我知道Romain与IPN有同样的问题(我正在与他联系) 问题是:我们无法验证IPN流程。HTTP响应代码处于状态405 我发现在罗马脚本中,我们在第2步之前做第3步。所以我做了一个更改,现在脚本返回一个空的答案: return Content
return ContentService.createTextOutput('');
在发回完整的未更改的paypal消息之前,我设置了一个触发器,在30秒后将消息发送到paypal:
var params = {
method: "post"
}
var req = messge from paypal;
var resp = UrlFetchApp.fetch("https://www.paypal.com/cgi-bin/webscr?"+req,params);
此代码与Romain不同,但我从Paypal收到了“已验证”的答案
所以现在我认为问题是HTTP 200响应发送回paypal,第2步。
我所做的是,通过向应用程序脚本发送我自己的post请求来检查内容、标题和响应代码中的数据。结果如下:
[15-03-25 22:50:29:753 CET]代码:200
[15-03-25 22:50:29:754 CET]内容:
[15-03-25 22:50:29:756 CET]听者:({'X-XSS-Protection':“1;
模式=块”,过期:“1990年1月1日星期五00:00:00 GMT”,
“备选方案”:“443:quic,p=0.5”,
“设置Cookie”:“NID=67=hlLDTKuNN7fjl66UwT9e2_BV0xw_dd67lZ9R337Zm2K8RYNAMzF0FjnEt0uhE0cxCzymgsH-1ehuGOgZ7pHynjWRkM1Y6n0PxXp8RAdyPKgfr-Y4CurbQodZU9ZWO;域=.googleusercontent.com;路径=/;过期=Thu,
2015年9月24日格林威治标准时间21:50:29;仅限HttpOnly“,服务器:“GSE”,
“缓存控制”:“没有缓存,没有存储,最大年龄=0,必须重新验证”,
Pragma:“无缓存”,“X-Content-Type-Options”:“nosniff”,
“X-Frame-Options”:“SAMEORIGIN”;“传输编码”:“chunked”,
日期:“2015年3月25日星期三格林威治标准时间21:50:29”,
'访问控制允许来源':“*”,P3P:“CP=\”这不是P3P策略!
看见
有关详细信息。\“”,'Content Type':“text/plain;charset=utf-8”})
我在stackoverflow上发现了这条关于http响应状态405的消息和要执行的测试:()
dopost()请求后使用appscript发送回的标头似乎格式不正确。我不确定,但现在我没有其他想法
如果有人有主意?
我想可能会在apps脚本的doPost()
末尾发送一个带有特定标题的自定义答案,但不知道如何执行此操作?编辑
在Kristoffer注释之后,如果您使用CreateHtmlOutFromFile(),它将返回一个没有重定向的页面,并且在此Paypal中将获得200 ok代码。
因此,您可以在脚本中返回:
HtmlService.createHtmlOutputFromFile('test').setSandboxMode(HtmlService.SandboxMode.IFRAME);
其中test是一个没有内容的HTML文件
先前的答案
最后我找到了解决办法。问题似乎真的是因为Paypal IPN不遵循重定向。
在Hull.it上进行的测试表明,当您不遵循重定向时,对appsscript的POST请求将返回302移动临时值,如果遵循重定向,则返回200
为了解决这个问题,我的想法是创建一个简单的脚本,将post请求转发到我的应用程序脚本,但向paypal返回200 ok响应
我用PHP编写了这个脚本,因为我可以轻松地托管它,而且我不是一个巨大的开发人员,我想在应用程序引擎上实现这一点是可能的,而不需要超越免费计划
因此,如果你有一个博客这里的代码我使用
<?php
$url = 'https://script.google.com/macros/s/ID_OF_THE_SCRIPT/exec';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
$response = curl_exec($ch);
curl_close($ch);
?>
现在在我的Paypal控制台上工作正常,我有一个200响应代码,状态为sent,当我发回消息时收到Paypal的验证,我的脚本工作正常
如果代码可以改进,我很感兴趣,但目前它正在按照我的意愿完成工作。一个简单的解决方案是使用返回,而不是使用ContentService。正如注释中所指出的,是重定向导致了错误-对此有一个字段。HtmlService没有这个问题,而且由于Paypal IPN需要的只是HTTP 200,所以返回什么并不重要 解决方案: 改变 到
我一直有一个类似的问题,也在302重定向结束。如果遇到此类问题,请确保: a) 您同时遵循Kristofer和St3ph的说明。他们确实工作 b) (我的问题)部署web应用程序时,选择以“我”的身份运行应用程序,而不是以“访问web应用程序的用户”的身份运行应用程序,如图所示 否则,由于身份验证原因,您将获得302重定向。
在步骤2中,是否希望以ContentService.MimeType.TEXT的形式获取内容?不需要。在romain中,脚本内容在我的中没有定义,但结果是相同的。我仍在调查,并使用www.hurl.it进行了测试,以向已发布的脚本发送请求。在界面上,我可以激活或不遵循重定向。如果我激活了Hull receive,则会收到一个200 ok响应代码,如果没有,则会暂时移动Hull receive 302。我认为问题是paypal ipn没有遵循重定向,没有看到200响应代码????我不知道我们是否可以检查问题是否存在???谢谢,但我已经尝试再次测试,但它不会工作,因为问题是重定向。事实上,我们需要的是,在Paypal向ipn发送200 ok代码后,google不会重定向并返回rigth。当您使用HtmlService时,不会重定向。我目前使用GAS处理Paypal IPN,没有导致任何错误。确保您测试了当前的Web应用程序URL(以/exec结尾)。使用最新的代码1(以/dev结尾)将得到302..我有点惊讶,因为我们2面临着同样的问题。我们收到IPN,这不是问题,问题是贝宝没有收到200 OK代码。您是否检查您的IPN历史记录并验证您的所有IPN是否处于已发送状态?我已经测试了所有可能的Dev exec return htmloutput return contenttext等…我的IPN上有405个,然后切换到HtmlService,这似乎解决了问题-现在我是ge
return ContentService.createTextOutput('');
return HtmlService.createHtmlOutput('').setSandboxMode(HtmlService.SandboxMode.IFRAME);