支付宝链式支付成功后执行任务
Posted
技术标签:
【中文标题】支付宝链式支付成功后执行任务【英文标题】:Execute tasks after PayPal chained payment is successful 【发布时间】:2013-11-28 20:55:09 【问题描述】:当前状态
我是 PayPal 的新手,我目前正在我们的网站上集成链式自适应支付。已经通过.NET SDK 成功调用了PAY API 调用。资金(沙盒环境)将正确地转移到此付款的每个参与者(发件人、主要和次要收款人)。
要求
我的目标是在付款成功(更新数据库、发送邮件等)或被取消后执行重要任务>(清理东西,...)。
可能的解决方案
1)
第一种方法是创建将actionType
设置为CREATE
的付款,将用户重定向到paypal.com(等待批准),将用户重定向回网站和execute the payment,然后执行重要的任务。但是好像不行,第二次重定向前付款是COMPLETED
。
2) 另一种可能的解决方案是从用户那里获取preapproval,重定向回网站并执行付款。尚未尝试此解决方案,不要认为这是最佳做法。
3)
调用PAY 并将actionType
设置为"PAY"
并等待IPN。也没有尝试过,因为在本地测试它非常困难(尽管我已经找到了这个问题:Paypal Sandbox Test Tool IPN Simulator in Localhost)。
问题
哪种解决方案是最佳实践?我想推荐的解决方案是等待 IPN?
如果我使用 IPN,付款完成后的平均响应时间是多少?秒、分、小时?我知道这取决于 PayPal 网络服务器的负载,并且在 4 天内有 15 次重试,但现实世界的数字是多少?
我可以在付款中存储有关发件人的其他信息(例如用户 ID)(除了备注字段),然后我可以在 IPN 中返回这些信息吗?
【问题讨论】:
【参考方案1】:这是我的做法。
当我要启动 PayPal 付款时(在我发送获取 TOKEN 的请求之前),我在我的数据库中创建新交易并将其状态设置为 PENDING
。在transaction
表中,我还有userID
列,它是用户表的外键。这样我就可以将交易与用户联系起来。
在我的表中创建事务时,我使用transactionId
值,并将其保存到php $_SESSION
变量中。
请注意,如果您想支持定期付款,您可以向 PayPal 提供transactionId
。您可以通过设置来做到这一点:
"PAYMENTREQUEST_0_INVNUM"=>$transaction->id
。
在定期付款发生后,当 PayPal 向您发送 IPN 请求时,将发送此值。
现在回到故事里
用户被重定向到贝宝,当用户填写贝宝用户名和密码,当用户确认支付细节时,用户将被重定向回您的网站,您必须拨打DoExpressCheckoutPayment
自行付款。
如果DoExpressCheckoutPayment
API 调用结果为成功,则表示交易成功,您有钱。此时,您可以发送电子邮件、通知或任何其他重要操作。
$transactionResponse=$paypal->request("DoExpressCheckoutPayment",$requestParams);//Execute transaction
if(is_array($transactionResponse) && $transactionResponse["ACK"]=="Success")//Payment was successfull
//Send email
//Notify user
//Do other important changes in database, for example mark this transaction as successful
Transactions()::model()->updateByPk($_SESSION['transactionId'],array('status'=>'SUCCESS');
重复付款的重要说明:PayPal 可以/将向您发送多个 IPN 请求以进行相同的重复交易,这意味着您必须添加逻辑来检查天气特定的 IPN 请求是否已处理.通常我会通过transactionId
是“PENDING
”或“SUCCESSFUL
”来检查我的交易的天气状态。
【讨论】:
以上是关于支付宝链式支付成功后执行任务的主要内容,如果未能解决你的问题,请参考以下文章