除了我们的常规处理之外,我们还集成了我们网站的客户通过PayPal使用购物车结账的选项,使用PayPal IPN和PDT的组合来记录交易。我们已经完成了将近一年的代码,它可靠地工作并且符合预期。但是,由于这个原因,直到最近,我们一直非常犹豫是否要实施它:我们无法确定任何合理的方法来从PayPal结帐后返回或检索项目选项值。
我们必须有这些项目选项。例如,我们有一个稍微复杂的系统,当用户添加项目(例如 T 恤)时,有两个项目选项 ID 指示 T 恤的颜色和尺寸。这些在退还给我们之前会从PayPal中剥离出来,这意味着我们只获得一般项目,而不是客户订购的具体项目。
这是我们的困境:
1) 虽然文档明确指出您可以发送带有项目选项信息的PayPal on0_和os0_变量,但我们无法确定任何方法将其返回给您。下面是项目返回值的精简示例。
这将发送到PayPal:
<input type="hidden" name="item_number_1" value="10272">
<input type="hidden" name="amount_1" value="19.95">
<input type="hidden" name="shipping_1" value="3.55">
<input type="hidden" name="quantity_1" value="1">
<input type="hidden" name="on0_1" value="15001">
<input type="hidden" name="on1_1" value="14000">
这是从PayPal返回的(剥离为仅包含相关的项目信息):
Post Vars: Array
(
[item_number1] => 10272
[num_cart_items] => 1
[mc_handling1] => 3.55
[mc_shipping1] => 3.55
[item_name1] => [Complete Item Description...]
[mc_gross_1] => 25.00
[transaction_subject] => Shopping Cart[complete item description]
[payment_gross] => 25.00
[ipn_track_id] => 4f3054cc843ba
)
2)据我了解,有一个自定义字段。单个自定义域。但是,我们的客户的购物车中可以有 10 件或更多商品,大多数商品都有一到三个商品选项。因此,我们必须创建一个可解析的项目 ID、选项和数字伪数组作为文本字符串,以放置在自定义字段中,以便简单地将项目的选项返回给我们。这种笨拙的解决方法似乎是我们得到的"最佳机会"选项,但它也不可行,因为有 256 个字符的限制,所以我们不能依赖返回的信息。
3)因此,如果我是对的,我们无法接收或检索项目选项变量的返回。但是,如果PayPal只是在结账后将客户返回到我们的网站,那么我们仍然可以检索会话变量,其中确实包含完整的购物车信息。因此,当PayPal重定向用户时,我们可以获取信息。除非用户签出,否则他们不会自动重定向到PayPal,相反,重定向的选择是可选的,并且在结帐后很容易错过一个小的链接 - 这意味着在技术上无论如何都不可靠。
最终,我们继续接受PayPal,不得不手动检索 PayPal.com 上每个客户的项目选项,并且只需在重定向页面中具有代码即可正确填充来自 DID 选择重定向的用户的订单,填充我们合理可以填充的订单。我们有大约一百个订单,其中很少有人真正重定向回我们的网站。
4)我们尝试在隐藏的输入字段中传递自定义变量,但是,根据PayPal的文档,这些变量似乎在返回之前被剥离了。
5) 对于我们来说,为每个单击"PayPal"的用户创建自定义数据库记录以存储信息以便在 IPN 返回时进行检索是不现实或不可行的。这不是一个解决方案。
更新:6)根据用户的建议,我们尝试通过在此处使用一些文档来调用PayPal的GetTransactionDetails()。这没有返回项目选项,而是返回一个类似于 PDT 中以以下格式返回的数组:
[40] => L_NUMBER0=10100
如果我们找不到解决此问题的可接受解决方案,我们可能不得不再次关闭PayPal选项。我们根本无法确定任何返回项目选项值的实际方法,但是使用 PayPal 的购物车系统,我们绝对必须让用户离开我们的网站完成结账,并且完整的购物车数据不会返回给我们,因此我们似乎无法记录完整的客户交易,除非我们想存储每个点击"PayPal"按钮的人的交易数据。这是对的吗?
有什么方法可以完成我们缺少的吗?如果PayPal的购物车解决方案是结账的最佳方式,为什么PayPal不返回购物车的数据?
这就是我所做的。
1) 创建订单标识符并将用户购买的所有商品存储到表中。在理想的系统中,您销售的每种可能的商品组合都有一个SKU(库存单位),例如:
- 绿色 T 恤与外星人印花
- 绿色 T 恤,带鱼印花
- 红色 T 恤,饰有外星人印花
因此,根据订单 ID,您将存储这些 SKU ID、数量、任何其他信息,即是否有折扣
。2)将发票ID传递给PayPal,然后您可以在IPN上调用它。
3)对于没有完全完成付款过程的用户,您可以创建一个cron作业来清除不需要的数据。每隔一段时间针对订单初始化的时间运行它,如果该订单早于设定的时间量(因为PayPal可能会延迟),则将其从表中删除。
diggersworld 有"正确"/最佳答案; 将购物车信息作为挂单放在表(或其他商店)中,以便您可以检索它(通过发票 ID),如果没有提供 PDT 信息的退货,则在获得 IPN 时完成它。
不过,还有很多很多其他方法可以剥掉这只猫的皮。其他一些:
-
GetTransactionDetails文档说它返回项目选项信息;当你得到IPN消息时调用它,以获取你在原始IPN中没有得到的特定PayPal字段
-
使用一些 JavaScript 将您的选项选择信息复制/塞入您的项目描述中(然后在处理 IPN 时将其解析回来)
-
切换到使用快速结账,以便始终重定向客户(预付款),并且您可以在调用DoEC后使用会话变量创建订单,就像使用其他付款方式
一样
但正如diggersworld所说,一般来说,要求你的支付提供商处理(甚至通过)任意复杂的实体并不是最好的途径。Visa不关心你的T恤尺寸和颜色,PayPal也不应该。如果您的履行流程需要这样做,那么您就没有最坚实的基础。