PalPal 交易 API 发送送货信息地址“状态”为空?

问题描述 投票:0回答:1

我有一个电子商务网站,我在其中使用 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,我看到状态不为空。

c# paypal e-commerce reporting
1个回答
0
投票

正确的集成使用 v2/checkout/orders API(或类似 API)来创建和捕获付款,并且在捕获时会立即收到成功或失败的通知。大多数情况下,你的问题应该通过转向这样一个正确的集成来解决,标准集成指南在 node.js 中提供了示例代码,后端部分当然可以用任何语言实现,包括 c#

我强烈建议您将精力集中在上面,但是如果出于某种原因您还决定需要单独的事件异步通知,那么 v1/reporting/transactions API 不是正确的方法。相反,集成 webhooks。然而,webhooks 通常仅作为真正异步事件的附加集成有用,例如以后的退款或争议或由于某种原因从待定状态移出的付款。除了一些替代支付方式(可以在第 3 方网站上完成)之外,正常的订单捕获不需要依赖单独的异步通知——既不需要 webhook,也不需要不合适的 v1/reporting/transactions 轮询

© www.soinside.com 2019 - 2024. All rights reserved.