是否有合乎逻辑的方法可以从标准购物车结帐中的PayPal返回项目选项字段


Is there no logical way to return item option fields from PayPal in a standard cart checkout?

除了我们的常规处理之外,我们还集成了我们网站的客户通过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也不应该。如果您的履行流程需要这样做,那么您就没有最坚实的基础。