当前状态
我是PayPal的新手,目前正在将链式自适应付款集成到我们的网站上。已经通过PAY成功调用了.NET SDK API调用。钱(沙盒环境)将正确地转移到该付款的每个参与者(发送者,主要和次要接收者)。
需求
我的目标是在付款成功(更新数据库,发送邮件等)或已取消(清理东西等)之后执行重要任务。
可能的解决方案
1)
第一种方法是创建将actionType
设置为CREATE
的付款,将用户重定向到paypal.com(等待批准),将用户重定向回网站和execute the payment,然后执行重要任务。但它似乎不起作用,将在第二次重定向之前付款并付款COMPLETED
。
2)
另一个可能的解决方案是从用户获取preapproval,重定向回网站并执行付款。尚未尝试此解决方案,不要认为这是最佳实践。
3)
在actionType
设置为"PAY"
的情况下调用PAY,然后等待IPN。也没有尝试过,因为很难在本地进行测试(即使我已经发现了这个问题:Paypal Sandbox Test Tool IPN Simulator in Localhost)。
问题
最佳解决方案是哪种?我猜推荐的解决方案是等待IPN?
如果我使用IPN,付款后的平均响应时间是多长时间?秒,分钟,小时?我知道这取决于PayPal网络服务器的负载,并且在4天内有15次重试,但是实际数字是多少?
我可以在付款中(除备忘字段之外)存储有关发件人的其他信息(例如UserId),然后再将其返回IPN吗?
最佳答案
这是我的方法。
当我要发起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
'。关于paypal - PayPal链式支付成功后执行任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20001510/