Payment script examples
This page was printed on Nov 09, 2022. For the current version, visit https://help.shopify.com/en/manual/checkout-settings/script-editor/examples/payment-gateway-scripts.
Payment scripts interact with payment gateways, and can change a gateway's title, visibility, and display position. These scripts run each time that your customer accesses the payment method page at checkout. Payment scripts don't interact withaccelerated checkouts , because accelerated checkouts are displayed to your customers before they reach the checkout page.
To use the templates on this page, create a new script with a blank template.
Steps:
From your Shopify admin, go toApps >Script Editor .
ClickCreate script .
ClickPayment gateways .
SelectBlank template , then clickCreate script .
In theRuby source code section, delete the default line of code:Output.cart = Input.cart
Copy a script from this page and paste it into theRuby source code section.
Edit theCustomizable Settings section of the script to function in your store.
Test your script. For more information, refer toTesting and debugging Shopify Scripts .
After testing:
clickSave draft to save an unpublished draft of the script, or
clickSave and publish to create and publish the script.
Show gateways for specific customers
使用这个脚本只显示一个特定的gateway option to specifically tagged customers.
For example, show only a particular gateway to customers with theVIP
tag - the gateway is hidden for any other customer.
# ================================ 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”是客户标签的列表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 == :包括 ? '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
Hide gateways for specific customers
Use this script to hide a specific gateway for specifically tagged customers.
For example, hide a particular gateway for customers with theHIDE_GATEWAY
tag.
# ================================ 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”是客户标签的列表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 == :包括 ? '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
Hide gateways for specific products
Use this script to hide a specific gateway when specific items are added to the cart.
For example, hide a particular gateway if the customer orders a hat.
# ================================ 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 #——“:订阅订阅连续cts # - '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 == :包括 ? '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 == :包括 ) == @selectors . include? ( line_item . variant . product . product_type . downcase . strip ) end def vendor ( line_item ) @selectors = @selectors . map { | selector | selector . downcase . strip } ( @match_type == :包括 ) == @selectors . include? ( line_item . variant . product . vendor . downcase . strip ) end def product_id ( line_item ) ( @match_type == :包括 ) == @selectors . include? ( line_item . variant . product . id ) end def variant_id ( line_item ) ( @match_type == :包括 ) == @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
Show gateways for specific countries
使用这个脚本只显示一个特定的gateway when a customer is ordering from a specific country.
For example, show only a particular gateway if a customer is ordering from Canada - the gateway is hidden for addresses in any other country.
# ================================ 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 == :包括 ) == @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
Hide gateways for specific countries
Use this script to hide payment gateways in specific countries.
For example, hide a particular gateway from customers in Canada.
# ================================ 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 == :包括 ) == @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
Show gateways by spend
Use this script to show a specific gateway if a customer spends over a certain amount.
For example, show a particular gateway if a customer spends $1000 or more, otherwise hide it.
# ================================ 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
Reorder gateways
Use this script to change the default order of the payment gateways offered to your customers.
# ================================ 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