- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前通过 PayPal _xcart 方法有一个完整的购物车和结帐流程,但我想将其迁移到 REST API,主要是因为我想降低价格劫持的可能性。目前,我的 IPN 确实会检查价格插孔并设置相应的标志,因此不会下载产品(仅销售数字产品)。更重要的是,我发现 PayPal 文档非常困惑,我正在努力完全掌握它。
这是我到目前为止所理解和解决的。
使用我的 PHP 脚本(我们称之为页面 A)我创建了购物车内容,然后我创建了一个新的 PayPal 销售并将客户重定向到 PayPal 以进行身份验证
在 PayPal 上进行客户端身份验证,然后将其重定向回我的站点到页面 B(页面 B 在页面 A 中定义)
页面 B 需要获取 PaymentID(来自页面 A)并使用它来有效地完成交易。一旦完成结帐。
现在这是我的问题:
a) 我已经阅读了很多论坛和教程,他们都提到我应该使用 session 来存储页面 A 的 PaymentId,然后在页面 B 中使用它来完成交易。 SO 上的一些线程建议 PayPal 实际上应该在对页面 B 的调用中包含 PaymentID,以及 token 和 PayerID。这些都是将近 3 年前的帖子,在我的测试过程中,我发现 PayPal 现在也确实返回了 PaymentID。
b) 在页面 B 上,当我执行付款时,我得到一个很好的 JSON 作为响应,但同时我的 IPN 监听器也被调用,这让我很困惑。我可以/应该只信任 JSON 响应中的所有数据并或多或少地忽略 IPN 监听器吗?这对于即时下载很有意义,例如,更容易处理,或者我是否仍应依赖 IPN 进行数据验证?
最佳答案
Can/Should I just trust all the data which is in the JSON response and more or less ignore the IPN listener?
是的,也不是。按照这个顺序。
简而言之,您不能信任调用“页面 B”时的支付 ID(它可能是伪造的、伪造的、重复的等),但您可以信任 YourServer->PayPalServer 的响应,因为它不能被最终用户拦截和伪造。
所以你的过程是(正如你上面描述的)
此时对于简单的销售,状态应该是“完成”;但是(与下面的 IPN 一样)您应该验证这一点。
请检查金额,以防万一。它们应该匹配,但如果不匹配,PayPal 将是您收到的,您可以接受、标记它(并打电话)或通过 API 退款并拒绝订单等。
那么为什么要有 IPN?
用户有可能在 Paypal 上完成交易,然后在调用“页面 B”之前关闭浏览器。在这种情况下,您了解订单的唯一方式是通过 IPN。
如果您的 IPN 处理程序收到 IPN 通知,IPN 仍然可以伪造,但验证方式略有不同。
您实际上将 IPN 信息发送回 Paypal(服务器到服务器),Paypal 确认它是正确的还是错误的 (https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNIntro/)。然后您的 IPN 处理程序将检查交易 ID(是的,这就是您使用的)并验证数据库中的所有匹配项(就像您在“页面 B”中所做的那样)。如果是,则在状态为已完成的情况下将订单标记为已完成(如果尚未在“页面 B”中标记为已完成)。
显然,此时您不能向用户显示任何内容,因为他们不是调用该页面的用户。
上面的文档警告您可以为同一笔交易获得多个 IPN,因此您还需要检查状态。
(注意:您可以像在“页面 B”中那样使用 API 来验证 transactionID)。
那为什么不在 IPN 上回复呢?
Paypal 警告 IPN 可能无法到达。 Paypal 解释得最好:
Although PayPal usually processes IPN messages immediately, IPN is not synchronized with actions on your website. Internet connectivity is not always 100% reliable and IPN messages can be lost or delayed. The IPN service automatically resends messages until the listener acknowledges them. The service resends messages for up to 4 days.
Because IPN is not a real-time service, your checkout flow should not wait for the IPN message before it is allowed to complete. If the checkout flow is dependent on receiving an IPN message, processing can be delayed by system load or other reasons. You should configure your checkout flow to handle a possible delay.
回到最初的问题
是的:依靠您进行的 JSON(服务器-> 服务器)调用来验证“页面 B”的参数(如果您选择的话,还有 IPN 处理程序)
否:不要忽略 IPN,以防永远不会调用页面 B。但仍然在这里运行验证检查。
是:“页面 B”和“IPN 处理程序”的检查状态 = 完成
是的:使用 Paypal TransactionID,但使用自定义字段或 sessionID 混合到您自己的数据库中。
是的,您可以/将同时收到页面 B 和 IPN 通知,如果付款已标记为已完成,我建议忽略 IPN,否则请适当处理。他们应该使用相同的数据库。
关于php - 如何使用 PayPal REST API 和 IPN 验证销售,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36667232/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!