如何用Ruby的shopify_api gem创建GraphQL appSubscriptionCreate突变?
解决shopify_api gem执行GraphQL突变的问题
你遇到的问题核心是GraphQL突变的语法格式错误,以及对graphql-client(shopify_api依赖的库)的执行逻辑不熟悉。下面一步步帮你解决:
错误原因分析
你写的mutation语法有问题:
{ mutation { appSubscriptionCreate(...) { ... } } }
这种写法是把mutation字段放在了QueryRoot(查询根类型)下,但GraphQL里mutation是独立的根类型,不属于QueryRoot,所以会报"Field 'mutation' doesn't exist on type 'QueryRoot'"的错误。而当你去掉外层的mutation后,appSubscriptionCreate本身是mutation字段,自然也不存在于QueryRoot上,所以第二个错误也随之而来。
另外,shopify_api的ShopifyAPI::GraphQL客户端确实没有单独的mutation方法——因为它依赖的graphql-client库,不管是query还是mutation,都用query方法执行,只要你的GraphQL语句是正确的mutation格式就行。
正确的代码实现
下面是修正后的完整代码示例:
# 初始化GraphQL客户端(确保你已经完成了Shopify的OAuth认证,客户端已正确配置) @@client = ShopifyAPI::GraphQL.new # 正确定义mutation:注意语法是直接以mutation开头,而非嵌套在{}里 PAYMENT_MUTATION = @@client.parse <<-'GRAPHQL' mutation CreateAppSubscription { appSubscriptionCreate( name: "Super Duper Recurring Plan" returnUrl: "http://super-duper.shopifyapps.com" lineItems: [ { plan: { appRecurringPricingDetails: { price: { amount: 10.00, currencyCode: USD } } } } ] ) { userErrors { field message } confirmationUrl appSubscription { id } } } GRAPHQL def initialize # 用query方法执行mutation,graphql-client会自动识别类型 @result = @@client.query(PAYMENT_MUTATION) # 可以先检查是否有错误 if @result.data.appSubscriptionCreate.userErrors.any? puts "创建订阅出错: #{@result.data.appSubscriptionCreate.userErrors.map(&:message).join(', ')}" end end def confirmation_url @result.data.appSubscriptionCreate.confirmationUrl end
关键注意点
- mutation语法:必须以
mutation [可选名称] { ... }开头,这是GraphQL标准的mutation写法,graphql-client会正确识别这是一个mutation操作,而不是query。 - 错误处理:别忘了处理
userErrors,Shopify的mutation通常会返回这些错误信息,方便你排查问题(比如参数格式错误、权限不足等)。 - 客户端配置:确保你的
ShopifyAPI::GraphQL客户端已经正确设置了shop域名、API密钥、访问令牌等认证信息,否则会出现权限错误。
这样修改后,你应该就能成功创建应用订阅并获取到confirmationUrl了。
内容的提问来源于stack exchange,提问作者Lull
相关产品推荐
相关产品推荐

