Ruby Authorize.net:用户如何指定默认付款方式?我怎么猜呢?

Ruby Authorize.net:用户如何指定默认付款方式?我怎么猜呢?,ruby,authorize.net,Ruby,Authorize.net,当用户登录时,他们可以输入多种付款方式和信用卡。无法选择默认值 当我在收费之前获取支付配置文件,并忽略支付配置文件id以获取默认值时,它会给出一个错误 注意:如果以前已将付款配置文件设置为默认付款配置文件,则可以使用customerProfileId作为唯一参数提交此请求。如果先前已指定默认付款配置文件,则仅使用客户配置文件ID提交此请求将导致返回默认付款配置文件的信息。如果未将任何付款配置文件指定为默认付款配置文件,则未指定付款配置文件将导致错误 那么如何获取默认的付款配置文件id呢?是的

当用户登录时,他们可以输入多种付款方式和信用卡。无法选择默认值

当我在收费之前获取支付配置文件,并忽略支付配置文件id以获取默认值时,它会给出一个错误

注意:如果以前已将付款配置文件设置为默认付款配置文件,则可以使用customerProfileId作为唯一参数提交此请求。如果先前已指定默认付款配置文件,则仅使用客户配置文件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();