当前状态
我是 PayPal 的新手,目前我正在我们的网站上集成链式自适应支付。已经成功调用PAY通过 .NET SDK 调用 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 次重试,但真实世界的数字是多少?
我可以在付款中存储有关发件人的其他信息(例如 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/