Google apps script 使用Google Apps脚本管理Paypal IPN

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

要管理IPN,有4个步骤:

  • 通过邮寄方式接收Paypal支付的请求信息
  • 返回HTTP 200响应
  • 将完整的未更改消息返回paypal
  • 3之后从Paypal接收验证或无效
  • 要做到这一点,有一个例子。 我为自己的需要定制了一些Romain脚本,但理念是一样的,我知道Romain与IPN有同样的问题(我正在与他联系)

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

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

    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);