当前状态
我对PayPal非常陌生,目前我正在我们的网站上整合连锁的适应性支付。已经通过给付成功地调用了.NET SDK API。钱(沙箱环境)将正确地转移到每个参与者(寄件人,主要和次要接收者)。
需求
我的目标是在付款成功后执行重要的任务(更新DB、发送邮件、.)或者被取消了(清理东西,.)。
可能的解决方案
1)的第一种方法是将actionType设置为CREATE,将用户重定向到paypal.com (等待批准),将用户重定向回网站和执行付款,然后执行重要任务。但这似乎行不通,付款将被支付,是COMPLETED之前的第二次重定向。
2)的另一个可能的解决方案是从用户那里获得预先批准,重定向到网站并执行付款。还没有尝试过这个解决方案,不要认为这是最佳实践。
3)调用给付,并将actionType设置为"PAY"并等待IPN。也没有尝试过,因为在本地测试它是相当困难的(尽管我已经找到了这个问题:本地主机上的Paypal砂箱测试工具IPN模拟器)。
问题
哪种解决方案是最佳实践?我想建议的解决方案是等待IPN?
如果我使用IPN,付款完成后的平均响应时间是多长时间?几秒钟,几分钟,几小时?我知道这取决于PayPal网络服务器的负载,而且在4天内有15次重试,但是实际的数字是多少呢?
我是否可以在付款(除了备注字段)中存储关于发件人的附加信息(例如UserId),然后在IPN中返回?
发布于 2015-07-28 14:45:14
我就是这样做的。
当我要启动PayPal支付时(在发送获取令牌的请求之前),我在数据库中创建新事务并将其状态设置为PENDING。在transaction表中,我也有userID列,它是用户表的外键。这样,我就可以将事务与用户连接起来。
在我的表中创建事务时,我使用transactionId值,并将其保存到$_SESSION变量中。
请注意,如果您想支持定期付款,您可以提供transactionId到PayPal。您可以通过设置:
"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’。
https://stackoverflow.com/questions/20001510
复制相似问题