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

时间:2015-01-16 16:12:24

标签: php curl paypal express-checkout

我使用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'可以在三小时后完成。

3 个答案:

答案 0 :(得分:0)

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

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

授权是可以从该令牌/会话生成的一种金融交易。授权从买方预留资金,从而向卖方/接收方保证在一段时间内买方可以获得资金。它实际上并没有转移资金;只有在(如果)参与授权执行第二次金融交易时才会发生:a"捕获。"简而言之,授权&捕获拆分"销售"分为两部分:一部分确保事务可以发生,另一部分确实发生。

您应该执行DoExpressCheckout,其付款方式为"授权"一旦用户返回(好吧,也许是在您网站上的另一个或两个页面之后......但不是几天之后)。然后你丢弃EC令牌并保持授权#。您几天后应该执行的唯一操作应该是捕获,只需要授权#。

我猜测,无论是以数字方式还是物理方式,以某种方式履行客户的订单,都会导致您在捕获之前出现延迟。

如果您想避免在客户的账户中持有资金,并且愿意接受在您去捕获时资金将不存在的风险,您还可以使用'为了'在买方的互动时做相当于非约束性授权的事情。

如果您的情况比较复杂,例如在用户的交互会话时,该金额是未知的,然后您需要使用不同的PayPal产品,例如参考交易/结算协议/未来付款,而不是使用授权,允许用户授予您更加开放的许可,以便在未来中为他们收费。

答案 1 :(得分:0)

由于@geewiz,

解决了这种问题。

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