diff --git a/code-recipes/README.md b/code-recipes/README.md index b53db3c2..c8ae4c3c 100644 --- a/code-recipes/README.md +++ b/code-recipes/README.md @@ -7,4 +7,5 @@ Code recipes provides easy to read sample code for common use cases of Amazon Se | --- | -------- |----------------------------------------------------------------|----------------------------------------------------| | AWD | Inbound Shipment Creation | [Link](java/src/main/java/awd/InboundOrderCreationRecipe.java) | [Link](php/src/awd/InboundOrderCreationRecipe.php) | | A+ Content API | Submit an Image to A + Content | [Link](java/src/main/java/aplus/UploadImageForResouceRecipe.java) | - | -| Messaging API | Submit an Invoice to Buyer | [Link](java/src/main/java/messaging/SendInvoiceToBuyerRecipe.java) | - | \ No newline at end of file +| Messaging API | Submit an Invoice to Buyer | [Link](java/src/main/java/messaging/SendInvoiceToBuyerRecipe.java) | - | +| Orders | B2B Delivery Experience | [Link](java/src/main/java/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.java) | [Link](php/src/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.php) | diff --git a/code-recipes/java/src/main/java/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.java b/code-recipes/java/src/main/java/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.java new file mode 100644 index 00000000..99050592 --- /dev/null +++ b/code-recipes/java/src/main/java/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.java @@ -0,0 +1,322 @@ +package b2bdeliveryexperience; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + +import com.amazon.SellingPartnerAPIAA.LWAException; + +import software.amazon.spapi.ApiException; +import software.amazon.spapi.api.orders.OrdersV0Api; +import software.amazon.spapi.models.orders.BuyerInfo; +import software.amazon.spapi.models.orders.ConfirmShipmentOrderItem; +import software.amazon.spapi.models.orders.ConfirmShipmentRequest; +import software.amazon.spapi.models.orders.GetOrderAddressResponse; +import software.amazon.spapi.models.orders.GetOrderBuyerInfoResponse; +import software.amazon.spapi.models.orders.GetOrderItemsResponse; +import software.amazon.spapi.models.orders.GetOrderResponse; +import software.amazon.spapi.models.orders.Order; +import software.amazon.spapi.models.orders.OrderAddress; +import software.amazon.spapi.models.orders.OrderItem; +import software.amazon.spapi.models.orders.PackageDetail; + +import util.Constants; +import util.Recipe; + +/** + * Amazon Business Delivery Experience is a six-step process: + * 1) Get order details and check if it's a business order + * 2) Retrieve purchase order number (RDT required) + * 3) Get order address and verify it's commercial (RDT required) + * 4) Filter carrier options to exclude weekend deliveries (for commercial addresses) + * 5) Generate shipping label with PO number + * 6) Confirm shipment with selected carrier + * NOTE: Methods that access PII (buyer info, address) require a Restricted Data Token (RDT). + */ +public class BusinessDeliveryExperienceRecipe extends Recipe { + + private final OrdersV0Api ordersApi = new OrdersV0Api.Builder() + .lwaAuthorizationCredentials(lwaCredentials) + .endpoint(Constants.BACKEND_URL) + .build(); + + @Override + protected void start() { + final String orderId = "123-4567890-1234567"; // Sample order ID + + Order order = getOrder(orderId); + if (!isBusinessOrder(order)) { + System.out.println("Not a business order; skipping business delivery flow."); + return; + } + + // RDT must be obtained before calling buyer info or address endpoints. + String poNumber = getPurchaseOrderNumber(orderId); + List orderItems = getOrderItems(orderId); + OrderAddress orderAddress = getOrderAddress(orderId); + + List carriers = getCarrierOptions(); + + // Filter weekend deliveries only for commercial addresses + if (isCommercialAddress(orderAddress)) { + carriers = filterWeekendDeliveries(carriers); + } + + CarrierOption selectedCarrier = selectCarrier(carriers); + ShippingLabel label = generateShippingLabel(orderId, selectedCarrier, poNumber); + confirmShipment(order, orderItems, selectedCarrier); + } + + /** + * Checks if an order is a business order. + */ + private boolean isBusinessOrder(Order order) { + return order != null && Boolean.TRUE.equals(order.isIsBusinessOrder()); + } + + /** + * Gets order details - no Restricted Data Token required. + */ + private Order getOrder(String orderId) { + try { + GetOrderResponse response = ordersApi.getOrder(orderId); + return response.getPayload(); + } catch (ApiException e) { + throw new RuntimeException("Unsuccessful response from Orders API", e); + } catch (LWAException e) { + throw new RuntimeException("Authentication error", e); + } + } + + /** + * Gets Purchase Order Number - REQUIRES Restricted Data Token (RDT) for PII access. + * Obtain an RDT beforehand using the createRestrictedDataToken API. + */ + private String getPurchaseOrderNumber(String orderId) { + try { + GetOrderBuyerInfoResponse buyerInfoResponse = ordersApi.getOrderBuyerInfo(orderId); + BuyerInfo buyerInfo = (buyerInfoResponse != null) ? buyerInfoResponse.getPayload() : null; + return (buyerInfo != null) ? buyerInfo.getPurchaseOrderNumber() : null; + } catch (ApiException e) { + throw new RuntimeException("Unsuccessful response from Orders API", e); + } catch (LWAException e) { + throw new RuntimeException("Authentication error", e); + } + } + + /** + * Gets order items - no Restricted Data Token required. + */ + private List getOrderItems(String orderId) { + try { + GetOrderItemsResponse response = ordersApi.getOrderItems(orderId); + return response.getPayload().getOrderItems(); + } catch (ApiException e) { + throw new RuntimeException("Unsuccessful response from Orders API", e); + } catch (LWAException e) { + throw new RuntimeException("Authentication error", e); + } + } + + /** + * Gets order address - REQUIRES Restricted Data Token (RDT) for PII access. + * Obtain an RDT beforehand using the createRestrictedDataToken API. + */ + private OrderAddress getOrderAddress(String orderId) { + try { + GetOrderAddressResponse response = ordersApi.getOrderAddress(orderId); + return response.getPayload(); // payload contains shippingAddress + } catch (ApiException e) { + throw new RuntimeException("Unsuccessful response from Orders API", e); + } catch (LWAException e) { + throw new RuntimeException("Authentication error", e); + } + } + + // ---------- Helper / mock logic ---------- + + /** + * True if the shipping address type is "Commercial" (case-insensitive). + */ + private boolean isCommercialAddress(OrderAddress orderAddress) { + if (orderAddress == null || orderAddress.getShippingAddress() == null) return false; + String addressType = orderAddress.getShippingAddress().getAddressType(); + return addressType != null && "Commercial".equalsIgnoreCase(addressType); + } + + /** + * MOCK: Get available carrier options (replace with real carrier/shipping API integration). + */ + private List getCarrierOptions() { + return List.of( + createCarrierOption("UPS", LocalDate.now().plusDays(1)), + createCarrierOption("FedEx", LocalDate.now().plusDays(2)), + createCarrierOption("DHL", LocalDate.now().plusDays(6)) // Saturday + ); + } + + private CarrierOption createCarrierOption(String carrier, LocalDate deliveryDate) { + CarrierOption option = new CarrierOption(); + option.setCarrierName(carrier); + option.setEstimatedDeliveryDate(deliveryDate.toString()); + return option; + } + + /** + * MOCK METHOD: Filters out carriers that deliver on weekends + * In real implementation, this would be part of carrier selection logic + */ + private List filterWeekendDeliveries(List carriers) { + return carriers.stream() + .filter(c -> { + LocalDate date = LocalDate.parse(c.getEstimatedDeliveryDate()); + DayOfWeek dow = date.getDayOfWeek(); + return dow != DayOfWeek.SATURDAY && dow != DayOfWeek.SUNDAY; + }) + .collect(Collectors.toList()); + } + + /** + * Simple selection logic; pick first available. + */ + private CarrierOption selectCarrier(List carriers) { + return (carriers == null || carriers.isEmpty()) ? null : carriers.get(0); + } + + /** + * MOCK METHOD: Generates shipping label with purchase order number + * In real implementation, this would integrate with SP-API Shipping API or carrier APIs + */ + private ShippingLabel generateShippingLabel(String orderId, CarrierOption carrier, String poNumber) { + if (carrier == null) { + System.out.println("No carrier available for label generation"); + return null; + } + + ShippingLabel label = new ShippingLabel(); + label.setLabelId("LBL-" + orderId + "-" + System.currentTimeMillis()); + label.setCarrierName(carrier.getCarrierName()); + label.setTrackingNumber("1Z999AA1234567890"); + label.setLabelFormat("PDF"); + label.setLabelUrl("https://mock-label-url.com/" + label.getLabelId() + ".pdf"); + label.setPurchaseOrderNumber(poNumber); + + System.out.println("Shipping label generated: " + label.getLabelId() + + (poNumber != null ? " with PO: " + poNumber : "")); + return label; + } + + /** + * Confirm shipment in Orders API. + */ + private void confirmShipment(Order order, List orderItems, CarrierOption carrier) { + if (order == null || carrier == null || orderItems == null || orderItems.isEmpty()) { + System.out.println("Missing data; cannot confirm shipment."); + return; + } + + try { + List confirmItems = orderItems.stream() + .map(item -> new ConfirmShipmentOrderItem() + .orderItemId(item.getOrderItemId()) + .quantity(item.getQuantityOrdered())) + .collect(Collectors.toList()); + + ConfirmShipmentRequest request = new ConfirmShipmentRequest() + .marketplaceId(order.getMarketplaceId()) + .packageDetail(new PackageDetail() + .packageReferenceId("PKG001") + .carrierCode(carrier.getCarrierName()) + .trackingNumber("1Z999AA1234567890") + .orderItems(confirmItems)); + + ordersApi.confirmShipment(order.getAmazonOrderId(), request); + System.out.println("Shipment confirmed with carrier: " + carrier.getCarrierName()); + } catch (ApiException e) { + throw new RuntimeException("Failed to confirm shipment", e); + } catch (LWAException e) { + throw new RuntimeException("Authentication error", e); + } + } + + // ---------- Mock DTOs (replace with real models if available) ---------- + + private static class CarrierOption { + private String carrierName; + private String estimatedDeliveryDate; + + public String getCarrierName() { + return carrierName; + } + + public void setCarrierName(String carrierName) { + this.carrierName = carrierName; + } + + public String getEstimatedDeliveryDate() { + return estimatedDeliveryDate; + } + + public void setEstimatedDeliveryDate(String estimatedDeliveryDate) { + this.estimatedDeliveryDate = estimatedDeliveryDate; + } + } + + private static class ShippingLabel { + private String labelId; + private String carrierName; + private String trackingNumber; + private String labelFormat; + private String labelUrl; + private String purchaseOrderNumber; + + public String getLabelId() { + return labelId; + } + + public void setLabelId(String labelId) { + this.labelId = labelId; + } + + public String getCarrierName() { + return carrierName; + } + + public void setCarrierName(String carrierName) { + this.carrierName = carrierName; + } + + public String getTrackingNumber() { + return trackingNumber; + } + + public void setTrackingNumber(String trackingNumber) { + this.trackingNumber = trackingNumber; + } + + public String getLabelFormat() { + return labelFormat; + } + + public void setLabelFormat(String labelFormat) { + this.labelFormat = labelFormat; + } + + public String getLabelUrl() { + return labelUrl; + } + + public void setLabelUrl(String labelUrl) { + this.labelUrl = labelUrl; + } + + public String getPurchaseOrderNumber() { + return purchaseOrderNumber; + } + + public void setPurchaseOrderNumber(String purchaseOrderNumber) { + this.purchaseOrderNumber = purchaseOrderNumber; + } + } +} diff --git a/code-recipes/java/src/test/java/b2bdeliveryexperience/BusinessDeliveryExperienceRecipeTest.java b/code-recipes/java/src/test/java/b2bdeliveryexperience/BusinessDeliveryExperienceRecipeTest.java new file mode 100644 index 00000000..3b05cf2d --- /dev/null +++ b/code-recipes/java/src/test/java/b2bdeliveryexperience/BusinessDeliveryExperienceRecipeTest.java @@ -0,0 +1,22 @@ +package b2bdeliveryexperience; + +import util.RecipeTest; + +import java.util.List; + +public class BusinessDeliveryExperienceRecipeTest extends RecipeTest { + + protected BusinessDeliveryExperienceRecipeTest() { + super( + new BusinessDeliveryExperienceRecipe(), + List.of( + "orders-getOrder", + "orders-getOrderBuyerInfo", + "orders-getOrderItems", + "orders-getOrderAddress", + "orders-confirmShipment", + "" + ) + ); + } +} \ No newline at end of file diff --git a/code-recipes/php/src/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.php b/code-recipes/php/src/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.php new file mode 100644 index 00000000..04588fec --- /dev/null +++ b/code-recipes/php/src/b2bdeliveryexperience/BusinessDeliveryExperienceRecipe.php @@ -0,0 +1,310 @@ +ordersApi = new OrdersV0Api($this->config); + } + + public function start(): void + { + $orderId = "123-4567890-1234567"; // Sample order ID + + $order = $this->getOrder($orderId); + + if ($order->getIsBusinessOrder()) { + + $poNumber = $this->getPurchaseOrderNumber($orderId); + $orderItems = $this->getOrderItems($orderId); + $address = $this->getOrderAddress($orderId); + $carriers = $this->getCarrierOptions(); + + // Filter weekend deliveries only for commercial addresses + $shipping = $address?->getShippingAddress(); + if ($shipping !== null + && is_string($shipping->getAddressType()) + && strcasecmp($shipping->getAddressType(), 'Commercial') === 0) { + $carriers = $this->filterWeekendDeliveries($carriers); + } + + $selectedCarrier = $this->selectCarrier($carriers); + $label = $this->generateShippingLabel($orderId, $selectedCarrier, $poNumber); + $this->confirmShipment($order, $orderItems, $selectedCarrier); + } + } + + /** + * Gets order details - no Restricted Data Token required + */ + private function getOrder(string $orderId): Order + { + try { + $response = $this->ordersApi->getOrder($orderId); + return $response->getPayload(); + } catch (Exception $e) { + throw new Exception("Unsuccessful response from Orders API: " . $e->getMessage(), 0, $e); + } + } + + /** + * Get Purchase Order Number - REQUIRES Restricted Data Token (RDT) for PII access + * Must obtain RDT before calling this method using createRestrictedDataToken API + */ + private function getPurchaseOrderNumber(string $orderId): ?string + { + try { + $resp = $this->ordersApi->getOrderBuyerInfo($orderId); + $buyerInfo = $resp->getPayload(); + return $buyerInfo ? $buyerInfo->getPurchaseOrderNumber() : null; + } catch (Exception $e) { + throw new Exception("Unsuccessful response from Orders API: " . $e->getMessage(), 0, $e); + } + } + + /** + * Gets order items - no Restricted Data Token required + */ + private function getOrderItems(string $orderId): array + { + try { + $response = $this->ordersApi->getOrderItems($orderId); + return $response->getPayload()->getOrderItems(); + } catch (Exception $e) { + throw new Exception("Unsuccessful response from Orders API: " . $e->getMessage(), 0, $e); + } + } + + /** + * Gets order address - REQUIRES Restricted Data Token (RDT) for PII access + * Must obtain RDT before calling this method using createRestrictedDataToken API + */ + private function getOrderAddress(string $orderId): OrderAddress + { + try { + $response = $this->ordersApi->getOrderAddress($orderId); + return $response->getPayload(); + } catch (Exception $e) { + throw new Exception("Unsuccessful response from Orders API: " . $e->getMessage(), 0, $e); + } + } + + /** + * MOCK METHOD: Gets available carrier options + * In real implementation, this would integrate with shipping APIs to get actual carrier options + */ + private function getCarrierOptions(): array + { + // Mock carrier options - in real implementation, this would come from shipping API + return [ + $this->createCarrierOption("UPS", (new DateTime())->modify('+1 day')), + $this->createCarrierOption("FedEx", (new DateTime())->modify('+2 days')), + $this->createCarrierOption("DHL", (new DateTime())->modify('+6 days')) // Saturday + ]; + } + + private function createCarrierOption(string $carrier, DateTime $deliveryDate): CarrierOption + { + $option = new CarrierOption(); + $option->setCarrierName($carrier); + $option->setEstimatedDeliveryDate($deliveryDate->format('Y-m-d')); + return $option; + } + + /** + * MOCK METHOD: Filters out carriers that deliver on weekends + * In real implementation, this would be part of carrier selection logic + */ + private function filterWeekendDeliveries(array $carriers): array + { + // 0 = Sunday, 6 = Saturday + return array_values(array_filter($carriers, function (CarrierOption $carrier) { + $deliveryDate = new DateTime($carrier->getEstimatedDeliveryDate()); + $dayOfWeek = (int)$deliveryDate->format('w'); + return $dayOfWeek !== 0 && $dayOfWeek !== 6; + })); + } + + private function selectCarrier(array $carriers): ?CarrierOption + { + // Select first available carrier (in real implementation, this would be user choice) + return empty($carriers) ? null : $carriers[0]; + } + + /** + * MOCK METHOD: Generates shipping label with purchase order number + * In real implementation, this would integrate with carrier APIs + */ + private function generateShippingLabel(string $orderId, ?CarrierOption $carrier, ?string $poNumber): ?ShippingLabel + { + if ($carrier === null) { + echo "No carrier available for label generation\n"; + return null; + } + + // Mock shipping label generation - in real implementation, this would call carrier API to generate shipping label + $label = new ShippingLabel(); + $label->setLabelId("LBL-" . $orderId . "-" . time()); + $label->setCarrierName($carrier->getCarrierName()); + $label->setTrackingNumber("1Z999AA1234567890"); + $label->setLabelFormat("PDF"); + $label->setLabelUrl("https://mock-label-url.com/" . $label->getLabelId() . ".pdf"); + $label->setPurchaseOrderNumber($poNumber); + + echo "Shipping label generated: " . $label->getLabelId() . + ($poNumber ? " with PO: " . $poNumber : "") . "\n"; + return $label; + } + + private function confirmShipment(Order $order, array $orderItems, ?CarrierOption $carrier): void + { + if ($carrier === null) { + echo "No carrier available for shipment\n"; + return; + } + + try { + $confirmItems = array_map(function (OrderItem $item) { + return (new ConfirmShipmentOrderItem()) + ->setOrderItemId($item->getOrderItemId()) + ->setQuantity($item->getQuantityOrdered()); + }, $orderItems); + + $request = (new ConfirmShipmentRequest()) + ->setMarketplaceId($order->getMarketplaceId()) + ->setPackageDetail((new PackageDetail()) + ->setPackageReferenceId("PKG001") + ->setCarrierCode($carrier->getCarrierName()) + ->setTrackingNumber("1Z999AA1234567890") + ->setOrderItems($confirmItems)); + + $this->ordersApi->confirmShipment($order->getAmazonOrderId(), $request); + echo "Shipment confirmed with carrier: " . $carrier->getCarrierName() . "\n"; + } catch (Exception $e) { + throw new Exception("Failed to confirm shipment: " . $e->getMessage(), 0, $e); + } + } +} + +// Mock CarrierOption class +class CarrierOption +{ + private string $carrierName; + private string $estimatedDeliveryDate; + + public function getCarrierName(): string + { + return $this->carrierName; + } + + public function setCarrierName(string $carrierName): void + { + $this->carrierName = $carrierName; + } + + public function getEstimatedDeliveryDate(): string + { + return $this->estimatedDeliveryDate; + } + + public function setEstimatedDeliveryDate(string $estimatedDeliveryDate): void + { + $this->estimatedDeliveryDate = $estimatedDeliveryDate; + } +} + +// Mock ShippingLabel class +class ShippingLabel +{ + private string $labelId; + private string $carrierName; + private string $trackingNumber; + private string $labelFormat; + private string $labelUrl; + private ?string $purchaseOrderNumber; + + public function getLabelId(): string + { + return $this->labelId; + } + + public function setLabelId(string $labelId): void + { + $this->labelId = $labelId; + } + + public function getCarrierName(): string + { + return $this->carrierName; + } + + public function setCarrierName(string $carrierName): void + { + $this->carrierName = $carrierName; + } + + public function getTrackingNumber(): string + { + return $this->trackingNumber; + } + + public function setTrackingNumber(string $trackingNumber): void + { + $this->trackingNumber = $trackingNumber; + } + + public function getLabelFormat(): string + { + return $this->labelFormat; + } + + public function setLabelFormat(string $labelFormat): void + { + $this->labelFormat = $labelFormat; + } + + public function getLabelUrl(): string + { + return $this->labelUrl; + } + + public function setLabelUrl(string $labelUrl): void + { + $this->labelUrl = $labelUrl; + } + + public function getPurchaseOrderNumber(): ?string + { + return $this->purchaseOrderNumber; + } + + public function setPurchaseOrderNumber(?string $purchaseOrderNumber): void + { + $this->purchaseOrderNumber = $purchaseOrderNumber; + } +} diff --git a/code-recipes/php/test/b2bdeliveryexperience/BusinessDeliveryExperienceRecipeTest.php b/code-recipes/php/test/b2bdeliveryexperience/BusinessDeliveryExperienceRecipeTest.php new file mode 100644 index 00000000..df1a8437 --- /dev/null +++ b/code-recipes/php/test/b2bdeliveryexperience/BusinessDeliveryExperienceRecipeTest.php @@ -0,0 +1,20 @@ +recipe = new BusinessDeliveryExperienceRecipe(); + $this->responses = [ + "b2bdeliveryexperience-orders-getOrder", + "b2bdeliveryexperience-orders-getOrderBuyerInfo", + "b2bdeliveryexperience-orders-getOrderItems", + "b2bdeliveryexperience-orders-getOrderAddress", + "b2bdeliveryexperience-orders-confirmShipment" + ]; + } +} diff --git a/code-recipes/test/responses/b2bdeliveryexperience-orders-confirmShipment.json b/code-recipes/test/responses/b2bdeliveryexperience-orders-confirmShipment.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/code-recipes/test/responses/b2bdeliveryexperience-orders-confirmShipment.json @@ -0,0 +1 @@ +{} diff --git a/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrder.json b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrder.json new file mode 100644 index 00000000..f2961cc2 --- /dev/null +++ b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrder.json @@ -0,0 +1,35 @@ +{ + "payload": { + "AmazonOrderId": "123-4567890-1234567", + "SellerOrderId": "SO-1001", + "PurchaseDate": "2025-10-15T14:22:33Z", + "LastUpdateDate": "2025-10-16T12:10:00Z", + "OrderStatus": "Unshipped", + "FulfillmentChannel": "MFN", + "SalesChannel": "Amazon.com", + "OrderChannel": "Amazon.com", + "ShipServiceLevel": "Std US D2D Dom", + "OrderTotal": { + "CurrencyCode": "USD", + "Amount": "149.99" + }, + "NumberOfItemsShipped": 0, + "NumberOfItemsUnshipped": 1, + "PaymentMethod": "Other", + "PaymentMethodDetails": ["Standard"], + "IsReplacementOrder": false, + "MarketplaceId": "ATVPDKIKX0DER", + "ShipmentServiceLevelCategory": "Standard", + "IsBusinessOrder": true, + "IsPrime": false, + "IsPremiumOrder": false, + "DefaultShipFromLocationAddress": { + "Name": "Your Store", + "AddressLine1": "123 Merchant St", + "City": "Austin", + "StateOrRegion": "TX", + "PostalCode": "73301", + "CountryCode": "US" + } + } +} diff --git a/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderAddress.json b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderAddress.json new file mode 100644 index 00000000..242fa3a9 --- /dev/null +++ b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderAddress.json @@ -0,0 +1,18 @@ +{ + "payload": { + "AmazonOrderId": "123-4567890-1234567", + "ShippingAddress": { + "Name": "Receiving Department", + "AddressLine1": "1000 Business Park Dr", + "AddressLine2": "Suite 200", + "City": "Chicago", + "StateOrRegion": "IL", + "PostalCode": "60601", + "CountryCode": "US", + "AddressType": "Commercial" + }, + "DeliveryPreferences": { + "DropOffLocation": "FrontDesk" + } + } +} diff --git a/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderBuyerInfo.json b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderBuyerInfo.json new file mode 100644 index 00000000..15e114bb --- /dev/null +++ b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderBuyerInfo.json @@ -0,0 +1,8 @@ +{ + "payload": { + "AmazonOrderId": "123-4567890-1234567", + "BuyerEmail": "0000000000@marketplace.amazon.com", + "BuyerName": "Amazon Business Buyer", + "PurchaseOrderNumber": "PO-987654" + } +} diff --git a/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderItems.json b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderItems.json new file mode 100644 index 00000000..fcc87f75 --- /dev/null +++ b/code-recipes/test/responses/b2bdeliveryexperience-orders-getOrderItems.json @@ -0,0 +1,26 @@ +{ + "payload": { + "AmazonOrderId": "123-4567890-1234567", + "OrderItems": [ + { + "ASIN": "B012345678", + "SellerSKU": "SKU-RED-XL", + "OrderItemId": "11223344556677", + "Title": "Heavy-Duty Storage Boxes (Red, XL)", + "QuantityOrdered": 1, + "QuantityShipped": 0, + "ItemPrice": { + "CurrencyCode": "USD", + "Amount": "149.99" + }, + "ItemTax": { + "CurrencyCode": "USD", + "Amount": "0.00" + }, + "IsGift": false, + "ConditionId": "New", + "ConditionSubtypeId": "New" + } + ] + } +}