Ruby Authorize.net:用户如何指定默认付款方式?我怎么猜呢?
当用户登录时,他们可以输入多种付款方式和信用卡。无法选择默认值 当我在收费之前获取支付配置文件,并忽略支付配置文件id以获取默认值时,它会给出一个错误 注意:如果以前已将付款配置文件设置为默认付款配置文件,则可以使用customerProfileId作为唯一参数提交此请求。如果先前已指定默认付款配置文件,则仅使用客户配置文件ID提交此请求将导致返回默认付款配置文件的信息。如果未将任何付款配置文件指定为默认付款配置文件,则未指定付款配置文件将导致错误Ruby Authorize.net:用户如何指定默认付款方式?我怎么猜呢?,ruby,authorize.net,Ruby,Authorize.net,当用户登录时,他们可以输入多种付款方式和信用卡。无法选择默认值 当我在收费之前获取支付配置文件,并忽略支付配置文件id以获取默认值时,它会给出一个错误 注意:如果以前已将付款配置文件设置为默认付款配置文件,则可以使用customerProfileId作为唯一参数提交此请求。如果先前已指定默认付款配置文件,则仅使用客户配置文件ID提交此请求将导致返回默认付款配置文件的信息。如果未将任何付款配置文件指定为默认付款配置文件,则未指定付款配置文件将导致错误 那么如何获取默认的付款配置文件id呢?是的
那么如何获取默认的付款配置文件id呢?是的,我可以获得所有的付款模式,但我如何知道客户打算使用哪一种模式?这是不可能的。您应该显示另一个表单供用户选择默认值。完全迟钝。让我想违反PCI法规,自己存储所有信用卡 客户无法在表单上指明他们希望作为默认配置文件的配置文件。但是,您可以通过使用API执行getCustomerPaymentProfileListRequest来检索[所有]支付配置文件,然后以客户可以向您指示哪一个应为默认配置文件的方式将该列表呈现给客户来实现这一点。然后,您需要执行updateCustomerPaymentProfileRequest以将所选配置文件设置为默认配置文件 我最终只允许一个付款模式。如果支付配置文件id不存在,则显示添加表单。如果是,则显示编辑表单。唯一的缺点是,它不允许用户在创建支付配置文件后在信用卡和银行账户之间切换
routes.rb
resource :payment_profile, only: [:edit] do # Authorize.net customer profile & payment profile
collection do
get :anedit
post :charge
end
end
payment\u profiles\u controller.rb
class PaymentProfilesController < ApplicationController
include AuthorizeNet::API
before_action :set_subscription
layout false, only: :anedit
def edit
unless @subscription.authorizenet
create_empty_customer_profile
else
get_customer_profile # update profile as they may have added a payment profile (or not)
end
end
def anedit
unless @subscription.authorizenet # in case #edit failed to create a new empty profile
render plain: "No customer profile available to edit. Please try again later." and return
end
@payment_profile_id = @subscription.authorizenet.customer_payment_profile_id
if Rails.env == 'production'
if @payment_profile_id
@action_url = "https://accept.authorize.net/customer/editPayment"
else
@action_url = "https://accept.authorize.net/customer/addPayment"
end
else
if @payment_profile_id
@action_url = "https://test.authorize.net/customer/editPayment"
else
@action_url = "https://test.authorize.net/customer/addPayment"
end
end
# show hosted form
...
setting5 = SettingType.new
setting5.settingName = SettingNameEnum::HostedProfileBillingAddressRequired
setting5.settingValue = true
settings = Settings.new([setting1, setting2, setting3, setting4, setting5, setting6])
request = GetHostedProfilePageRequest.new
request.customerProfileId = @subscription.authorizenet.customer_profile_id
request.hostedProfileSettings = settings
response = transaction.get_hosted_profile_page(request)
if response.messages.resultCode == MessageTypeEnum::Ok
# puts "Successfully got Accept Customer page token."
# puts " Response code: #{response.messages.messages[0].code}"
# puts " Response message: #{response.messages.messages[0].text}"
# puts " Token: #{response.token}"
@token = response.token
else
# puts "#{response.messages.messages[0].code}"
# puts "#{response.messages.messages[0].text}"
render plain: "Failed to get hosted profile page with customer profile ID #{request.customerProfileId}: #{response.messages.messages[0].code} #{response.messages.messages[0].text}"
return
end
end
# create authorize.net customer profile
def create_empty_customer_profile
# Build the request object
request = CreateCustomerProfileRequest.new
# Build the profile object containing the main information about the customer profile
request.profile = CustomerProfileType.new
request.profile.merchantCustomerId = @user.id
request.profile.email = @user.email
response = transaction.create_customer_profile(request)
if response != nil
puts response.messages.resultCode
if response.messages.resultCode == MessageTypeEnum::Ok
puts "Successfully created a customer profile with id: #{response.customerProfileId}"
puts " Customer Payment Profile Id List:"
response.customerPaymentProfileIdList.numericString.each do |id|
puts " #{id}"
end
puts " Customer Shipping Address Id List:"
response.customerShippingAddressIdList.numericString.each do |id|
puts " #{id}"
end
@subscription.create_authorizenet user: @user, customer_profile_id: response.customerProfileId #, customer_payment_profile_id: response.customerPaymentProfileIdList.numericString.first
else
puts response.messages.messages[0].code
puts response.messages.messages[0].text
flash.now.alert = "Failed to create a new customer profile: #{response.messages.messages[0].code} #{response.messages.messages[0].text}"
#render :new
end
else
puts "Response is null"
flash.now.alert = "Failed to create a new customer profile."
end
end
def get_customer_profile
request = GetCustomerProfileRequest.new
request.customerProfileId = @subscription.authorizenet.customer_profile_id
response = transaction.get_customer_profile(request)
if response.messages.resultCode == MessageTypeEnum::Ok
puts "Successfully retrieved customer profile of customer ID #{request.customerProfileId}."
response.profile.paymentProfiles.each do |paymentProfile|
puts " Payment Profile ID #{paymentProfile.customerPaymentProfileId}"
puts " Payment Details:"
if paymentProfile.billTo != nil
puts " Last Name: #{paymentProfile.billTo.lastName}"
puts " Address: #{paymentProfile.billTo.address}"
end
end
if response.subscriptionIds != nil && response.subscriptionIds.subscriptionId != nil
puts " List of subscriptions: "
response.subscriptionIds.subscriptionId.each do |subscriptionId|
puts " #{subscriptionId}"
end
end
# now update the payment profile id
@subscription.authorizenet.update customer_payment_profile_id: response.profile.paymentProfiles.first&.customerPaymentProfileId
else
puts response.messages.messages[0].text
flash.alert = "Failed to get profile of customer ID #{request.customerProfileId}."
end
return response
end
anedit.haml
-content_for :head do
%meta(name="turbolinks-cache-control" content="no-preview")
%iframe{src: anedit_user_subscription_payment_profile_path(@user), width: '100%', height: '900px', frameborder: 0}
%form#authorizenetform{:action => @action_url, :method => "post"}
%input{:type => "hidden", :name => "token", :value => @token}/
-if @payment_profile_id
%input{:type => "hidden", :name => "paymentProfileId", :value => @payment_profile_id}/
%input{:type => "submit", :value => "Update Payment"}/
-# Separate iframe document without layout. No access to JQuery.
:javascript
document.getElementById('authorizenetform').submit();
%form#authorizenetform{:action => @action_url, :method => "post"}
%input{:type => "hidden", :name => "token", :value => @token}/
-if @payment_profile_id
%input{:type => "hidden", :name => "paymentProfileId", :value => @payment_profile_id}/
%input{:type => "submit", :value => "Update Payment"}/
-# Separate iframe document without layout. No access to JQuery.
:javascript
document.getElementById('authorizenetform').submit();