PayPal单项目自适应支付

PayPal单项目自适应支付,paypal,Paypal,我开发了一个小API,它使用PayPal自适应支付创建一个支付链 以下是我当前发送给PayPal的JSON正文: { actionType: "PAY", currencyCode: currency_code, feesPayer: "SECONDARYONLY", memo: product_name, receiverList: { receiver: [{ amount: payment_amount,

我开发了一个小API,它使用PayPal自适应支付创建一个支付链

以下是我当前发送给PayPal的JSON正文:

{
    actionType: "PAY",
    currencyCode: currency_code,
    feesPayer: "SECONDARYONLY",
    memo: product_name,
    receiverList: {
        receiver: [{
            amount: payment_amount,
            email: primary_email,
            primary: true
        }, {
            amount: payment_amount-(0.03*payment_amount),
            email: secondary_email,
            primary: false
        }]
    },
    returnUrl: "http://example.com/payment-success",
    cancelUrl: "http://example.com/payment-cancel",
    requestEnvelope: {
        errorLanguage: "en_US"
    },
    trackingId: product_id
}
它工作得很好。将全额发送给主用户,然后将全额的97%发送给辅助用户

尽管如此,我还是希望我的每一件物品的数量始终为
1
。我的网站是动态的,允许用户随时以自己的价格、名称等创建项目。我想在有人与PayPal签出后,在我的网站上将项目标记为
已购买
,这样就没有人可以再次购买,从而删除
购买
按钮


我知道如何使用Webhooks(由PayPal提供)实现这一点,但如果两个或多个用户同时按下我网站上的“购买”按钮并在PayPal上签出,该怎么办?

在这种情况下,您需要自己控制并发性,因为PayPal在adaptive payments中的付款尝试时不提供此唯一性验证

以下是如何将控件置于前端

  • 为前端的每个动态购买按钮生成唯一的
    invoiceId
  • 使用购买按钮收集付款详细信息(收款人、金额、发票ID等),并将有效负载发布到API操作页面(当用户提交购买按钮时)
  • 在API操作页面中,验证并保存
    invoiceId
    字段以避免重复的puschase尝试(将状态设置为
    ordered
    ),然后调用PayPal
    pay
    API调用以生成
    pay-KEY
    。将
    invoiceId
    放入PayPal回调和交易报告中的
    有效负载:接收者
    对象中,以便跟踪:

  • 买家通过
    支付密钥重定向并完成交易

  • Webhook/IPN被触发,您会将数据库条目标记为已购买
  • 关于步骤#3的说明

    • 在这个流程中,您的购买按钮实际上有3种状态:1-可用、2-订购、3-购买,这样您就可以始终作为一次购买来控制它
    • 如果买家在步骤4中放弃(取消或AFK或关闭浏览器),您可以在3小时后清除
      ordered
      状态(PayPal
      PAY-KEY
      lifecycle)

    这似乎是一种非常合乎逻辑的方法,但不幸的是,它根本不起作用。如果我的应用程序的一个用户不喜欢另一个用户,并决定点击
    purchase
    购买他们的所有物品,该怎么办?因此,不允许其他用户购买这些项目,因为它们将在my DB中标记为
    已购买
    。然后在接下来的3个小时内,他们只需再次单击购买按钮即可重新启动3个小时。这只是一个示例,意味着您可以根据您的用例自定义步骤#3中的任何规则,例如,制作唯一的
    invoiceId userId
    对,以便每个买家都有一次购买机会。PayPal(或者一般来说,支付)产品在这方面不会有任何进一步的帮助,你需要建立一个竞价系统来让它工作。
    receiverList: {
        receiver: [{
            amount: payment_amount,
            email: primary_email,
            invoiceId: uniqueId,
            primary: true
        }, {
            amount: payment_amount-(0.03*payment_amount),
            email: secondary_email,
            primary: false
        }]
    },