关于paypal 回调问题

Paypal 主要有两种 API 调用方式,一种是经典的 Express checkout,另一种是比较新的 REST API,

Express checkout 对应的异步回调方式是 IPNREST API 对应的是 Webhook。

我使用了 Omnipay Paypal 包调用 Paypal,虽然 Omnipay Paypal 支持 Express CheckoutREST API ,但实际上Omnipay 对 REST API 支持并不完善,或者我没看懂怎样使用。

所以我使用了 Express Checkout 方式调用。但我遇到了一个问题。就是 IPN 回调,如果我不在用户支付完成后的同步回调中使用 Omnipay 的 completePurchase 方法的,IPN 回调是不会发生,同时,商户的交易记录中也不会存在这笔交易。

Paypal 付款流程,看这里应该比较清楚 《PayPal 支付-Checkout 收银台和 Subscription 订阅计划全过程分享》

流程中说明了,用户支付完成,需要向 paypal 发出“执行付款”指令才能完成交易,也则是需要执行 Omnipay 的 completePurchase 方法的。

问题是,同步回调不并可靠,例如用户在 paypal 端支付完成后遇到网络问题无法跳转回网站,或者网站服务器刚好出现问题执行不了同步回调,那么这个交易就一直没法确认,同时 IPN 也不会执行。这样,用户这笔支付数据就会丢失。

我搜索了 stackoverflow,也找到相关的问题,《Can Paypal trigger IPN / Webhook without processing data from return_url?》

其实,我之前一直以为异步回调是不需要同步回调,只要用户支付完成,就会执行的。

我不确实是不是我 paypal 设置,还是代码问题,还是本来流程就是这样。

但看 stackoverflow,似乎又不是我一个人的问题。

stackoverflow 也有一个问题 《Handle paypal redirect failuers with omnipay paypal》

里面提及了一个解决方法,就是写一个 cornjob,定时检查交易状态。我暂时还没有试。

我想发贴问下大家一般流程是怎样做的。再决定一下步怎样改。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

很早前,同做过这个PayPal,不过有点问题,插个眼

3年前 评论
franktrue

我使用的是REST API 方式,原理基本一致,在配置正确的情况下,确实是以同步结果执行成功来判断支付成功

3年前 评论

我之前也是用同步结果来判断是否成功,同时也给用户增加一个订单支付异常(扣款了没回调成功)提交功能,让用户手动提交异常的订单,再去paypal那边确认是否支付成功(这一步是人工处理),再处理订单(感觉好傻的操作 :joy:),不过是挺早之前的做法了,现在不知道paypal有没有其他处理方式提供 :grinning:

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!