我有一个电子商务网站,我在其中使用 PayPal 作为结帐的付款方式。在某些情况下,已付款但网站未处理订单。所以我使用后台服务来跟踪付款和订单。我使用 v1/reporting/transactions API 来获取事件代码为 T0006(PayPal Checkout API) 的所有交易。 API 成功获取交易,但是当我转到节点 Address 时,我看到 PayPal 为对象 state 返回 null 但有时它会发送状态。所以我的问题是如何获取交易状态,因为状态是强制将订单运送到指定位置的?
var apiContext = PaypalAPIHelper.GetAPIContext();
var transactionslist = PaypalAPIHelper.GetTransactionHistory(apiContext, startDateUtc, endDateUtc);
//transaction detail are not null
if (transactionslist.transaction_details != null)
{
foreach (var itemTransaction in transactionslist.transaction_details.Where(m => m.transaction_info.transaction_event_code == "T0006").Where(m => m.payer_info.payer_name.given_name != null).OrderByDescending(m => m.transaction_info.transaction_initiation_date))
{
var missingOrderObj = new MissingOrder();
if (itemTransaction.transaction_info.transaction_event_code == "T0006" && itemTransaction.transaction_info.transaction_status == "S")
{
try
{
string PayPalTransactionStatus = Util.GetPayPalTransactionStatusDescription(itemTransaction.transaction_info.transaction_status);
var orderData = GetOrderByPaypalTransactionId(itemTransaction.transaction_info.transaction_id, "", itemTransaction.cart_info.item_details.FirstOrDefault().item_code);
if (orderData == null && itemTransaction.transaction_info.transaction_id != null)
{
//Retrive all items in a single transaction
if (itemTransaction.cart_info.item_details != null)
{
foreach (var productItem in itemTransaction.cart_info.item_details)
{
var i = new Item();
i.ItemAmount = productItem.item_amount == null ? "" : productItem.item_amount.value;
i.ItemCode = string.IsNullOrEmpty(productItem.item_code) ? "" : productItem.item_code;
i.ItemName = string.IsNullOrEmpty(productItem.item_name) ? "" : productItem.item_name;
i.ItemQuantity = string.IsNullOrEmpty(productItem.item_quantity) ? "" : productItem.item_quantity;
i.ItemTotalAmount = productItem.total_item_amount == null ? "" : productItem.total_item_amount.value;
missingOrderObj.items.Add(i);
}
}
//Populate payer
missingOrderObj.payer.PayerEmail = itemTransaction.payer_info.email_address;
missingOrderObj.payer.PayerFirstName = itemTransaction.payer_info.payer_name.given_name;
missingOrderObj.payer.PayerLastName = itemTransaction.payer_info.payer_name.surname;
//Populate shipping
missingOrderObj.shipping.City = itemTransaction.shipping_info.address == null ? "" : itemTransaction.shipping_info.address.city;
missingOrderObj.shipping.CountryCode = itemTransaction.shipping_info.address == null ? "" : itemTransaction.shipping_info.address.country_code;
missingOrderObj.shipping.Line1 = itemTransaction.shipping_info.address == null ? "" : itemTransaction.shipping_info.address.line1;
missingOrderObj.shipping.Line2 = itemTransaction.shipping_info.address == null ? "" : itemTransaction.shipping_info.address.line2;
missingOrderObj.shipping.PostalCode = itemTransaction.shipping_info.address == null ? "" : itemTransaction.shipping_info.address.postal_code;
//Here the state is null
missingOrderObj.shipping.State = itemTransaction.shipping_info.address == null ? "" : itemTransaction.shipping_info.address.state;
missingOrderObj.shipping.Name = itemTransaction.shipping_info.name;
//Populate Transaction
missingOrderObj.transaction.FeeAmount = itemTransaction.transaction_info.fee_amount == null ? "" : itemTransaction.transaction_info.fee_amount.value;
missingOrderObj.transaction.ShippingAmount = itemTransaction.transaction_info.shipping_amount == null ? "" : itemTransaction.transaction_info.shipping_amount.value;
missingOrderObj.transaction.TotalAmount = itemTransaction.transaction_info.transaction_amount == null ? "" : itemTransaction.transaction_info.transaction_amount.value;
missingOrderObj.transaction.TransactionId = string.IsNullOrEmpty(itemTransaction.transaction_info.transaction_id) ? "" : itemTransaction.transaction_info.transaction_id;
missingOrderObj.transaction.TransactionDate = string.IsNullOrEmpty(itemTransaction.transaction_info.transaction_initiation_date.ToString()) ? DateTime.Now : itemTransaction.transaction_info.transaction_initiation_date;
missingOrderObj.transaction.TransactionStatus = string.IsNullOrEmpty(PayPalTransactionStatus) ? "" : PayPalTransactionStatus;
payPalTransactionList.Add(missingOrderObj);
}
}
catch (Exception ex)
{
Console.Write(ex.Message + ex.InnerException + ex.StackTrace);
}
}
}
//Sending json to my site for order creation
}
我检查了一些文档。有人说您可以使用 GeoCoding API 通过传递地址行或其他内容来获取状态,但这是在拐弯抹角。那么有没有其他方法,比如来自 paypal 的 GetPayment,我看到状态不为空。
正确的集成使用 v2/checkout/orders API(或类似 API)来创建和捕获付款,并且在捕获时会立即收到成功或失败的通知。大多数情况下,你的问题应该通过转向这样一个正确的集成来解决,标准集成指南在 node.js 中提供了示例代码,后端部分当然可以用任何语言实现,包括 c#
我强烈建议您将精力集中在上面,但是如果出于某种原因您还决定需要单独的事件异步通知,那么 v1/reporting/transactions API 不是正确的方法。相反,集成 webhooks。然而,webhooks 通常仅作为真正异步事件的附加集成有用,例如以后的退款或争议或由于某种原因从待定状态移出的付款。除了一些替代支付方式(可以在第 3 方网站上完成)之外,正常的订单捕获不需要依赖单独的异步通知——既不需要 webhook,也不需要不合适的 v1/reporting/transactions 轮询