当前状态
我是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中?
答案 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
'。