2016-06-22 2 views
1

Я разработал небольшой API, который использует PayPal Adaptive Payments для создания цепочки платежей.PayPal Adaptive Payments с одним товаром

Вот мой текущий JSON тело, Я посылаю к PayPal:

{ 
    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. Мой сайт динамичен и позволяет пользователям создавать элементы все время с их собственной ценой, именем и т. Д. Я хотел бы отметить товар как purchased на моем сайте после того, как кто-то проверит с PayPal, чтобы никто не смог его снова купить, следовательно удалив кнопку purchase.

Я понимаю, как это сделать с помощью Webhooks (предоставляется PayPal), хотя, если два или более пользователей нажимают кнопку purchase на моем веб-сайте и одновременно проверяют с PayPal?

ответ

1

В этом случае вам нужно будет поместить собственный contorl над параллелизмом, так как PayPal не предоставляет эту проверку уникальности при попытках оплаты в адаптивных платежах.

Вот как вы можете поместить элемент управления в переднем конце

  1. Создать уникальный invoiceId для каждой кнопки динамической покупки на переднем конце
  2. Соберите информацию о платеже (приемники, количество, InvoiceID, и т. д.) с помощью кнопки покупки и отправьте полезные данные на страницу действия API (когда пользователь отправит кнопку покупки).
  3. В вашей странице действия API, проверки & сохранения (в базу данных) на invoiceId поля, чтобы избежать дублированных попыток puschase (размещение статуса ordered), а затем вызвать PayPal pay API вызов для генерации PAY-KEY. Поместите invoiceId в payload:receiver объекта для отслеживания цели в обратный вызов 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 
        }] 
    }, 
    
  4. Покупатель перенаправляется с PAY-KEY и завершает транзакцию

  5. Webhook/IPN срабатывает и вы пометить вашу запись в базе данных как purchased

Обратите внимание на шаге 3,

  • В этом потоке есть на самом деле 3 состояние вашей кнопки покупки: 1 доступной, 2 упорядоченных, 3-купили, таким образом, у вас есть контроль над ним всегда как одну покупкой
  • Incase покупатель падает (отмены или AFK или закрытия браузера) в шаге # 4, вы можете очистить ordered состояние после 3-х часов (PayPal PAY-KEY жизненного цикла)
+1

это действительно кажется очень логичным подходом, хотя, к сожалению, это просто просто не будет работать. Что делать, если пользователь моего приложения не любил другого пользователя и решил нажать «купить» для всех своих товаров?Поэтому другим пользователям не разрешат приобретать эти предметы, поскольку они будут помечены как «приобретенные» в моей БД. Затем в течение еще 3 часов они могут просто просто нажать кнопку покупки снова, чтобы возобновить 3 часа. – Fizzix

+0

Это всего лишь пример и означает, что вы можете настроить любое правило на шаге 3 в своем прецеденте, например. создавать уникальные пары 'invoiceId-userId', чтобы каждый покупатель имел один шанс приобрести. Продукты PayPal (или вообще, оплата) больше не помогут в этой перспективе, вам необходимо создать систему торгов, чтобы она работала тогда. –

Смежные вопросы