我使用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'可以在三小时后完成。
答案 0 :(得分:0)
引用问题的海报和你在理解PayPal概念时犯了同样的错误。
令牌和授权根本不是一回事。令牌是将用户协议连接到即将进行的金融交易的机制;将其视为网络会话的扩展或部分。令牌描述了进程内操作,可用于生成金融交易,但不是金融交易本身。
授权是可以从该令牌/会话生成的一种金融交易。授权从买方预留资金,从而向卖方/接收方保证在一段时间内买方可以获得资金。它实际上并没有转移资金;只有在(如果)参与授权执行第二次金融交易时才会发生:a"捕获。"简而言之,授权&捕获拆分"销售"分为两部分:一部分确保事务可以发生,另一部分确实发生。
您应该执行DoExpressCheckout,其付款方式为"授权"一旦用户返回(好吧,也许是在您网站上的另一个或两个页面之后......但不是几天之后)。然后你丢弃EC令牌并保持授权#。您几天后应该执行的唯一操作应该是捕获,只需要授权#。
我猜测,无论是以数字方式还是物理方式,以某种方式履行客户的订单,都会导致您在捕获之前出现延迟。
如果您想避免在客户的账户中持有资金,并且愿意接受在您去捕获时资金将不存在的风险,您还可以使用'为了'在买方的互动时做相当于非约束性授权的事情。
如果您的情况比较复杂,例如在用户的交互会话时,该金额是未知的,然后您需要使用不同的PayPal产品,例如参考交易/结算协议/未来付款,而不是使用授权,允许用户授予您更加开放的许可,以便在未来中为他们收费。
答案 1 :(得分:0)
解决了这种问题。
1)我正在与两家商店的“paymentaction = order”进行并行付款。
2)在用户接受并行付款后,我获得了一个令牌,我可以通过该令牌向两个PayPal商店进行DoExpressCheckoutPayment。付款仍然是订单。
3)然后,我获得了一个链接,我将其与DoCapture一起发布,这会释放资金并将其转移到我的帐户。
次要问题 -
第二家店主(因为我有并行付款)如何才能获得他的付款份额?
使用其事务ID调用相同的函数会抛出“您没有权限进行此API调用”错误,因为php脚本的签名属于我的商店。
答案 2 :(得分:0)
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/>';