如何通过Shopify Admin API查询deliveryOptions.handle搭建运费折扣应用UI
获取Shopify配送方式Handle用于Shipping Discount Function
你遇到的核心问题是Admin API没有直接暴露和Shipping Discount Function输入中一致的deliveryOptions.handle字段,但可以通过以下两种方式解决:
方法1:通过Shipping Zone + Shipping Method生成匹配的Handle
deliveryOptions.handle的格式是[shipping_zone_hash]-[shipping_method_hash],其中两个哈希值分别对应配送区域(Shipping Zone)和配送方式(Shipping Method)ID的SHA-256哈希前缀(取前32位)。
步骤:
- 用Admin API(REST或GraphQL)获取店铺所有配送区域及对应配送方式:
- REST示例:调用
GET /admin/api/2024-07/shipping_zones.json,返回的每个shipping_zone下包含shipping_methods数组,每个方法带id字段 - GraphQL示例:
query { shippingZones(first: 20) { edges { node { id name shippingMethods(first: 20) { edges { node { id name code } } } } } } }
- REST示例:调用
- 对每个配送区域ID(去掉
gid://shopify/ShippingZone/前缀的数字部分)和配送方式ID(去掉gid://shopify/ShippingMethod/前缀的数字部分)分别生成SHA-256哈希,取前32位后用-连接,得到的就是deliveryOptions.handle
方法2:绕过Handle,直接匹配配送方式的Title/Code
如果生成Handle太繁琐,可在后台UI让用户选择配送方式的名称(Title)或编码(Code),然后在Shipping Discount Function中直接匹配deliveryOptions.title或deliveryOptions.code,这种方式更直观,且无需依赖Handle的生成规则。
示例Function逻辑(伪代码):
// 从后台配置获取用户选择的目标配送方式编码 const targetDeliveryCode = "Standard"; // 检查购物车是否包含符合条件的商品 function hasEligibleItems(cart) { return cart.items.some(item => item.product.tags.includes("免运费资格标签")); } // 遍历配送选项并应用折扣 cart.deliveryGroups.forEach(group => { group.deliveryOptions.forEach(option => { if (option.code === targetDeliveryCode && hasEligibleItems(cart)) { option.discount = { amount: option.price, title: "指定商品免运费" }; } }); });
注意事项
- 配送方式的Handle可能会随配送区域或方式的配置变更而变化,因此用Title/Code匹配更稳定
- 若必须使用Handle,建议定期同步店铺的配送区域和方式数据,更新后台UI的选项列表
内容的提问来源于stack exchange,提问作者VladSofronov
相关产品推荐
相关产品推荐

