Mokėjimo scenarijų pavyzdžiai

Mokėjimo scenarijai sąveikauja su mokėjimo sietuvais ir gali keisti sietuvo pavadinimą, matomumą bei rodymo padėtį. Šie scenarijai paleidžiami kaskart, kai Jūsų klientas atsiskaitymo metu pasiekia mokėjimo būdo puslapį. Mokėjimo scenarijai nesąveikauja su pagreitintais atsiskaitymais, nes pagreitinti atsiskaitymai Jūsų klientams rodomi prieš jiems pasiekiant atsiskaitymo puslapį.

Norėdami naudoti šiame puslapyje esančius šablonus, sukurkite naują scenarijų su tuščiu šablonu.

Veiksmai:

  1. Savo „Shopify“ administratoriaus skydelyje eikite į Programėlės > Script Editor.

  2. Spustelėkite Sukurti scenarijų.

  3. Spustelėkite Mokėjimo sietuvai.

  4. Pasirinkite Tuščias šablonas, tada spustelėkite Sukurti scenarijų.

  5. Sekcijoje Ruby pirminis kodas ištrinkite numatytąją kodo eilutę: Output.cart = Input.cart

  6. Nukopijuokite scenarijų iš šio puslapio ir įklijuokite jį į sekciją Ruby pirminis kodas.

  7. Redaguokite scenarijaus sekciją Tinkami nustatymai, kad jis veiktų Jūsų parduotuvėje.

  8. Išbandykite savo scenarijų. Daugiau informacijos rasite „Shopify“ scenarijų testavimas ir derinimas.

  9. Išbandžius:

    • spustelėkite Įrašyti juodraštį, kad išsaugotumėte nepaskelbtą scenarijaus juodraštį, arba
    • spustelėkite Išsaugoti ir paskelbti, kad sukurtumėte ir paskelbtumėte scenarijų.

Rodyti sietuvus konkretiems klientams

Naudokite šį scenarijų, kad būtų rodoma tik konkreti sietuvo parinktis konkrečiomis žymomis pažymėtiems klientams.

Pavyzdžiui, rodykite tik konkretų sietuvą klientams su žyma VIP – visiems kitiems klientams sietuvas yra paslėptas.

# ================================ Customizable Settings ================================
# ================================================================
# Show Gateways For Customer Tag
#
# If we have a matching customer, the entered gateway(s) will be
# shown, and all others will be hidden. Otherwise, the entered
# gateway(s) will be hidden.
#
#   - 'customer_tag_match_type' determines whether we look for the customer
#     to be tagged with any of the entered tags or not. Can be:
#       - ':include' to check if the customer is tagged
#       - ':exclude' to make sure the customer isn't tagged
#   - 'customer_tags' is a list of customer tags to trigger the
#     campaign
#   - 'gateway_match_type' determines whether the below strings
#     should be an exact or partial match. Can be:
#       - ':exact' for an exact match
#       - ':partial' for a partial match
#   - 'gateway_names' is a list of strings to identify gateways
# ================================================================
SHOW_GATEWAYS_FOR_CUSTOMER_TAG = [
  {
    customer_tag_match_type: :include,
    customer_tags: ["customer_tag", "another_tag"],
    gateway_match_type: :exact,
    gateway_names: ["Gateway", "Other Gateway"],
  },
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# CustomerTagSelector
#
# Finds whether the supplied customer has any of the entered tags.
# ================================================================
class CustomerTagSelector
  def initialize(match_type, tags)
    @comparator = match_type == :include ? 'any?' : 'none?'
    @tags = tags.map { |tag| tag.downcase.strip }
  end

  def match?(customer)
    customer_tags = customer.tags.map { |tag| tag.downcase.strip }
    (@tags & customer_tags).send(@comparator)
  end
end

# ================================================================
# GatewayNameSelector
#
# Finds whether the supplied gateway name matches any of the
# entered names.
# ================================================================
class GatewayNameSelector
  def initialize(match_type, gateway_names)
    @comparator = match_type == :exact ? '==' : 'include?'
    @gateway_names = gateway_names.map { |name| name.downcase.strip }
  end

  def match?(payment_gateway)
    @gateway_names.any? { |name| payment_gateway.name.downcase.strip.send(@comparator, name) }
  end
end

# ================================================================
# ShowGatewaysForCustomerTagCampaign
#
# If the customer has any of the entered tags, the entered gateways
# are shown/hidden depending on the entered settings
# ================================================================
class ShowGatewaysForCustomerTagCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart, payment_gateways)
    @campaigns.each do |campaign|
      customer_tag_selector = CustomerTagSelector.new(
        campaign[:customer_tag_match_type],
        campaign[:customer_tags],
      )

      customer_match = cart.customer.nil? ? false : customer_tag_selector.match?(cart.customer)

      gateway_name_selector = GatewayNameSelector.new(
        campaign[:gateway_match_type],
        campaign[:gateway_names],
      )

      payment_gateways.delete_if do |payment_gateway|
        gateway_name_selector.match?(payment_gateway) != customer_match
      end
    end
  end
