关于paypal 回调问题
Paypal 主要有两种 API 调用方式,一种是经典的 Express checkout,另一种是比较新的 REST API,
Express checkout 对应的异步回调方式是 IPN,REST API 对应的是 Webhook。
我使用了 Omnipay Paypal 包调用 Paypal,虽然 Omnipay Paypal 支持 Express Checkout 和 REST 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,定时检查交易状态。我暂时还没有试。
我想发贴问下大家一般流程是怎样做的。再决定一下步怎样改。
推荐文章: