gpt4 book ai didi

php - 为什么我应该在付款请求后放置 sleep 功能以获取 Paypal 交易 ID?

转载 作者:太空宇宙 更新时间:2023-11-03 16:22:00 24 4
gpt4 key购买 nike

希望有人能回答我的问题。我正在使用 PayPal PHP SDK,用户可以在其中进行支付。一切正常,只是我面临的问题是付款后我没有获得交易 ID。如果我没有得到交易 ID 作为响应,那么我将无法识别 IPN 监听器上的最后交易状态。在我经过良好注释的代码下方,您可以看到哪里出了问题。

require __DIR__ . '/../bootstrap.php';

// Create a new instance of Payout object
$payouts = new \PayPal\Api\Payout();


$senderBatchHeader = new \PayPal\Api\PayoutSenderBatchHeader();
// ### NOTE:
// You can prevent duplicate batches from being processed. If you specify a `sender_batch_id` that was used in the last 30 days, the batch will not be processed. For items, you can specify a `sender_item_id`. If the value for the `sender_item_id` is a duplicate of a payout item that was processed in the last 30 days, the item will not be processed.
// #### Batch Header Instance
$senderBatchHeader->setSenderBatchId(uniqid())
->setEmailSubject("You have a payment");

// #### Sender Item
// Please note that if you are using single payout with sync mode, you can only pass one Item in the request
$senderItem1 = new \PayPal\Api\PayoutItem();
$senderItem1->setRecipientType('Email')
->setNote('Thanks you for your paymnet')
->setReceiver('shakti.cmexpertise+0522@gmail.com')
->setSenderItemId("" . uniqid())
->setAmount(new \PayPal\Api\Currency('{
"value":"1.0",
"currency":"USD"
}'));

$payouts->setSenderBatchHeader($senderBatchHeader)
->addItem($senderItem1);


// For Sample Purposes Only.
$request = clone $payouts;

// ### Create Payout
try {
$output = $payouts->create(null, $apiContext);

/* get payout batch id of last payout */
$payoutBatchId = $output->getBatchHeader()->getPayoutBatchId();

try {
/* get last payout status using payoutBatchId */
$payoutBatch = \PayPal\Api\Payout::get($payoutBatchId, $apiContext);
$payoutItems = $payoutBatch->getItems();
/* get payout item id */
$payoutItemId = $payoutItems[0]->getPayoutItemId();


// ### Get Payout Item Status
try {
/* get payout item status of last payout */
## below if i put a sleep function of 30 seconds it will return me transaction id if i remove sleep function it will not give transaction id##
$output2 = \PayPal\Api\PayoutItem::get($payoutItemId, $apiContext);
echo $output2;
die;
} catch (Exception $ex) {
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printError("Get Payout Item Status", "PayoutItem", null, $payoutItemId, $ex);
exit(1);
}
die;
} catch (Exception $ex) {
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
//ResultPrinter::printError("Get Payout Batch Status", "PayoutBatch", null, $payoutBatchId, $ex);
exit(1);
}
} catch (Exception $ex) {
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printError("Created Batch Payout", "Payout", null, $request, $ex);
exit(1);
} exit(1);
}
} catch (Exception $ex) {
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printError("Created Batch Payout", "Payout", null, $request, $ex);
exit(1);
}

如果我在之前放置 sleep 功能,我会得到什么响应

sleep(30);
$output2 = \PayPal\Api\PayoutItem::get($payoutItemId, $apiContext);
echo $output2;

我得到交易 ID 的响应如下:

{
"payout_item_id": "QVF223JGF75L4",
"transaction_id": "5H458734LM705962G",
"transaction_status": "SUCCESS",
"payout_item_fee": {
"currency": "USD",
"value": "0.25"
},
"payout_batch_id": "46G8LEN83TFBQ",
"payout_item": {
"recipient_type": "EMAIL",
"amount": {
"currency": "USD",
"value": "1.00"
},
"note": "Thanks you for your paymnet",
"receiver": "shakti.cmexpertise+0522@gmail.com",
"sender_item_id": "5b51cc1fdc599"
},
"time_processed": "2018-07-20T11:55:57Z",
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/payouts-item/QVF223JGF75L4",
"rel": "self",
"method": "GET",
"enctype": "application/json"
},
{
"href": "https://api.sandbox.paypal.com/v1/payments/payouts/46G8LEN83TFBQ",
"rel": "batch",
"method": "GET",
"enctype": "application/json"
}
]
}

如果我像这样删除 sleep 功能,那么我会得到不同的输出。

$output2 = \PayPal\Api\PayoutItem::get($payoutItemId, $apiContext);
echo $output2;

上面的代码不会给我交易 ID,响应如下。

{
"payout_item_id": "VWJD9YJC42728",
"transaction_status": "PENDING",
"payout_item_fee": {
"currency": "USD",
"value": "0.25"
},
"payout_batch_id": "3CZ766WZNRVZG",
"payout_item": {
"recipient_type": "EMAIL",
"amount": {
"currency": "USD",
"value": "1.00"
},
"note": "Thanks you for your paymnet",
"receiver": "shakti.cmexpertise+0522@gmail.com",
"sender_item_id": "5b51d2493b77b"
},
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/payouts-item/VWJD9YJC42728",
"rel": "self",
"method": "GET",
"enctype": "application/json"
},
{
"href": "https://api.sandbox.paypal.com/v1/payments/payouts/3CZ766WZNRVZG",
"rel": "batch",
"method": "GET",
"enctype": "application/json"
}
]
}

你可以看到我在第二个代码中没有得到任何交易ID。我想删除 sleep 功能。如果我删除了,我该如何让它工作。我的目标是我需要交易 ID 作为响应。

最佳答案

您应该在 "transaction_status": "PENDING"响应时重复您的请求。

$response = \PayPal\Api\PayoutItem::get($payoutItemId, $apiContext);

while ($response['transaction_status'] === 'PENDING') {
$response = \PayPal\Api\PayoutItem::get($payoutItemId, $apiContext);
sleep(1);
}

关于php - 为什么我应该在付款请求后放置 sleep 功能以获取 Paypal 交易 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51442497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com