我能从本地主机测试PayPal API吗?

23

更新1:

根据这篇有关如何使用PHP实现PayPal即时支付通知的教程,除非打开特定路由器端口,否则PayPal无法访问本地托管的网站。这是因为该网站涉及IPN还是所有PayPal API都适用于此呢?

原始问题:

在我的笔记本电脑上,我设置了一个LAMP环境,当我使用http://localhost创建网站并进行测试,然后再发布到互联网上。

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

也许你会想,这是个愚蠢的问题,只要试一下就知道是否可以。我已经尝试过了,但它没有工作,我想排除这个问题,再进入下一步。


你从PayPal接收到错误代码了吗?你使用的是哪个API集,ExpressCheckout吗? - jishi
我收到了 Apache 类型的消息,称网站(我的本地主机)正在进行维护并已关闭... - oshirowanen
1
您可以运行一个脚本来模拟IPN本地验证,该验证将在PayPal的沙盒中进行验证。这与运行其模拟器相同:https://dev59.com/pWgu5IYBdhLWcg3wP0xm - user6972
8个回答

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"

8

2
为什么这个没有被标记起来,我不理解。猜想人们更喜欢无用的、过度复杂的变通方法,而不是简单的东西。谢谢,我知道我曾经有这个问题,但忘记尝试这个方法了。 - Shawn Rebelo
1
嗨,肖恩,我还没有尝试过这个,但很好奇。所以当我们使用PayPal的沙盒URN进行测试PayPal付款时,你是说PayPal沙盒的IPN应该能够访问http://127.0.0.1,也就是我的本地机器吗?127.0.0.1不是常见的家庭机器IP地址吗? - rajugaadu
与此同时,我会尝试这个。 - rajugaadu
这应该是正确的答案(至少对于快速结账而言)。运行得完美无缺。 - Bryan

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后,您可以使用浏览器打开该文件,然后提交此表单。


6

应该可以正常工作。 去年我与PayPal做了支付集成,在本地主机上没有问题。

你在开发中使用PayPal沙盒吗? https://developer.paypal.com/


1
确保PayPal可以访问您的本地主机上的网站。这意味着您的网站必须能够从其他机器访问。 - Mihai Frentiu
@ Mihai Frentiu,你确定这是必要的吗? - oshirowanen
6
在PayPal沙盒(例如),您必须指定一个IPN处理URL。 PayPal使用此URL调用您网站上处理IPN调用的php文件。因此,您不能将http://localhost/yourwebsite/ipn_handler.php传递到该URL中。您需要像http://your_computer_public_ip/yourwebsite/ipn_handler.php这样的内容。 - Mihai Frentiu
显然这取决于您使用的API方法。我进行直接信用卡支付调用(DoDirectPayment方法),在本地主机上运行良好。 - Burjua
你可能因为ISP拦截端口而遇到路由问题。请在这里尝试我的脚本解决方案:https://dev59.com/pWgu5IYBdhLWcg3wP0xm - user6972
显示剩余4条评论

3
它应该可以无问题地工作,但是如果您发送“无效的URL”作为返回URL和IPN消息URL,则可能会有些挑剔。这意味着,将http://localhost/cancelpaypal.php作为canelURL发送可能会告诉您它是一个无效的网址。
然而,我认为这不应该发生。
只有在IPN时需要打开路由器端口,因为正常流程中的重定向是一个普通的“Location:”标头,因此需要能够访问该站点(本地主机)的浏览器。

0

你需要注册你的本地地址,这样它才能从互联网上打开。你可以使用ngrok服务来实现。


-1

嗯,它基本上可以工作,但是你也可以设置一个临时的本地DNS条目。

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

这样当你的浏览器查询网站时,它将从你的127.0.0.1获取,有时你需要刷新DNS(/etc/init.d/nscd restart)。

就是这样了,但记得在准备生产时删除该条目。


1
这样可以将本地主机称为 YOUR computer 上的 yourwebsite.com,但 PayPal 仍然不知道如何找到 yourwebsite.com。换句话说:它并未解决问题。 - Robert Bethge
对于 owner example 中使用的 checkout 流程,Paypal 不会对 redirectUrl 进行任何操作。它只会处理请求并将用户重定向到 redirectUrl,并不会有其他操作。 - jamesjara
如果使用客户端流程,则不需要此临时域名。同样可以使用IP地址。 - Sergio Tulentsev

-4

如果要使用IPN,则必须从网络访问您的本地主机。 一种肯定有效的解决方案是使用虚拟机器,在其中安装VPN服务器,通过VPN连接您的客户端并管理虚拟主机以重定向到您的本地IP地址。 这样,如果您打开VPN,就可以从外部访问您的服务器并发送IPN。


2
完全没有必要使用虚拟机或VPN。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接