在PayPal链式付款成功后执行任务

时间:2013-11-15 12:50:13

标签: paypal paypal-ipn paypal-adaptive-payments

当前状态

我是PayPal的新手,我目前正在我们的网站上整合链式自适应支付。已成功通过PAY调用.NET SDK API调用。 Money(沙箱环境)将被正确转移到此付款的每个参与者(发件人,主要和次要接收者)。

要求

我的目标是在付款成功(更新数据库,发送邮件,...)或取消后执行重要任务(清理东西,......)。

可能的解决方案

1) 第一种方法是创建付款,actionType设置为CREATE,将用户重定向到paypal.com(等待批准),将用户重定向回网站{{3然后执行重要任务。但似乎不起作用,付款将在第二次重定向之前支付并且为COMPLETED

2) 另一种可能的解决方案是从用户获取execute the payment,重定向回网站并执行付款。还没有尝试过这个解决方案,不要认为这是最佳实践。

第3)actionType设置为"PAY"的情况下致电preapproval并等待PAY。还没试过,因为在本地测试它很困难(尽管我已经发现了这个问题:IPN)。

问题(S)

哪种解决方案是最佳做法?我想推荐的解决方案是等待IPN吗?

如果我使用IPN付款完成后的平均响应时间有多长?秒,分钟,小时?我知道这取决于PayPal网络服务器的负载,并且在4天内有15次重试,但是什么是真实世界的数字?

我是否可以在付款(除了备忘录字段)中存储有关发件人的其他信息(例如UserId),然后我将其返回到IPN中?

1 个答案:

答案 0 :(得分:0)

我是这样做的。

当我要发起PayPal付款时(在我发送获取TOKEN的请求之前),我在我的数据库中创建了新的交易并将其状态设置为PENDING。在transaction表中,我还有userID列,它是用户表的外键。这样我就可以将交易与用户联系起来。

在我的表中创建事务时,我使用transactionId值,并将其保存到PHP $_SESSION变量。

请注意,如果您想支持定期付款,可以向PayPal提供transactionId。您可以通过设置:

来完成

"PAYMENTREQUEST_0_INVNUM"=>$transaction->id

当PayPal在重复付款后向您发送IPN请求时,将发送此值。

现在回到故事

用户被重定向到PayPal,当用户填写PayPal用户名和密码时,当用户确认付款详细信息时,用户将被重定向回您的网站,您必须致电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'。