1天后授权和处理付款,令牌在3小时内到期


Authorize & process payment after 1 day when token expires within 3 hours

我正在使用PayPal经典API通过快速结账(https://developer.paypal.com/docs/classic/express-checkout/ht_ec-singleAuthPayment-curl-etc/)授权和处理付款。

尽管根据文档,授权有效期为三天,但令牌将在三小时内过期。

那么,如何在令牌过期后捕获交易?

附言。我知道这是重复的 如果PayPal令牌在 3 小时后过期,我应该如何在授权后 1 天捕获付款?但就像提问用户一样,"DoExpressCheckoutPayment"可以在三个小时后完成。

引用问题的海报和您在理解PayPal概念时都犯了同样的错误。

令牌和授权根本不是一回事。代币是一种将用户协议连接到即将进行的金融交易的机制;将其视为 Web 会话的扩展或一部分。令牌描述进程内操作,可用于生成金融交易,但本身不是金融交易。

授权是一种可以从该令牌/会话生成的金融交易。授权保留来自买方的资金,从而保证卖方/接收者在一段时间内可以从买方获得资金。它实际上并没有转移资金;只有当(如果)参考授权执行第二笔金融交易时,才会发生这种情况:"捕获"。简而言之,授权和捕获将"销售"分为两部分:一部分确保交易可以发生,另一部分实际实现交易。

一旦用户返回,您应该立即执行带有"授权"付款操作的DoExpressCheckout(好吧,也许在您的网站上再过一两页之后......但不是几天后)。然后你扔掉 EC 令牌,只保留授权 #。几天后应执行的唯一操作应该是捕获,这只需要该授权 #。

我猜以某种方式(无论是数字还是物理)完成客户的订单是捕获之前延迟的原因。

如果您想避免在客户账户中持有资金,并愿意接受一些风险,因此在您去获取时资金将不存在,您还可以使用"订单"的付款操作来执行相当于在买方互动时不具约束力的授权。

如果您有更复杂的情况,例如,在用户交互会话时不知道金额,那么您需要使用不同的PayPal产品,例如参考交易/计费协议/未来付款,而不是使用授权,允许用户授予您更开放的许可,以在未来向他们计费。

多亏了@geewiz解决了这个问题(有点)。

1)我正在向两家商店进行"付款操作=订单"的并行付款。

2)用户接受平行付款后,我得到一个令牌,我用该令牌向两家PayPal商店进行DoExpressCheckoutPayment。付款行动仍然是命令。

3)然后我得到一个链接,我用它做一个DoCapture,它会释放资金并将其转移到我的帐户。

次要问题 -

第二个店主(因为我有平行付款)如何获得他的付款份额?

使用他的事务 ID 调用相同的函数会引发"您无权进行此 API 调用"错误,因为 php 脚本的签名是我的商店的。

由以下方法解决:

1)设置快速结账到自己的帐户(付款操作==订单)

$request_params = array(
    'RETURNURL' => $obj['SUCCESSURL'],
    'CANCELURL' => $obj['CANCELURL'],
    'NOSHIPPING' => '1',
    'BRANDNAME' => $obj['BRANDNAME'],
    'PAYMENTREQUEST_0_CURRENCYCODE' => $obj['CURRENCY'],
    'PAYMENTREQUEST_0_DESC' => $obj['ITEMDESCRIPTION'],
    'PAYMENTREQUEST_0_PAYMENTACTION' => 'Order',
    'PAYMENTREQUEST_0_AMT' => $obj['AMOUNTTOTAL'],
    'PAYMENTREQUEST_0_SELLERPAYPALACCOUNTID' => $obj['RECEIVER1'],
    'PAYMENTREQUEST_0_PAYMENTREQUESTID' => $obj['REQUESTID1']
);
$response = $obj['PAYPAL']->request('SetExpressCheckout', $request_params);

2) 速递结账

$request_params = array(
    'TOKEN' => $obj['TOKEN'],
//  'PAYMENTACTION' => 'Authorization',
    'PAYERID' => $obj['PAYERID'],
    'PAYMENTREQUEST_0_PAYMENTACTION' => 'Order',
    'PAYMENTREQUEST_0_AMT' => $obj['AMOUNTTOTAL'],
    'PAYMENTREQUEST_0_SELLERPAYPALACCOUNTID' => $obj['RECEIVER1'],
    'PAYMENTREQUEST_0_PAYMENTREQUESTID' => $obj['REQUESTID1'],
    'PAYMENTREQUEST_0_CURRENCYCODE' => $obj['CURRENCY']
);
$response = $obj['PAYPAL']->request('DoExpressCheckoutPayment', $request_params);
echo '<b>02. DO TRANSACTION</b><br />';
echo '<pre>';
print_r($response);
echo '</pre>';

3)DoCapture在24小时内拥有自己的帐户

echo '<a href="pay_app.php?tid=' . $response['PAYMENTINFO_0_TRANSACTIONID'] . '&amt='. $response['PAYMENTINFO_0_AMT'] . '">CAPTURE AS APP</a><br/>';

4)在DoCapture成功时向第二个帐户进行批量付款

$request_params = array(
    'L_EMAIL0' => $obj['RECEIVERHOST'],
    'L_AMT0' => $obj['AMT'],
    'L_NOTE0' => "transaction complete",
    'CURRENCYCODE' => $obj['CURRENCY']
);
$response = $obj['PAYPAL']->request('MassPay', $request_params);
echo '<b> MASSPAY</b><br />';
echo '<pre>';
print_r($response);
echo '<br/>';
print_r($obj);
echo '</pre>';
echo '<br/>';