Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PureBasic) Amazon SP-API Get Order ItemsSee more Amazon SP-API ExamplesReturns detailed order item information for the order that you specify. For more information, see https://developer-docs.amazon.com/sp-api/docs/orders-api-v0-reference#get-ordersv0ordersorderidorderitems
IncludeFile "CkStringBuilder.pb" IncludeFile "CkAuthAws.pb" IncludeFile "CkJsonObject.pb" IncludeFile "CkRest.pb" Procedure ChilkatExample() ; This example requires the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. ; Gets detailed order item information for a specified order ID ; The order ID is something like "902-1845936-5435065" and it is the AmazonOrderId returned in the JSON when getting the list of orders. For example: ; { ; "payload": { ; "CreatedBefore": "1.569521782042E9", ; "Orders": [ ; { ; "AmazonOrderId": "902-1845936-5435065", ; "PurchaseDate": "1970-01-19T03:58:30Z", ; ... ; However, when using the sandbox, instead use the explicit keyword TEST_CASE_200 orderId.s = "TEST_CASE_200" authAws.i = CkAuthAws::ckCreate() If authAws.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkAuthAws::setCkAccessKey(authAws, "AWS_ACCESS_KEY") CkAuthAws::setCkSecretKey(authAws, "AWS_SECRET_KEY") CkAuthAws::setCkServiceName(authAws, "execute-api") ; Use the region that is correct for your needs. CkAuthAws::setCkRegion(authAws, "eu-west-1") ; First get a restricted data token for the given order ID. ; This requires an LWA access token which cannot be more than 1 hour old. ; See Fetch SP-API LWA Access Token jsonLwaToken.i = CkJsonObject::ckCreate() If jsonLwaToken.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success.i = CkJsonObject::ckLoadFile(jsonLwaToken,"qa_data/tokens/sp_api_lwa_token.json") If success = 0 Debug "Failed to load LWA access token." CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) ProcedureReturn EndIf ; Must use the non-sandbox domain for getting the RDT. rest.i = CkRest::ckCreate() If rest.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success = CkRest::ckConnect(rest,"sellingpartnerapi-eu.amazon.com",443,1,1) If success = 0 Debug CkRest::ckLastErrorText(rest) CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) CkRest::ckDispose(rest) ProcedureReturn EndIf success = CkRest::ckSetAuthAws(rest,authAws) ; Add the x-amz-access-token request header. lwa_token.s = CkJsonObject::ckStringOf(jsonLwaToken,"access_token") CkRest::ckClearAllHeaders(rest) CkRest::ckAddHeader(rest,"x-amz-access-token",lwa_token) ; We're going to send a POST with the following JSON body: ; { ; "restrictedResources": [ ; { ; "method": "GET", ; "path": "/orders/v0/orders/{orderId}/orderItems", ; "dataElements": ["buyerInfo"] ; } ; ] ; } sbPath.i = CkStringBuilder::ckCreate() If sbPath.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkStringBuilder::ckAppend(sbPath,"/orders/v0/orders/") CkStringBuilder::ckAppend(sbPath,orderId) CkStringBuilder::ckAppend(sbPath,"/orderItems") jsonRc.i = CkJsonObject::ckCreate() If jsonRc.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkJsonObject::ckUpdateString(jsonRc,"restrictedResources[0].method","GET") CkJsonObject::ckUpdateString(jsonRc,"restrictedResources[0].path",CkStringBuilder::ckGetAsString(sbPath)) CkJsonObject::ckUpdateString(jsonRc,"restrictedResources[0].dataElements[0]","buyerInfo") sbRequest.i = CkStringBuilder::ckCreate() If sbRequest.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkJsonObject::ckEmitSb(jsonRc,sbRequest) sbResponse.i = CkStringBuilder::ckCreate() If sbResponse.i = 0 Debug "Failed to create object." ProcedureReturn EndIf uri.s = "/tokens/2021-03-01/restrictedDataToken" success = CkRest::ckFullRequestSb(rest,"POST",uri,sbRequest,sbResponse) If success = 0 Debug CkRest::ckLastErrorText(rest) CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) CkRest::ckDispose(rest) CkStringBuilder::ckDispose(sbPath) CkJsonObject::ckDispose(jsonRc) CkStringBuilder::ckDispose(sbRequest) CkStringBuilder::ckDispose(sbResponse) ProcedureReturn EndIf ; Examine the response status. statusCode.i = CkRest::ckResponseStatusCode(rest) If statusCode <> 200 Debug "Response status code: " + Str(statusCode) Debug "Response status text: " + CkRest::ckResponseStatusText(rest) Debug "Response body: " Debug CkStringBuilder::ckGetAsString(sbResponse) Debug "Failed." CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) CkRest::ckDispose(rest) CkStringBuilder::ckDispose(sbPath) CkJsonObject::ckDispose(jsonRc) CkStringBuilder::ckDispose(sbRequest) CkStringBuilder::ckDispose(sbResponse) ProcedureReturn EndIf ; Get the restricted data token. jsonResp.i = CkJsonObject::ckCreate() If jsonResp.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkJsonObject::ckLoadSb(jsonResp,sbResponse) restrictedDataToken.s = CkJsonObject::ckStringOf(jsonResp,"restrictedDataToken") Debug "Restricted Data Token: " + restrictedDataToken ; ------------------------------------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------------------------------------ ; Now that we have the RDT, we can use it to get information about the order. ; ; Yes, the SP-API is horribly tedious and painful. You must use an RDT specifically tailored to each request requiring an RDT, ; the RDT must not be over an hour old, and if you need to get a new RDT you must get it using an LWA token that itself is not ; more than an hour old. If the LWA is more than an hour old, you must get a new one. Ughhh!!!!! ; ------------------------------------------------------------------------------------------------------------ ; Disconnect from the non-sandbox domain. This example will use the sandbox. ; (The RDT was obtained using the non-sandbox domain. For some reason, the sandbox domain does not work for getting the RDT.) CkRest::ckDisconnect(rest,100) success = CkRest::ckConnect(rest,"sandbox.sellingpartnerapi-eu.amazon.com",443,1,1) If success = 0 Debug CkRest::ckLastErrorText(rest) CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) CkRest::ckDispose(rest) CkStringBuilder::ckDispose(sbPath) CkJsonObject::ckDispose(jsonRc) CkStringBuilder::ckDispose(sbRequest) CkStringBuilder::ckDispose(sbResponse) CkJsonObject::ckDispose(jsonResp) ProcedureReturn EndIf success = CkRest::ckSetAuthAws(rest,authAws) CkRest::ckClearAllHeaders(rest) CkRest::ckAddHeader(rest,"x-amz-access-token",restrictedDataToken) CkRest::ckClearAllQueryParams(rest) CkRest::ckAddQueryParam(rest,"MarketplaceIds","ATVPDKIKX0DER") CkRest::ckClearAllPathParams(rest) CkRest::ckAddPathParam(rest,"{orderId}",orderId) uri = "/orders/v0/orders/{orderId}/orderItems" success = CkRest::ckFullRequestNoBodySb(rest,"GET",uri,sbResponse) If success = 0 Debug CkRest::ckLastErrorText(rest) CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) CkRest::ckDispose(rest) CkStringBuilder::ckDispose(sbPath) CkJsonObject::ckDispose(jsonRc) CkStringBuilder::ckDispose(sbRequest) CkStringBuilder::ckDispose(sbResponse) CkJsonObject::ckDispose(jsonResp) ProcedureReturn EndIf ; Examine the response status. statusCode = CkRest::ckResponseStatusCode(rest) If statusCode <> 200 Debug "Response status text: " + CkRest::ckResponseStatusText(rest) Debug "Response body: " Debug CkStringBuilder::ckGetAsString(sbResponse) Debug "Failed." CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) CkRest::ckDispose(rest) CkStringBuilder::ckDispose(sbPath) CkJsonObject::ckDispose(jsonRc) CkStringBuilder::ckDispose(sbRequest) CkStringBuilder::ckDispose(sbResponse) CkJsonObject::ckDispose(jsonResp) ProcedureReturn EndIf ; If successful, gets a JSON response such as the following: ; { ; "payload": { ; "AmazonOrderId": "902-1845936-5435065", ; "OrderItems": [ ; { ; "ASIN": "B00551Q3CS", ; "OrderItemId": "05015851154158", ; "SellerSKU": "NABetaASINB00551Q3CS", ; "Title": "B00551Q3CS [Card Book]", ; "QuantityOrdered": 1, ; "QuantityShipped": 0, ; "ProductInfo": { ; "NumberOfItems": 1 ; }, ; "ItemPrice": { ; "CurrencyCode": "USD", ; "Amount": "10.00" ; }, ; "ItemTax": { ; "CurrencyCode": "USD", ; "Amount": "1.01" ; }, ; "PromotionDiscount": { ; "CurrencyCode": "USD", ; "Amount": "0.00" ; }, ; "IsGift": false, ; "ConditionId": "New", ; "ConditionSubtypeId": "New", ; "IsTransparency": false, ; "SerialNumberRequired": false, ; "IossNumber": "", ; "DeemedResellerCategory": "IOSS", ; "StoreChainStoreId": "ISPU_StoreId", ; "BuyerRequestedCancel": { ; "IsBuyerRequestedCancel": true, ; "BuyerCancelReason": "Found cheaper somewhere else." ; } ; } ; ] ; } ; } ; Use this online tool to generate parsing code from sample JSON: ; Generate Parsing Code from JSON json.i = CkJsonObject::ckCreate() If json.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkJsonObject::ckLoadSb(json,sbResponse) CkJsonObject::setCkEmitCompact(json, 0) Debug CkJsonObject::ckEmit(json) ASIN.s OrderItemId.s SellerSKU.s Title.s QuantityOrdered.i QuantityShipped.i NumberOfItems.i CurrencyCode.s Amount.s ItemTaxCurrencyCode.s ItemTaxAmount.s PromotionDiscountCurrencyCode.s PromotionDiscountAmount.s IsGift.i ConditionId.s ConditionSubtypeId.s IsTransparency.i SerialNumberRequired.i IossNumber.s DeemedResellerCategory.s StoreChainStoreId.s IsBuyerRequestedCancel.i BuyerCancelReason.s AmazonOrderId.s = CkJsonObject::ckStringOf(json,"payload.AmazonOrderId") i.i = 0 count_i.i = CkJsonObject::ckSizeOfArray(json,"payload.OrderItems") While i < count_i CkJsonObject::setCkI(json, i) ASIN = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].ASIN") OrderItemId = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].OrderItemId") SellerSKU = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].SellerSKU") Title = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].Title") QuantityOrdered = CkJsonObject::ckIntOf(json,"payload.OrderItems[i].QuantityOrdered") QuantityShipped = CkJsonObject::ckIntOf(json,"payload.OrderItems[i].QuantityShipped") NumberOfItems = CkJsonObject::ckIntOf(json,"payload.OrderItems[i].ProductInfo.NumberOfItems") CurrencyCode = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].ItemPrice.CurrencyCode") Amount = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].ItemPrice.Amount") ItemTaxCurrencyCode = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].ItemTax.CurrencyCode") ItemTaxAmount = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].ItemTax.Amount") PromotionDiscountCurrencyCode = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].PromotionDiscount.CurrencyCode") PromotionDiscountAmount = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].PromotionDiscount.Amount") IsGift = CkJsonObject::ckBoolOf(json,"payload.OrderItems[i].IsGift") ConditionId = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].ConditionId") ConditionSubtypeId = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].ConditionSubtypeId") IsTransparency = CkJsonObject::ckBoolOf(json,"payload.OrderItems[i].IsTransparency") SerialNumberRequired = CkJsonObject::ckBoolOf(json,"payload.OrderItems[i].SerialNumberRequired") IossNumber = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].IossNumber") DeemedResellerCategory = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].DeemedResellerCategory") StoreChainStoreId = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].StoreChainStoreId") IsBuyerRequestedCancel = CkJsonObject::ckBoolOf(json,"payload.OrderItems[i].BuyerRequestedCancel.IsBuyerRequestedCancel") BuyerCancelReason = CkJsonObject::ckStringOf(json,"payload.OrderItems[i].BuyerRequestedCancel.BuyerCancelReason") i = i + 1 Wend Debug "Success!" CkAuthAws::ckDispose(authAws) CkJsonObject::ckDispose(jsonLwaToken) CkRest::ckDispose(rest) CkStringBuilder::ckDispose(sbPath) CkJsonObject::ckDispose(jsonRc) CkStringBuilder::ckDispose(sbRequest) CkStringBuilder::ckDispose(sbResponse) CkJsonObject::ckDispose(jsonResp) CkJsonObject::ckDispose(json) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.