不幸的是,Paypal 社区论坛支持似乎并不活跃 - 有许多未解决的问题,而我的问题从未得到任何答案。
待付款在实际环境中很常见,尤其是在您的帐户未经过全面验证但无法在沙盒中进行测试的情况下。因此,我对我的生活环境进行了大量的观察和反复试验。希望这个答案可以帮助其他人避免在他们的实际环境中进行测试。
对于订阅/计费计划或定期(一次性)付款,未决付款的管理方式不同。
有两种不同的 webhook 需要支持:
1. PAYMENT.CAPTURE.COMPLETED 用于定期付款,并有一个status,您可以使用它来检查付款状态,可以是 COMPLETED、PENDING 或 FAILED(以及其他)。
见:Webhook event names - payments v2
对于 PAYMENT.CAPTURE.COMPLETE,pending 和 on hold 似乎是一回事。
2。 PAYMENT.SALE。* 用于订阅,此处待处理的付款是(或应该)使用不同的 webhook 管理的。
见:Webhook event names - sales
-
PAYMENT.SALE.COMPLETED 销售完成。
-
PAYMENT.SALE.DENIED 销售状态从待处理变为拒绝。
-
PAYMENT.SALE.PENDING 销售状态变为待处理。
付款可以直接到 COMPLETED,它们可以从 PENDING 到 COMPLETED 或从 PENDING 到 DENIED。
我认为,后者是指客户未确认购买 - 可能他们想要退款但懒得通过该流程。
但是,我刚刚注意到 Paypal 为暂停的付款发送了两次 PAYMENT.SALE.COMPLETED webhook。一次没有任何迹象表明付款被搁置,第二次表明资金已释放。
这是我收到的两个示例(匿名)webhook 请求:
第一次通知:付款已完成,但没有表明资金被搁置:
{
"id": "WH-99J09075X12340123-12X4860914197212Z",
"event_version": "1.0",
"create_time": "2021-08-27T02:05:34.170Z",
"resource_type": "sale",
"event_type": "PAYMENT.SALE.COMPLETED",
"summary": "Payment completed for $ 15.0 USD",
"resource": {
"id": "5X123412X12341234",
"state": "completed",
"amount": {
"total": "15.00",
"currency": "USD",
"details": {
"subtotal": "15.00"
}
},
"payment_mode": "INSTANT_TRANSFER",
"protection_eligibility": "ELIGIBLE",
"protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE",
"transaction_fee": {
"value": "0.96",
"currency": "USD"
},
"invoice_number": "",
"custom": "REF-017089",
"billing_agreement_id": "I-5X8313XXYYZZ",
"receipt_id": "I-12342635535001234",
"create_time": "2021-08-27T02:04:51Z",
"update_time": "2021-08-27T02:05:11Z",
"links": [],
"soft_descriptor": "PAYPAL *MY COMPANY"
},
"links": [],
"paypal": {}
}
第二次通知:付款现已发布
{
"id": "WH-99J09075X12340123-12X4860914197211Z",
"event_version": "1.0",
"create_time": "2021-09-16T17:22:12.797Z",
"resource_type": "sale",
"event_type": "PAYMENT.SALE.COMPLETED",
"summary": "Payment completed for $ 15.0 USD",
"resource": {
"id": "5X123412X12341234",
"state": "completed",
"amount": {
"total": "15.00",
"currency": "USD",
"details": {
"subtotal": "15.00"
}
},
"payment_mode": "INSTANT_TRANSFER",
"protection_eligibility": "ELIGIBLE",
"protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE",
"payment_hold_status": "RELEASED",
"transaction_fee": {
"value": "0.96",
"currency": "USD"
},
"invoice_number": "",
"custom": "REF-017089",
"billing_agreement_id": "I-5X8313XXYYZZ",
"receipt_id": "I-12342635535001234",
"create_time": "2021-08-27T02:04:51Z",
"update_time": "2021-09-16T17:22:12Z",
"links": [],
"soft_descriptor": "PAYPAL *MY COMPANY"
},
"links": [],
"paypal": {}
}
看到第二个通知有payment_hold_status,现在已发布,但第一个通知没有payment_hold_status。
在我的实施中,为避免多次计算付款,我将忽略此通知。如果有人有更好的解决方案,请给我留言。谢谢!
注意:
付款从待处理到完成可能需要长达 3 周的时间,而且用户通常需要确认他们收到了他们的产品,因此您需要交付待处理的付款。 Paypal 应该将钱存放在托管中,只要他们满意订单是合法的,您就应该拿到钱。见:https://www.paypal.com/us/smarthelp/article/how-do-i-get-my-money-sooner-for-a-transaction-on-hold-faq3743