【发布时间】:2020-01-09 08:28:20
【问题描述】:
我一直致力于将我的 Rails、Shopify 嵌入式应用程序连接到 Shopify 计费 API。看起来很简单:
- 您通过 API 创建一个新的 Shopify RecurringApplicationCharge 对象,将其提交给 Shopify。
- 他们返回填充了其他字段的对象,包括您可以重定向到的“confirmation_url”。
- 此确认 URL 有一个 charge_id 参数,您可以使用它来激活计费。
我可以顺利完成上述操作,甚至可以在日志中以及运行 params.inspect 时看到“charge_id”参数。但是,我不能使用它。每次我尝试将参数分配给实例变量时,我都会得到“nil class”。
控制器
class HomeController < AuthenticatedController
before_action :require_login, except: [:activate_charge]
skip_before_action :verify_authenticity_token, only: [:activate_charge]
before_action :require_subscription, except: [:activate_charge]
def require_subscription
unless ShopifyAPI::RecurringApplicationCharge.current
@recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.new
@recurring_application_charge.name = "Monthly Plan"
@recurring_application_charge.price = 15.0
@recurring_application_charge.return_url = "https://xxxxx.ngrok.io/activatecharge"
@recurring_application_charge.test = true
@recurring_application_charge.trial_days = 7
@recurring_application_charge.save
if @recurring_application_charge.id
#@tokens[:confirmation_url] = @recurring_application_charge.confirmation_url
fullpage_redirect_to(@recurring_application_charge.T)
end
end
end
def activate_charge
@params = params[:charge_id]
#@recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.find(params[:charge_id])
#@recurring_application_charge.status == "accepted" ? @recurring_application_charge.activate : redirect_to('/')
#@recurring_application_charge.save
redirect_to('/')
end
def recurring_application_charge_params
params.require(:recurring_application_charge).permit(:name, :price, :capped_amount, :terms, :trial_days, :charge_id)
end
params.inspect
<ActionController::Parameters {"charge_id"=>"12271520309", "hmac"=>"f7a75bba157ef40b3144d8d0e8ceb8b37628ea294fbe16887b623c0d311d84da", "locale"=>"en-GB", "session"=>"f8b8ef448a1d9883e4884c858e0bc39d789d53d2eeffffb34c42f5bc390af6f1", "shop"=>"xxxxx.myshopify.com", "timestamp"=>"1578555752", "controller"=>"home", "action"=>"activate_charge"} permitted: true>
一些线索
我有一个用于其他用途的 API 控制器,它未经 Shopify 或 Clearance 的身份验证。如果我使用这个控制器,我可以获得“charge_id”参数(尽管这个控制器不能用于其他原因)。
我一直在尝试确保强大的参数允许它,但我没有写入模型,所以这不重要吗?
在关于如何设置计费的旧 Shopify 页面上,他们在第一个对象创建阶段有这行代码,我无法实现:
@tokens[:confirmation_url] = recurring_application_charge.confirmation_url
任何帮助都会很棒,我不知道这是否是一个非常简单的问题,或者是否存在我完全没有注意到的身份验证问题。
谢谢!
编辑 返回,当 params.class 和 params.inspect 被调用时
ActionController::Parameters
<ActionController::Parameters {"charge_id"=>"12284756045", "hmac"=>"9ff4d8a30d623f2d03d0226ff3d98c780e451615d630c149697e5b2dd4ffd4b5", "locale"=>"en-GB", "session"=>"f8b8ef448a1d9883e4884c852e0bc39d789d53d2eeffffb34c42f5bc390af6f1", "shop"=>"xxxx.myshopify.com", "timestamp"=>"1578737591", "controller"=>"home", "action"=>"activate_charge"} permitted: false>
另一条信息,如果我将以下内容添加到控制器:
params = params.to_h[:charge_id]
然后调用params["charge_id"],从视图中可以得到返回的charge_id。 但是,当我尝试将其分配给控制器中的@charge_id,然后尝试在视图中调用@charge_id 进行测试时,它什么也不返回:S
params = params.to_h[:charge_id]
@charge_id = params["charge_id"]
【问题讨论】:
-
您说每次将参数分配给实例变量时,都会得到 nil 类;我猜你说的是
@params = params[:charge_id]?如果是这样,那么您当时是说@params等于nil?如果是这样,您能否在@params = params[:charge_id]下方添加puts params.class和puts params.inspect,并让我知道输出。我有一种感觉,可能在某个地方,params对象已被修改,或者为什么你得到了nil值。 -
完全同意@Jay-ArPolidario,请检查您的 ID 类别以及您希望将其分配到的类别。
-
嗨 Jay 和 ARK,感谢您的帮助。我刚刚将输出添加到问题的底部。
-
我现在发现,由于某些奇怪的原因,当 Shopify 重定向到 /activate_charge 时,我的应用程序忽略了控制器的 active_charge 方法中的所有代码。我认为这就是我的问题所在。
标签: ruby-on-rails ruby-on-rails-4 shopify-app