23

更新 1:

根据本教程使用 PayPal 的即时付款通知与 PHP,除非打开某些路由器端口,否则 PayPal 无法访问本地托管的网站。这是因为该网站是关于IPN还是所有 PayPal API 都是如此?

原始问题:

在我的笔记本电脑上,我有一个LAMP环境设置,当我在http://localhost上线之前使用它来创建网站时。

对于一个新项目,我需要使用 PayPal API。如果我将笔记本电脑连接到互联网,是否可以使用 localhost 测试 PayPal API?还是我必须将我的网站上传到其他地方的 LAMP 主机?

你可能在想,多么愚蠢的问题,试试看它是否有效。我已经尝试过了,但它不起作用,我想在进行下一步之前排除这个问题。

4

7 回答 7

21

如果您想调试您的 IPN 代码,您需要以某种方式公开您的服务器。这样 PayPal 可以在您提交请求后稍后异步回发到您的服务器。通常我认为这很快(在 15 秒内),但可能会更长。

我发现使开发服务器公开可用的一种简单方法是使用此列表中的隧道解决方案,例如boringproxy。这使您可以像往常一样在 IDE 中继续开发,在调试模式下运行代码。当 PayPal 回发到您的端点时,您可以在 IDE 中对其进行调试。这些服务为您完成了这项工作,因此无需任何技术知识即可轻松完成。

据我了解,这是使用“反向 SSH 隧道”完成的,它允许您的网站通过已经公开可用的服务器代理它来公开。请注意,在您执行此操作之前,您必须考虑到一旦您的网站公开,不仅 PayPal 可以访问您的网站,任何人都可以访问,因此请首先考虑到这一点。

此外,如果您有自己的面向公众的域并且不介意使用 SSH 在终端中玩耍,那么您可以执行类似这个 shell 脚本的操作(从这个 gist 复制

# Usage: show <local-port> <subdomain>
function show() {
    DOMAIN=".yourdomain.com"
    REMOTE="$2$DOMAIN"
    ssh -tR 1080:127.0.0.1:$1 vps "sudo ssh -Nl \$USER -L $REMOTE:80:127.0.0.1:1080 localhost"
}

要使其按上述方式工作,您需要将以下内容放入您的 ~/.ssh/config 文件中:

Host vps
    HostName <server address>
    User <server username>

如果您不想(或不能)这样做,那么以下方法将起作用:

SERVERUSER="<server username>"
ssh -l $SERVERUSER -tR 1080:127.0.0.1:$1 <server address> "sudo ssh -Nl \$SERVERUSER -L $REMOTE:80:127.0.0.1:1080 localhost"
于 2012-07-17T12:08:20.043 回答
8

PayPal 的官方开发者页面中描述了一种简单的解决方案:

developer.paypal.com - 本地 IPN 测试

诀窍在于编写一个包含以下内容的小 HTML 文件:

<form target="_new" method="post" action="https://www.YourDomain.com/Path/YourIPNHandler.php">

<!-- start example variables: -->

<input type="hidden" name="SomePayPalVar" value="SomeValue1"/>
<input type="hidden" name="SomeOtherPPVar" value="SomeValue2"/>
    
<!-- /end example variables -->

<input type="submit"/>
	
</form>

要获得真正的结果,您需要复制 PayPal 发送的所有 IPN 变量。这些真实变量可以在 PayPal 帐户的 IPN 历史记录下找到:

IPN 历史

您需要单击相关消息 ID,然后复制“IPN 消息”内容(类似于 mc_gross=27.00&invoice=Test-1&protection_eligibility=Ineligible&...),必须将其转换为 HTML 隐藏输入字段。例如:

<input type="hidden" name="mc_gross" value="27.00"/>
<input type="hidden" name="invoice" value="Test-1"/>
<input type="hidden" name="protection_eligibility" value="Ineligible"/>

....

设置所有这些变量并更改操作 URL 后,您可以使用浏览器打开文件,然后提交此表单。

于 2015-01-24T16:00:24.757 回答
7

如果http://localhost不验证使用http://127.0.0.1

于 2012-05-06T09:14:43.207 回答
6

它应该工作。去年我与贝宝进行了支付集成,它在本地主机上运行没有问题。

您是否使用贝宝沙箱进行开发? https://developer.paypal.com/

于 2011-04-01T08:53:55.240 回答
3

它应该可以正常工作,但是如果您为返回 URL 和 IPN 消息 URL 发送“无效 URL”,它可能会变得很挑剔。这意味着,将http://localhost/cancelpaypal.php作为 cancelURL 发送可能会告诉您这是一个无效的 url。

然而,我认为不应该。

只有 IPN 需要打开路由器端口,因为正常流程中的重定向是常规的“Location:”标头,因此您的浏览器需要能够访问该站点(本地主机)

于 2011-04-01T09:10:00.497 回答
-1

嗯,它最有效,而且,你可以设置一个临时的本地 dns 条目。你所要做的就是:

  1. 打开你的 /etc/hosts
  2. 添加一个新条目:yourwebsite.com 127.0.0.1

因此,当您的浏览器查询将从您的 127.0.0.1 中获取时,您需要刷新 dns(/etc/init.d/nscd 重启)。

仅此而已,但请记住在准备好进行生产时删除该条目。

于 2017-01-09T07:52:41.233 回答
-4

要使用 IPN,您的 localhost 必须从 Web 访问。一种绝对有效的解决方案是使用虚拟机,安装 VPN-Server,通过 VPN 连接您的 Clinet 并管理虚拟主机以重定向到您的本地 IP 地址。这样,如果您打开 VPN,您的服务器就可以从外部访问,并且可以发送 IPN。

于 2012-01-07T10:09:55.620 回答