end

CAMPAIGNS = [
  ShowGatewaysForCustomerTagCampaign.new(SHOW_GATEWAYS_FOR_CUSTOMER_TAG),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways

Slėpti sietuvus konkretiems klientams

Naudokite šį scenarijų, norėdami paslėpti konkretų sietuvą konkrečiomis žymomis pažymėtiems klientams.

Pavyzdžiui, paslėpkite konkretų sietuvą klientams, turintiems žymą HIDE_GATEWAY.

# ================================ Customizable Settings ================================
# ================================================================
# Hide Gateways For Customer Tag
#
# If we have a matching customer, the entered gateway(s) will be
# hidden.
#
#   - 'customer_tag_match_type' determines whether we look for the customer
#     to be tagged with any of the entered tags or not. Can be:
#       - ':include' to check if the customer is tagged
#       - ':exclude' to make sure the customer isn't tagged
#   - 'customer_tags' is a list of customer tags to trigger the
#     campaign
#   - 'gateway_match_type' determines whether the below strings
#     should be an exact or partial match. Can be:
#       - ':exact' for an exact match
#       - ':partial' for a partial match
#   - 'gateway_names' is a list of strings to identify gateways
# ================================================================
HIDE_GATEWAYS_FOR_CUSTOMER_TAG = [
  {
    customer_tag_match_type: :include,
    customer_tags: ["customer_tag", "another_tag"],
    gateway_match_type: :exact,
    gateway_names: ["Gateway", "Other Gateway"],
  },
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# CustomerTagSelector
#
# Finds whether the supplied customer has any of the entered tags.
# ================================================================
class CustomerTagSelector
  def initialize(match_type, tags)
    @comparator = match_type == :include ? 'any?' : 'none?'
    @tags = tags.map { |tag| tag.downcase.strip }
  end

  def match?(customer)
    customer_tags = customer.tags.map { |tag| tag.downcase.strip }
    (@tags & customer_tags).send(@comparator)
  end
end

# ================================================================
# GatewayNameSelector
#
# Finds whether the supplied gateway name matches any of the
# entered names.
# ================================================================
class GatewayNameSelector
  def initialize(match_type, gateway_names)
    @comparator = match_type == :exact ? '==' : 'include?'
    @gateway_names = gateway_names.map { |name| name.downcase.strip }
  end

  def match?(payment_gateway)
    @gateway_names.any? { |name| payment_gateway.name.downcase.strip.send(@comparator, name) }
  end
end

# ================================================================
# HideGatewaysForCustomerTagCampaign
#
# If we have a matching customer, the entered gateway(s) will be
# hidden.
# ================================================================
class HideGatewaysForCustomerTagCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart, payment_gateways)
    return if cart.customer.nil?

    @campaigns.each do |campaign|
      customer_tag_selector = CustomerTagSelector.new(
        campaign[:customer_tag_match_type],
        campaign[:customer_tags],
      )

      next unless customer_tag_selector.match?(cart.customer)

      gateway_name_selector = GatewayNameSelector.new(
        campaign[:gateway_match_type],
        campaign[:gateway_names],
      )

      payment_gateways.delete_if do |payment_gateway|
        gateway_name_selector.match?(payment_gateway)
      end
    end
  end
end

CAMPAIGNS = [
  HideGatewaysForCustomerTagCampaign.new(HIDE_GATEWAYS_FOR_CUSTOMER_TAG),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways

Slėpti sietuvus konkretiems produktams

Naudokite šį scenarijų, norėdami paslėpti konkretų mokėjimo sietuvą, kai į krepšelį pridedami tam tikri daiktai.

Pavyzdžiui, paslėpkite konkretų mokėjimo sietuvą, jei klientas užsako kepurę.

# ================================ Customizable Settings ================================
# ================================================================
# Hide Gateway(s) for Product
#
# If the cart contains any matching items, the entered gateway(s)
# are hidden.
#
#   - 'product_selector_match_type' determines whether we look for
#     products that do or don't match the entered selectors. Can
#     be:
#       - ':include' to check if the product does match
#       - ':exclude' to make sure the product doesn't match
#   - 'product_selector_type' determines how eligible products
#     will be identified. Can be either:
#       - ':tag' to find products by tag
#       - ':type' to find products by type
#       - ':vendor' to find products by vendor
#       - ':product_id' to find products by ID
#       - ':variant_id' to find products by variant ID
#       - ':subscription' to find subscription products
#   - 'product_selectors' is a list of strings or numbers to
#     identify products by the above selector type
#   - 'gateway_match_type' determines whether the below strings
#     should be an exact or partial match. Can be:
#       - ':exact' for an exact match
#       - ':partial' for a partial match
#   - 'gateway_names' is a list of strings to identify gateways
# ================================================================
HIDE_GATEWAY_FOR_PRODUCT = [
  {
    product_selector_match_type: :include,
    product_selector_type: :product_id,
    product_selectors: [1234567890987, 1234567890986],
    gateway_match_type: :exact,
    gateway_names: ["Gateway", "Other Gateway"],
  },
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# ProductSelector
#
# Finds matching products by the entered criteria.
# ================================================================
class ProductSelector
  def initialize(match_type, selector_type, selectors)
    @match_type = match_type
    @comparator = match_type == :include ? 'any?' : 'none?'
    @selector_type = selector_type
    @selectors = selectors
  end

  def match?(line_item)
    if self.respond_to?(@selector_type)
      self.send(@selector_type, line_item)
    else
      raise RuntimeError.new('Invalid product selector type')
    end
  end

  def tag(line_item)
    product_tags = line_item.variant.product.tags.map { |tag| tag.downcase.strip }
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@selectors & product_tags).send(@comparator)
  end

  def type(line_item)
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@match_type == :include) == @selectors.include?(line_item.variant.product.product_type.downcase.strip)
  end

  def vendor(line_item)
    @selectors = @selectors.map { |selector| selector.downcase.strip }
    (@match_type == :include) == @selectors.include?(line_item.variant.product.vendor.downcase.strip)
  end

  def product_id(line_item)
    (@match_type == :include) == @selectors.include?(line_item.variant.product.id)
  end

  def variant_id(line_item)
    (@match_type == :include) == @selectors.include?(line_item.variant.id)
  end

  def subscription(line_item)
    !line_item.selling_plan_id.nil?
  end
end

# ================================================================
# GatewayNameSelector
#
# Finds whether the supplied gateway name matches any of the
# entered names.
# ================================================================
class GatewayNameSelector
  def initialize(match_type, gateway_names)
    @comparator = match_type == :exact ? '==' : 'include?'
    @gateway_names = gateway_names.map { |name| name.downcase.strip }
  end

  def match?(payment_gateway)
    @gateway_names.any? { |name| payment_gateway.name.downcase.strip.send(@comparator, name) }
  end
end

# ================================================================
# HideGatewayForProductCampaign
#
# If the cart contains any matching items, the entered gateway(s)
# are hidden.
# ================================================================
class HideGatewayForProductCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart, payment_gateways)
    @campaigns.each do |campaign|
      product_selector = ProductSelector.new(
        campaign[:product_selector_match_type],
        campaign[:product_selector_type],
        campaign[:product_selectors],
      )

      next unless cart.line_items.any? { |line_item| product_selector.match?(line_item) }

      gateway_name_selector = GatewayNameSelector.new(
        campaign[:gateway_match_type],
        campaign[:gateway_names],
      )

      payment_gateways.delete_if do |payment_gateway|
        gateway_name_selector.match?(payment_gateway)
      end
    end
  end
