令牌在 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 令牌到期