- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个 Rails 应用程序,允许用户成为订阅用户,费用为 X 美元/年,但我被困在订阅页面上,无论我做什么,stripeToken 都不会附加到请求中,并且 CreateSubscription.rb 说“这个客户没有附加付款来源”。我的 Turbolinks 被禁用。
我的 Stripe 日志显示它正在收到带有 POST 正文的请求:电子邮件:“[email protected]”计划:“praducks-year”但错误抛出如下 - 因为没有附加到请求的源对象 -错误:类型:“无效请求错误”消息:“该客户没有附加付款来源”
CreateSubscription.rb
class CreateSubscription
def self.call(plan, email_address, token)
user, raw_token = CreateUser.call(email_address)
subscription = Subscription.new(
plan: plan,
user: user
)
begin
stripe_sub = nil
if user.stripe_customer_id.blank?
puts "Customer is new"
puts token.nil?
customer = Stripe::Customer.create(
source: token,
email: user.email,
plan: plan.stripe_id,
)
user.stripe_customer_id = customer.id
user.save!
stripe_sub = customer.subscriptions.first
else
puts "Customer exists"
customer = Stripe::Customer.retrieve(user.stripe_customer_id)
# Check if the customer was a stripe customer, but had no source added
# If no source then update customer here:-
# if customer.sources.total_count == 0
# customer.source = token
# customer.save
# end
stripe_sub = customer.subscriptions.create(
plan: plan.stripe_id
)
end
subscription.stripe_id = stripe_sub.id
subscription.save!
rescue Stripe::StripeError => e
subscription.errors[:base] << e.message
end
subscription
end
end
CreateUser.rb
class CreateUser
def self.call(email_address)
user = User.find_by(email: email_address)
return user if user.present?
raw_token, enc_token = Devise.token_generator.generate(
User, :reset_password_token)
password = SecureRandom.hex(32)
user = User.create!(
email: email_address,
password: password,
password_confirmation: password,
reset_password_token: enc_token,
reset_password_sent_at: Time.now
)
return user, raw_token
end
end
订阅.js
jQuery(function($) {
$('#payment-form').submit(function(event) {
var $form = $(this);
alert('CLICKED');
$form.find('button').prop('disabled', true);
Stripe.card.createToken($form, stripeResponseHandler);
return false;
});
});
function stripeResponseHandler(status, response) {
var $form = $('#payment-form');
if (response.error) {
// Show the errors on the form
$form.find('.payment-errors').text(response.error.message);
$form.find('button').prop('disabled', false);
} else {
// response contains id and card, which contains additional card details
var token = response.id;
// Insert the token into the form so it gets submitted to the server
$form.append($('<input type="hidden" name="stripeToken" />').val(token));
// and submit
$form.get(0).submit();
}
};
订阅 Controller
class SubscriptionsController < ApplicationController
before_filter :authenticate_user!
before_filter :load_plans
def index
# if !current_user.subscription.nil?
# redirect_to edit_subscription_path
# end
end
def new
@subscription = Subscription.new
@plan = Plan.find_by_id(params[:plan_id])
if @plan.nil?
redirect_to subscriptions_path, :notice => "Please select a plan first."
end
end
def create
@plan = Plan.find(params[:plan_id])
puts params[:stripeToken]
@subscription = CreateSubscription.call(
@plan,
params[:email_address],
params[:stripeToken]
)
if @subscription.errors.blank?
flash[:notice] = 'Thank you for your upgrade! ' +
'Enjoy your premium membership at Praducks.com. ' +
'We also sent you an email with the details of your purchase.'
redirect_to '/'
else
render :new
end
end
def edit
@subscription = current_user.subscription
if @subscription.nil?
redirect_to subscriptions_path, :notice => "Please join a membership before making changes"
end
end
def update
@subscription = current_user.subscription
@subscription = ChangeSubscriptionCard.call(
@subscription,
params[:stripeToken]
)
if @subscription.errors.blank?
flash[:notice] = 'Account updated!'
redirect_to '/'
else
render :edit
end
end
protected
def load_plans
@plans = Plan.where(published: true).order('amount')
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def subscriptions_params
params.require(:subscription).permit(:email_address, :stripeToken)
end
end
new.html.erb
<!--<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">-->
<div class="col2">
<div class="shoppingcart">
<% unless @subscription.errors.blank? %>
<%= @subscription.errors.full_messages.to_sentence %>
<% end %>
<h4 class="heading colr">Joining <%= @plan.name %></h4>
<div class="clear"></div>
<div class="cart_form">
<div class="form_cont">
<%= form_for @subscription, url: subscription_path, html: { id: 'payment-form' } do |f| %>
<input type="hidden" name="plan_id" value="<%= @plan.id %>" />
<input type="hidden" name="stripeEmail" value="<%= current_user.email %>" />
<input type="hidden" name="email_address" value="<%= current_user.email %>" />
<span class="payment-errors"></span>
<%= f.label :Email_Address %>: <%= current_user.email %>
<div class="clear"></div>
<%= f.label :Card_Number %>
<div class="clear"></div>
<input type="text" size="20" data-stripe="number"/>*
<div class="clear"></div>
<%= f.label :CVC %>
<div class="clear"></div>
<input type="text" size="4" data-stripe="cvc"/>*
<div class="clear"></div>
<%= f.label :"Expiration (MM/YYYY)" %>
<div class="clear"></div>
<input type="text" data-stripe="exp-month" placeholder="mm" id="exp" limit="2"/>
<input type="text" data-stripe="exp-year" placeholder="yyyy" id="exp" limit="4"/>*
<div class="clear"></div>
<button type="submit">Join</button>
<% end %>
</div>
</div>
</div>
</div>
application.html.erb
<title><%= full_title(yield(:title)) %></title>
<% if params[:beta] == "1" %>
<% session[:beta] = "1" %>
<% end %>
<!--CSS-->
<%= stylesheet_link_tag 'application', media: 'all' %>
<!--<%= javascript_include_tag 'application', type: 'text/javascript'%>-->
<script type="text/javascript" src="https://s3-us-west-2.amazonaws.com/praducks-uploads/jquery.min.js"></script>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<%= csrf_meta_tags %>
<meta name="viewport" content="width=device-width, initial-scale=1"/><!-- Prelang: Analytics / Google Analytics -->
<%= analytics_init if Rails.env.production? or Rails.env.development? %>
<!--Javascript-->
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script type="text/javascript">
$(function(){
Stripe.setPublishableKey('<%= Rails.configuration.stripe[:publishable_key] %>');
});
</script>
<script type="text/javascript" src="/js/subscriptions.js"></script>
</head>
<body data-no-turbolink>
<div id ="wrapper_sec">
<% if Rails.env.production? %>
<% if session[:beta] == "1" %>
<%= render partial: "elements/navbar" %>
<%= bootstrap_flash %>
<!-- Bread Crumb Section -->
<%= render partial: "elements/crumbs" unless current_page?(root_url) %>
<div class="clear"></div>
<%= yield %>
<%= render partial: "elements/footer" %>
<% else %>
<%= render "layouts/comingsoon" %>
<% end %>
<% else %>
<%= render partial: "elements/navbar" %>
<%= bootstrap_flash %>
<!-- Banner -->
<%= render "elements/banner" if current_page?(root_url) %>
<!-- Bread Crumb Section -->
<%= render partial: "elements/crumbs" %>
<div class="clear"></div>
<div id="content_sec">
<%= render "elements/leftnav" %>
<%= yield %>
</div>
<%= render partial: "elements/footer" %>
<% end %>
</div>
</body>
最佳答案
在本地运行此代码后,我看到了一些事情:
我注意到,subscriptions.js 并未使用rails 帮助器方法javascript_include_tag
包含在内。除非您已将脚本放入应用的 public/js
文件夹中,否则您的脚本可能不会出现在页面上。
假设您确实在 public/js
中拥有它并且它位于页面上,我在提交表单时注意到此错误:
Uncaught TypeError: $form.find(...).prop is not a function
由于此错误,您的提交处理程序永远不会达到 return false
以阻止表单提交,因此它在没有 Stripe token 的情况下提交。
页面上的 jquery 版本是 1.3.2,.prop
不可用,这是此错误的原因。
如果您不想升级 jquery 版本,可以将 .prop
替换为 .attr
:
$form.find('button').prop('disabled', true);
变成:
$form.find('button').attr('disabled', true);
此外,如果您想确保表单不提交(假设启用了 javascript),我通常会在提交处理程序的开头添加此行:
event.preventDefault();
这应该确保您的表单不会提交。您还可以删除处理程序末尾的 return false
,因为不再需要它。
关于ruby-on-rails - Stripe token 未附加到 Rails 应用程序的请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014977/
我找到了 this excellent question and answer它以 x/y(加上 center x/y 和 degrees/radians)开始并计算旋转- 到 x'/y'。这个计算很
全部: 我已经创建了一个 Windows 窗体和一个按钮。在另一个线程中,我试图更改按钮的文本,但它崩溃了;但是如果我尝试更改按钮的颜色,它肯定会成功。我认为如果您更改任何 Windows 窗体控件属
本网站的另一个问题已证实,C 中没有缩写的字面后缀,并且可以执行以下操作: short Number = (short)1; 但是转换它和不这样做有什么区别: short Number = 1; 您使
我有下表: ID (int) EMAIL (varchar(50)) CAMPAIGNID (int) isSubscribe (bit) isActionByUser (bit) 此表存储了用户对事
也就是说,无需触发Javascript事件即可改变的属性,如何保留我手动选中或取消选中的复选框的状态,然后复制到另一个地方? 运行下面的代码片段并选中或取消选中其中的一些,然后点击“复制”: $('#
我在网上找到的所有关于递增指针导致段错误的示例都涉及指针的取消引用 - 如果我只想递增它(例如在 for 循环的末尾)并且我不在乎它是否最终进入无效内存,因为我不会再使用它。例如,在这个程序中,每次迭
我有一个 Spring MVC REST 服务,它使用 XStream 将消息与 XML 相互转换。 有什么方法可以将请求和响应中的 xml(即正文)打印到普通的 log4j 记录器? 在 Contr
做我的任务有一个很大的挑战,那就是做相互依赖的任务我在这张照片中说的。假设我们有两个任务 A 和 B,执行子任务 A1、A2 和 B1、B2,假设任务 B 依赖于 A。 要理想地执行任务 B,您应该执
通过阅读该网站上的几个答案,我了解到 CoInitialize(Ex) should be called by the creator of a thread 。然后,在该线程中运行的任何代码都可以使
这个问题已经困扰我一段时间了。我以前从未真正使用过 ListViews,也没有使用过 FirebaseListAdapters。我想做的就是通过显示 id 和用户位置来启动列表的基础,但由于某种原因,
我很难解释这两个(看似简单)句子的含义: “受检异常由编译器在编译时检查” 这是什么意思?编译器检查是否捕获了所有已检查的异常(在代码中抛出)? “未经检查的异常在运行时检查,而不是编译时” 这句话中
我有一个包含排除子字符串的文本文件,我想迭代该文件以检查并返回不带排除子字符串的输入项。 这里我使用 python 2.4,因此下面的代码可以实现此目的,因为 with open 和 any 不起作用
Spring 的缓存框架能否了解请求上下文的身份验证状态,或者更容易推出自己的缓存解决方案? 最佳答案 尽管我发现这个用例 super 奇怪,但您可以为几乎任何与 SpEL 配合使用的内容设置缓存条件
我有以下函数模板: template HeldAs* duplicate(MostDerived *original, HeldAs *held) { // error checking omi
如果我的应用程序具有设备管理员/设备所有者权限(未获得 root 权限),我如何才能从我的应用程序中终止(或阻止启动)另一个应用程序? 最佳答案 设备所有者可以阻止应用程序: DevicePolicy
非常简单的问题,但我似乎无法让它正常工作。 我有一个组件,其中有一些 XSLT(用于导航)。它通过 XSLT TBB 使用 XSLT Mediator 发布。 发布后
我正在将一个对象拖动到一个可拖放的对象内,该对象也是可拖动的。放置对象后,它会嵌套在可放置对象内。同样,如果我将对象拖到可放置的外部,它就不再嵌套。 但是,如果我经常拖入和拖出可放置对象,则可拖动对象
我正在尝试为按钮和弹出窗口等多个指令实现“取消选择”功能。也就是说,我希望当用户单击不属于指令模板一部分的元素时触发我的函数。目前,我正在使用以下 JQuery 代码: $('body').click
我从 this question 得到了下面的代码,该脚本用于在 Google tasks 上更改 iframe[src="about:blank"] 内的 CSS使用 Chrome 扩展 Tempe
我有一些 @Mock 对象,但没有指定在该对象上调用方法的返回值。该方法返回 int (不是 Integer)。我很惊讶地发现 Mockito 没有抛出 NPE 并返回 0。这是预期的行为吗? 例如:
我是一名优秀的程序员,十分优秀!