【问题标题】:Manage Paypal IPN with Google Apps Script使用 Google Apps 脚本管理 Paypal IPN
【发布时间】:2015-05-30 05:13:17
【问题描述】:

管理 IPN 有 4 个步骤:

  1. 通过邮局接收Paypal付款的请求信息
  2. 返回 HTTP 200 响应
  3. 将完整的未更改消息返回到贝宝
  4. 3 后从 Paypal 收到验证或无效

为此,有一个示例here。 我根据自己的需要对 Romain 脚本进行了一些自定义,但理念是相同的,我知道 Romain 与 IPN 有相同的问题(我正在与他联系)。

问题是:我们无法验证 IPN 流程。 HTTP 响应代码的状态为 405。

我发现在第 2 步之前我们执行第 3 步的罗马脚本中。所以我进行了更改,现在脚本返回一个空答案:

return ContentService.createTextOutput('');

在发回完整的未更改的贝宝消息之前,我设置了一个触发器,该触发器在 30 秒后向贝宝发送消息:

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 响应发送回贝宝,第 2 步。 我所做的是,通过将我自己的发布请求发送到应用程序脚本来检查内容、标题和响应代码中的数据。结果如下:

[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; mode=block", Expires:"Fri, 01 Jan 1990 00:00:00 GMT", '替代协议':"443:quic,p=0.5", 'Set-Cookie':"NID=67=hlLDTKuNN7fjl66UwT9e2_BV0xw_dd67lZ9R337Zm2K8RYNAMzF0FjnEt0uhE0cxCzymgsH-1ehuGOgZ7pHynjWRkM1Y6n0PxXp8RAdyPKgfr-Y4cUrBqoDZdUib9zWo=/Expir=.googlehuT,;Expir=.googlehuT 2015 年 9 月 24 日 21:50:29 GMT;HttpOnly",服务器:"GSE", 'Cache-Control':"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", 'X-Content-Type-Options':"nosniff", 'X-Frame-Options':"SAMEORIGIN", 'Transfer-Encoding':"chunked", 日期:“格林威治标准时间 2015 年 3 月 25 日星期三 21:50:29”, 'Access-Control-Allow-Origin':"*", P3P:"CP=\"这不是 P3P 策略! 看 http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 了解更多信息。\"", 'Content-Type':"text/plain; charset=utf-8"})

我在 stackoverflow 上发现了这条关于 http 响应状态 405 的消息和要做的测试:(IPN delivery failed. HTTP error code 405: Method Not Allowed)。

在 dopost() 请求后使用 appscript 发回的标头似乎格式不正确。我不确定,但现在我没有其他想法。

如果有人有想法? 我想可能会在 doPost() 末尾使用应用程序脚本发送带有特定标题的自定义答案,但不知道该怎么做?

【问题讨论】:

  • 在第 2 步中是否期望将内容作为 ContentService.MimeType.TEXT 获取?
  • 没有必要。在 romain 脚本中,内容是在我的中定义的,但结果是相同的。
  • 我仍在调查,并且我已经使用 www.hurl.it 进行了测试,以向已发布的脚本发送请求。在界面上我可以激活或不遵循重定向。如果我激活 hurl 收到 200 ok 响应代码,如果没有 hurl 收到 302 临时移动。我认为问题 paypal ipn 不遵循重定向并且看不到 200 响应代码????我不知道我们是否可以检查是否是问题???

标签: google-apps-script paypal-ipn urlfetch


【解决方案1】:

一个简单的解决方案是使用HtmlService,而不是ContentService,来返回。如 cmets 中所述,它是创建错误的重定向 - 为此提交了一个 issue。 HtmlService 没有这个问题,而且由于所有 Paypal IPN 需要的是 HTTP 200,因此您返回的内容并不重要。

解决方案: 改变

return ContentService.createTextOutput('');

return HtmlService.createHtmlOutput('').setSandboxMode(HtmlService.SandboxMode.IFRAME);

【讨论】:

  • 谢谢,但我已经尝试再次测试它,但它不会工作,因为问题是重定向。事实上,我们需要的是 google 在 Paypal 发送 ipn 200 ok 代码后不会重定向并返回 rigth。
  • 使用 HtmlService 时没有重定向。我目前使用 GAS 处理 Paypal IPN,没有导致错误。确保您测试了 Current Web App URL(以 /exec 结尾)。使用最新代码(以 /dev 结尾)将给出 302..
  • 我有点惊讶,因为我们两个面临同样的问题。我们收到 IPN 不是问题,问题是 PayPal 没有收到 200 OK 代码。您是否检查了您的 IPN 历史记录并确认您的所有 IPN 都处于已发送状态?我已经测试了所有可能的 Dev exec return htmloutput return contenttext 等...
  • 我的 IPN 上出现 405,然后切换到 HtmlService,这似乎解决了问题 - 现在我得到 HTTP 200。我实际上是使用 createHtmlOutputFromFile('randomfile') 返回一些随机内容(带有一些文本的 div)。另外,我正在执行第 2 步之前的第 3 步 - Paypal 似乎不介意。
  • 并且 - 来自PaypalPayPal 期望在 30 秒内收到对 IPN 消息的响应。因此,您的侦听器在响应 IPN 之前不得执行耗时的操作(例如更新数据库)。
【解决方案2】:

编辑

如果您使用 createHtmlOutputFromFile(),在 Kristoffer 评论后,它将返回一个没有重定向的页面,并且在此 Paypal 中将获得 200 ok 代码。 所以在你的脚本中你可以返回:

HtmlService.createHtmlOutputFromFile('test').setSandboxMode(HtmlService.SandboxMode.IFRAME);

其中 test 是一个没有内容的 HTML 文件。

上一个答案

终于找到了解决办法。这个问题似乎真的是因为 Paypal IPN 不遵循重定向。 在 hurl.it 上进行的测试表明,当您不遵循重定向时,对应用脚本的 POST 请求会返回 302 Moved Temporary,如果您遵循重定向,则会返回 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 响应代码,状态已发送,并且我的脚本可以正常工作,因为我在发回消息时收到了来自 PayPal 的 VERFIFIED。

如果可以改进代码,我很感兴趣,但现在它正在按照我的意愿完成工作。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,也以 302 重定向结束。如果您遇到此类问题,请确保:

    a) 您同时遵循 Kristoffer 和 St3ph 的说明。他们确实有效。

    b)(我的问题)部署网络应用时,选择以“我”的身份运行应用,而不是“用户访问网络应用”,如如图所示。

    如果不这样做,您将因为身份验证原因收到 302 重定向。

    【讨论】:

    • 以“我”的身份执行应用程序 - 不起作用(至少现在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2012-12-15
    相关资源
    最近更新 更多