Tämä artikkeli on tarkoitettu kehittäjille, jotka haluavat yhdistää uuden GetShipAdvise-menetelmän toiseen API:in.
Vaikka tässä esimerkissä käytämme Shopify-verkkokauppa-alustaa, lähestymistapa on todennäköisesti samanlainen myös muilla alustoilla.
Huomautus: Tämä näyttää vain perustavan tavan muuntaa pyyntöjä/vastauksia kahden API:n välillä.
Sinun tulee soveltaa omaa liiketoimintalogiikkaasi ja virheenkäsittelyä.
Sinun ei tulisi esittää kysymyksiä Shopifyyn liittyen nShiftin tukeen.
Käytä sen sijaan Shopify-yhteisöfoorumia tästä.
Artikkelin sisältö:
- Rekisteröi kuljetuspalvelu kehityskauppaan
- Tietojen vaihto Shopifyn ja ShipAdvisorin välillä
- Toimitussäännöt
- Kuljetuspalvelun suorituskyky
Vaatimukset
-
Shipment Server API
API:ssa käytämme menetelmää GetShipAdvise
-
Shopifyn Carrier Service API
Carrier Service API mahdollistaa Shopify-kaupoille räätälöityjen toimitustapojen lisäämisen. Se tekee ulkoisen API-pyynnön sovellukseen ja hakee kuljetuspalvelun/toimitusten kuvaukset ja hinnat.Kun käyttäjä aloittaa kassaprosessin, pyyntö lähetetään URL-osoitteeseen, johon Carrier Service osoittaa. Pyyntö sisältää tietoa tuotteista, vastaanottajasta ja lähettäjästä.
Lisätietoja Shopify Carrier Service API:sta löytyy virallisista ohjeista täältä:
https://help.shopify.com/en/api/reference/shipping-and-fulfillment/carrierservice
-
Toimitussäännöt
XML-tiedosto, joka sisältää kaupassa näytettävät tuotteet -
Kuljetuspalvelun suorituskyky
XML-tiedosto, joka sisältää ETA-laskelmat eri tuotteille -
Shopify-kehityskauppa
https://www.shopify.com/partners
Rekisteröi kuljetuspalvelu Shopify-kauppaan
Luo uusi yksityinen sovellus.
Sovelluksella tulee olla Luku- ja kirjoitusoikeudet osioon Toimitushinnat, maat ja maakunnat.
Käytä tässä kuvattua menetelmää tässä rekisteröidäksesi uuden palvelun.
Esimerkkiskriptissä käytetään Node.js:ää ja node-fetchiä POST-pyynnön tekemiseen Carrier API:lle.
fetch('https://YOUR_STORE.myshopify.com/admin/api/2019-07/carrier_services.json',{
headers: {
'X-Shopify-Access-Token':'YOUR_PASSWORD_FROM_THE_PRIVATE_APP',
'Content-Type':'application/json'
},
body: JSON.stringify({
"carrier_service": {
"name": "SA Shipping Rate Provider",
"callback_url": "URL_TO_YOUR_WEB_SERVICE_THAT_THE_CARRIER_SERVICE_CONNECTS_TO",
"service_discovery": true
}
}),
method: 'POST'
})Tämän jälkeen kaupassa tulisi näkyä uusi hintapalveluntarjoaja.
Tietojen vaihto Shopifyn ja Ship Advisorin välillä
Carrier Service -pyyntö täytyy muuntaa muotoon, jonka GetShipAdvise-menetelmä ymmärtää. Tietojen odotetaan olevan muotoiltuina Shipment Object-objektiksi.
Esimerkin Carrier API:n pyyntöobjektista näet klikkaamalla tästä
Alla oleva esimerkkitoiminto käyttää tätä syötteenä ja palauttaa objektin, jossa on Receiver, Sender ja Lines.
.filter(x => x.requires_shipping) suodattaa pois Shopify-kaupasta tuotteet, joita ei ole merkitty toimitusta vaativiksi. Voit poistaa tämän osan, jos et tarvitse sitä.
Lines-taulukon rakentamiseen on useita tapoja, jotta se vastaa ostoskorin sisältöä.
Tässä esimerkissä on kovakoodattu, että kukin tuote vastaa yhtä pakettia lähetyksessä.
const translateShopifyRequest = ({origin, destination, items}, output = {}) = {
let tmpLineObject = items.filter(x = x.requires_shipping).map((item) = {
return {
"References": [{
"Kind": 23,
"Value": item.vendor || ""
}],
"PkgWeight": item.grams,
"Number": 1
}
})
output = {
"Addresses": [{
"Kind": 1,
"Name1": destination.name,
"Street1": destination.address1,
"PostCode": destination.postal_code,
"City": destination.city,
"CountryCode": destination.country
}, {
"Kind": 2,
"Name1": origin.name,
"Street1": origin.address1,
"PostCode": origin.postal_code,
"City": origin.city,
"CountryCode": origin.country
}],
"Lines": tmpLineObject
}
return output
}Shopify Carrier Service API odottaa vastauksen olevan rates-objekti.
Alla oleva esimerkkitoiminto ottaa GetShipAdvise-vastauksen ja palauttaa odotetun objektin.
Huomautus: CustomFields voi sisältää mitä tahansa mukautettuja arvoja, jotka haluat myös palauttaa tuotteiden kanssa.
const translateShipAdvisorResponse = ({Products}, output = {"rates": []}) = {
output.rates = Products.map((product) = {
let startDate = new Date(Date.parse(product.DeliveryDate))
let serviceName = (product.CustomFields && product.CustomFields.type) ? product.CustomFields.type : "",
let serviceCode = (product.CustomFields && product.CustomFields.servicecode) ? product.CustomFields.servicecode : "",
return {
"service_name": serviceName,
"service_code": serviceCode,
"total_price": product.Price,
"description": product.ProdName,
"currency": product.PriceCurrency,
"min_delivery_date": startDate.toISOString(),
"max_delivery_date": startDate.toISOString()
}
}) || []
return output
}
Shipping Rules
Shipping Rules huolehtii tuotteiden suodatuksesta.
CSR-solmun attribuutti carriervalidation kertoo moottorille, käytetäänkö oletuskuljetustarkistusta.
Tässä esimerkissä oletustarkistus on pois käytöstä ja mukautettu tarkistus tehdään suoraan tuotteille, molempia voidaan käyttää samanaikaisesti tarvittaessa.
<?xml version="1.0" encoding="utf-8"?>
<CSR carriervalidation="0" defaultservicelevel="Service_Level_Configured_For_SA">
<Prices>
<Price name="fixed59" currency="DKK">
<Exceptions>
<Exception price="5900">
<ValidationRules>
</ValidationRules>
</Exception>
</Exceptions>
<Fees>
<Fee price="1900">
<ValidationRules>
</ValidationRules>
</Fee>
</Fees>
</Price>
<Price name="fixed39" currency="DKK">
<Exceptions>
<Exception price="3900">
<ValidationRules>
</ValidationRules>
</Exception>
</Exceptions>
</Price>
</Prices>
<ServiceLevels>
<ServiceLevel name="Service_Level_Configured_For_SA">
<Products>
<Product adviseprice="fixed39" name="GLS DK - Pakkeshop med Drop Points" conceptid="1551">
<ProductGoodsType goodstypeid="0"/>
<CustomFields type="Pickup Point" servicecode="P1"/>
<ValidationRules>
<ValidationRule name="country" allowcountries="DK" field="fld_AdrCountry"/>
</ValidationRules>
</Product>
<Product adviseprice="fixed59" name="GLS DK - Normal erhvervspakke" conceptid="113">
<ProductGoodsType goodstypeid="0"/>
<CustomFields type="Home Delivery" servicecode="P2"/>
<ValidationRules>
<ValidationRule name="country" allowcountries="DK" field="fld_AdrCountry"/>
</ValidationRules>
<Services>
<Service serviceid="11020" name="Private Delivery Service"/>
</Services>
</Product>
<Product adviseprice="fixed59" name="GLS DK - Export" conceptid="189">
<ProductGoodsType goodstypeid="0"/>
<CustomFields type="Home Delivery" servicecode="P3"/>
<ValidationRules>
<ValidationRule name="country" allowcountries="SE" field="fld_AdrCountry"/>
</ValidationRules>
</Product>
</Products>
</ServiceLevel>
</ServiceLevels>
</CSR>
Kuljetuspalvelun suorituskyky
Tämä on hyvin perustason esimerkki, joka näyttää ETA-laskelmat CSR-konfiguraatiossa käytetyille tuotteille.
<?xml version="1.0" encoding="utf-8"?>
<ConsignorETA>
<Areas>
<Area name="Nordic" type="countries">
<AreaItem countries="DK,SE"/>
</Area>
</Areas>
<PickupSchedules>
<PickupSchedule name="default" pickingtime="00:10" weekstartsonsunday="0">
<Pickup time="11:00" days="1,2,3,4,5"/>
</PickupSchedule>
</PickupSchedules>
<TransitTimes>
<TransitTime name="profile1" pickupschedule="default" trigger="submit" initiatedays="1,2,3,4,5" deliverydays="1,2,3,4,5" transportdays="1,2,3,4,5" weekstartsonsunday="0">
<Products>
<Product id="1551" name="GLS DK - Pakkeshop med Drop Points"/>
</Products>
<TimeTable>
<From area="Nordic">
<To area="Nordic" days="1" earliest="07:00" latest="18:00"/>
</From>
</TimeTable>
</TransitTime>
<TransitTime name="profile2" pickupschedule="default" trigger="submit" initiatedays="1,2,3,4,5" deliverydays="1,2,3,4,5" transportdays="1,2,3,4,5" weekstartsonsunday="0">
<Products>
<Product id="113" name="GLS DK - Normal erhvervspakke"/>
</Products>
<TimeTable>
<From area="Nordic">
<To area="Nordic" days="2" earliest="07:00" latest="18:00"/>
</From>
</TimeTable>
</TransitTime>
<TransitTime name="profile3" pickupschedule="default" trigger="submit" initiatedays="1,2,3,4,5" deliverydays="1,2,3,4,5" transportdays="1,2,3,4,5" weekstartsonsunday="0">
<Products>
<Product id="189" name="GLS DK - Export"/>
</Products>
<TimeTable>
<From area="Nordic">
<To area="Nordic" days="3" earliest="07:00" latest="18:00"/>
</From>
</TimeTable>
</TransitTime>
</TransitTimes>
</ConsignorETA>
Odotettu tulos, kun käytetään osoitetta Tanskasta.
Odotettu tulos, kun käytetään osoitetta Ruotsista.