end

CAMPAIGNS = [
  HideGatewayForProductCampaign.new(HIDE_GATEWAY_FOR_PRODUCT),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways

Mokėjimo sietuvų rodymas konkrečioms šalims

Naudokite šį scenarijų, norėdami rodyti tik konkretų mokėjimo sietuvą, kai klientas užsako iš konkrečios šalies.

Pavyzdžiui, rodyti tik konkretų mokėjimo sietuvą, jei klientas užsako iš Kanados – mokėjimo sietuvas yra paslėptas adresams visose kitose šalyse.

# ================================ Customizable Settings ================================
# ================================================================
# Show Gateway(s) for Country
#
# If the shipping address country matches any of the entered
# countries, the entered gateway(s) will be shown, and all others
# will be hidden. Otherwise, the entered gateway(s) will be hidden.
#
#   - 'country_code_match_type' determines whether we look for the cart
#     country to match the entered selectors or not. Can be:
#       - ':include' to look for a country in the list
#       - ':exclude' to make sure the country is not in the list
#   - 'country_codes' is a list of 2-character abbreviations for
#     the applicable countries
#   - 'gateway_match_type' determines whether the below strings
#     should be an exact or partial match. Can be:
#       - ':exact' for an exact match
#       - ':partial' for a partial match
#   - 'gateway_names' is a list of strings to identify gateways
# ================================================================
SHOW_GATEWAYS_FOR_COUNTRY = [
  {
    country_code_match_type: :include,
    country_codes: ["CA"],
    gateway_match_type: :exact,
    gateway_names: ["Gateway", "Other Gateway"],
  },
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# CountrySelector
#
# Finds whether the supplied country code matches the entered
# string.
# ================================================================
class CountrySelector
  def initialize(match_type, countries)
    @match_type = match_type
    @countries = countries.map { |country| country.upcase.strip }
  end

  def match?(country_code)
    (@match_type == :include) == @countries.include?(country_code.upcase.strip)
  end
end

# ================================================================
# GatewayNameSelector
#
# Finds whether the supplied gateway name matches any of the
# entered names.
# ================================================================
class GatewayNameSelector
  def initialize(match_type, gateway_names)
    @comparator = match_type == :exact ? '==' : 'include?'
    @gateway_names = gateway_names.map { |name| name.downcase.strip }
  end

  def match?(payment_gateway)
    @gateway_names.any? { |name| payment_gateway.name.downcase.strip.send(@comparator, name) }
  end
end

# ================================================================
# ShowGatewaysForCountryCampaign
#
# If the shipping address country matches any of the entered
# countries, the entered gateway(s) will be shown, and all others
# will be hidden. Otherwise, the entered gateway(s) will be hidden.
# ================================================================
class ShowGatewaysForCountryCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart, payment_gateways)
    address = cart.shipping_address

    @campaigns.each do |campaign|
      country_selector = CountrySelector.new(
        campaign[:country_code_match_type],
        campaign[:country_codes],
      )

      country_match = address.nil? ? false : country_selector.match?(address.country_code)

      gateway_name_selector = GatewayNameSelector.new(
        campaign[:gateway_match_type],
        campaign[:gateway_names],
      )

      payment_gateways.delete_if do |payment_gateway|
        gateway_name_selector.match?(payment_gateway) != country_match
      end
    end
  end
end

CAMPAIGNS = [
  ShowGatewaysForCountryCampaign.new(SHOW_GATEWAYS_FOR_COUNTRY),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways

Mokėjimo sietuvų slėpimas konkrečioms šalims

Naudokite šį scenarijų, norėdami paslėpti mokėjimo sietuvus konkrečiose šalyse.

Pavyzdžiui, paslėpkite konkretų mokėjimo sietuvą nuo klientų Kanadoje.

# ================================ Customizable Settings ================================
# ================================================================
# Hide Gateway(s) for Country
#
# If the shipping address country matches any of the entered
# countries, the entered gateway(s) will be hidden.
#
#   - 'country_code_match_type' determines whether we look for the cart
#     country to match the entered selectors or not. Can be:
#       - ':include' to look for a country in the list
#       - ':exclude' to make sure the country is not in the list
#   - 'country_codes' is a list of 2-character abbreviations for
#     the applicable countries
#   - 'gateway_match_type' determines whether the below strings
#     should be an exact or partial match. Can be:
#       - ':exact' for an exact match
#       - ':partial' for a partial match
#   - 'gateway_names' is a list of strings to identify gateways
# ================================================================
HIDE_GATEWAYS_FOR_COUNTRY = [
  {
    country_code_match_type: :include,
    country_codes: ["CA"],
    gateway_match_type: :exact,
    gateway_names: ["Gateway", "Other Gateway"],
  },
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# CountrySelector
#
# Finds whether the supplied country code matches the entered
# string.
# ================================================================
class CountrySelector
  def initialize(match_type, countries)
    @match_type = match_type
    @countries = countries.map { |country| country.upcase.strip }
  end

  def match?(country_code)
    (@match_type == :include) == @countries.include?(country_code.upcase.strip)
  end
end

# ================================================================
# GatewayNameSelector
#
# Finds whether the supplied gateway name matches any of the
# entered names.
# ================================================================
class GatewayNameSelector
  def initialize(match_type, gateway_names)
    @comparator = match_type == :exact ? '==' : 'include?'
    @gateway_names = gateway_names.map { |name| name.downcase.strip }
  end

  def match?(payment_gateway)
    @gateway_names.any? { |name| payment_gateway.name.downcase.strip.send(@comparator, name) }
  end
end

# ================================================================
# HideGatewaysForCountryCampaign
#
# If the shipping address country matches any of the entered
# countries, the entered gateway(s) will be hidden.
# ================================================================
class HideGatewaysForCountryCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart, payment_gateways)
    address = cart.shipping_address

    return if address.nil?

    @campaigns.each do |campaign|
      country_selector = CountrySelector.new(
        campaign[:country_code_match_type],
        campaign[:country_codes],
      )

      next unless country_selector.match?(address.country_code)

      gateway_name_selector = GatewayNameSelector.new(
        campaign[:gateway_match_type],
        campaign[:gateway_names],
      )

      payment_gateways.delete_if do |payment_gateway|
        gateway_name_selector.match?(payment_gateway)
      end
    end
  end
end

CAMPAIGNS = [
  HideGatewaysForCountryCampaign.new(HIDE_GATEWAYS_FOR_COUNTRY),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways

Mokėjimo sietuvų rodymas pagal išleistą sumą

Naudokite šį scenarijų, norėdami rodyti konkretų mokėjimo sietuvą, jei klientas išleidžia daugiau nei tam tikrą sumą.

Pavyzdžiui, parodykite konkretų mokėjimo sietuvą, jei klientas išleidžia 1 000 USD ar daugiau, kitu atveju jį paslėpkite.

# ================================ Customizable Settings ================================
# ================================================================
# Show Gateway(s) for Spend Threshold
#
# If the cart total is greater than, or equal to, the entered
# threshold, the entered gateway(s) are shown.
#
#   - 'threshold' is the dollar amount the customer must spend in
#     order to see the entered gateway(s)
#   - 'gateway_match_type' determines whether the below strings
#     should be an exact or partial match. Can be:
#       - ':exact' for an exact match
#       - ':partial' for a partial match
#   - 'gateway_names' is a list of strings to identify gateways
# ================================================================
SHOW_GATEWAYS_FOR_THRESHOLD = [
  {
    threshold: 500,
    gateway_match_type: :exact,
    gateway_names: ["Gateway", "Other Gateway"],
  },
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# GatewayNameSelector
#
# Finds whether the supplied gateway name matches any of the
# entered names.
# ================================================================
class GatewayNameSelector
  def initialize(match_type, gateway_names)
    @comparator = match_type == :exact ? '==' : 'include?'
    @gateway_names = gateway_names.map { |name| name.downcase.strip }
  end

  def match?(payment_gateway)
    @gateway_names.any? { |name| payment_gateway.name.downcase.strip.send(@comparator, name) }
  end
end

# ================================================================
# ShowGatewaysForThresholdCampaign
#
# If the cart total is greater than, or equal to, the entered
# threshold, the entered gateway(s) are shown.
# ================================================================
class ShowGatewaysForThresholdCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart, payment_gateways)
    @campaigns.each do |campaign|
      next unless cart.subtotal_price < (Money.new(cents: 100) * campaign[:threshold])

      gateway_name_selector = GatewayNameSelector.new(
        campaign[:gateway_match_type],
        campaign[:gateway_names],
      )

      payment_gateways.delete_if do |payment_gateway|
        gateway_name_selector.match?(payment_gateway)
      end
    end
  end
end

CAMPAIGNS = [
  ShowGatewaysForThresholdCampaign.new(SHOW_GATEWAYS_FOR_THRESHOLD),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways

Mokėjimo sietuvų pertvarkymas

Naudokite šį scenarijų, norėdami pakeisti numatytąją klientams siūlomų mokėjimo sietuvų tvarką.

# ================================ Customizable Settings ================================
# ================================================================
# Reorder Gateways
#
# The order in which you would like your gateways to display
# ================================================================
DESIRED_GATEWAY_ORDER = [
  "Payment Gateway 1", "Payment Gateway 2", "Payment Gateway 3",
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# ReorderGatewaysCampaign
#
# Reorders gateways into the entered order
# ================================================================
class ReorderGatewaysCampaign
  def initialize(desired_order)
    @desired_order = desired_order.map { |item| item.downcase.strip }
  end

  def run(cart, payment_gateways)
    payment_gateways.sort_by! { |payment_gateway| @desired_order.index(payment_gateway.name.downcase.strip) || Float::INFINITY }
  end
end

CAMPAIGNS = [
  ReorderGatewaysCampaign.new(DESIRED_GATEWAY_ORDER),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways