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

Posted

技术标签:

【中文标题】令牌在 3 小时内到期后 1 天后授权和处理付款【英文标题】:Authorize & process payment after 1 day when token expires within 3 hours 【发布时间】:2015-03-15 07:17:56 【问题描述】:

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

虽然根据文档授权有效期为三天,但令牌在三个小时内到期。

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

PS。 我知道这是 How am I supposed to capture a payment 1 day after its authorization if the PayPal token expires after 3 hours? 的副本,但就像提问的用户一样,“DoExpressCheckoutPayment”可以在三个小时后完成。

【问题讨论】:

【参考方案1】:

解决者:

1) SetExpressCheckout 到自己的帐户(付款操作 == 订单)

$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) DoExpressCheckout

$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 成功进行 MassPayment 到第二个帐户

$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/>';

【讨论】:

是的,这是一种可行且合理的模式,也是进行“衍生”或“链式”支付的好方法,例如给网络中参与的卖家或内容提供商。【参考方案2】:

感谢@geewiz 解决了这个问题。

1) 我正在使用“paymentaction = order”向两家商店并行付款。

2) 用户接受并行付款后,我得到一个令牌,我用它向两个 paypal 商店执行 DoExpressCheckoutPayment。 paymentaction 保持正常。

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

次要问题 -

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

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

【讨论】:

您的后续问题令人困惑。 Express Checkout 不支持并行或连锁付款。您是否尝试使用自适应支付功能?如果您创建一个新问题并提供更多背景信息,您可能会得到更好的帮助。 我基本上是在尝试授权对两个帐户进行并行(或链式)付款,这可以在以后(24 小时内)捕获。我将看看自适应支付。我有和这里完全相同的问题:***.com/questions/17112570/…(也没有解决) 其他作者有两个问题;第一个被诊断并修复,即他传递了一个order_id并将其称为authorization_id。第二个从未被诊断出来,但“您无权进行此调用”错误几乎总是意味着通过了无效或不适当的身份验证(帐户/密码/密钥);例如他们试图实时使用沙盒凭据,或者传递的帐户凭据不是交易的适当方(例如,发送帐户不能调用捕获 API,只能调用接收帐户)。【参考方案3】:

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

令牌和授权根本不是一回事。代币是一种将用户协议与即将进行的金融交易联系起来的机制;将其视为 Web 会话的扩展或一部分。令牌描述了一个正在进行的操作,可用于生成金融交易,但它本身不是金融交易。

授权是可以从该令牌/会话生成的一种金融交易。授权从买方保留资金,从而向卖方/收款人保证在一定时期内可以从买方获得资金。它实际上并没有转移资金;仅当(如果)参考授权执行第二次金融交易时才会发生这种情况:“捕获”。简而言之,授权和捕获将“销售”分为两部分:一个确保交易可以发生,第二个实际使其发生。

您应该在用户返回后立即使用“授权”的付款操作执行 DoExpressCheckout(嗯,可能在您网站上的另一页或两页之后......但不是几天后)。然后你扔掉EC令牌,只保留授权#。您应该在几天后执行的唯一操作应该是捕获,它只需要授权 #。

我猜想以某种方式(无论是数字方式还是物理方式)履行客户的订单是导致捕获前延迟的原因。

如果您想避免在客户账户中持有资金,并愿意承担一些风险,即当您去捕获资金将因此不存在时,您还可以使用“订单”的支付操作来执行相当于买方互动时的非约束性授权。

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

【讨论】:

谢谢!我正在做一个DoExpressCheckoutpayment,将payerID、令牌和授权作为paymentAction。但随后交易正在完成(即资金正在转移,如我的沙箱中所见)。我可以保存 TransactionID 并稍后进行 CAPTURE,但是任何线索如何不进行交易? 如果您有paymentaction=authorization,则不会转账。买方账户将显示“授权”类型的交易,该交易要求资金(尽管如果授权被取消或过期,资金将被释放),但收款账户将没有资金进入其余额,直到有一个捕获。如果您看到资金流动,那么您不仅做了授权。

以上是关于令牌在 3 小时内到期后 1 天后授权和处理付款的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react native 和 redux 应用程序中处理 JWT 令牌到期

Google API:如何增加访问令牌到期日期?

自动进行Facebook页面访问令牌生成

持续时间后支付网关更改方法

如何修改 AWS Cognito 用户池的访问令牌和身份令牌的到期时间

Refreshed Token 每个账户可撤销 50 次