Question

Background

Question

How do I make a test payment fail? (e.g. card is declined, or card expired in future subscription payments)

Stripe would let me do this using special card numbers but there doesn't appear to be any such documentation (in English) for Paymill.


payment_provider.rb

class PaymentProvider
  Paymill.api_key = ENV['PAYMILL_PRIVATE_KEY']

  def self.start_new_subscription(email, description, token)
    offer = Paymill::Offer.find(ENV['PAYMILL_OFFER_ID'])
    client = Paymill::Client.create(email: email, description: description)
    payment = Paymill::Payment.create(token: token, client: client.id)
    subscription = Paymill::Subscription.create(client: client.id, offer: offer.id, payment: payment.id)
    subscription.id
  end
end


payment_provider_spec.rb

require 'spec_helper'

describe PaymentProvider do

  describe "#start_new_subscription" do
    it "returns a subscription id, starting 'sub_' when successful" do
      email = "mike@mike.com"
      description = "me"
      token = get_payment_token
      subscription_id = PaymentProvider.start_new_subscription(email, description, token)
      expect(subscription_id[0,4]).to eq('sub_')
    end
  end

  def get_payment_token
    # Simulate the JavaScript bridge we would use in production
    params = {
      'transaction.mode'        => 'CONNECTOR_TEST',
      'channel.id'              => ENV['PAYMILL_PUBLIC_KEY'],
      'jsonPFunction'           => 'any_string',
      'account.number'          => '5500000000000004',
      'account.expiry.month'    => 3.years.from_now.month,
      'account.expiry.year'     => 3.years.from_now.year,
      'account.verification'    => '111'
      #'presentation.amount3D'   => BigDecimal('10.00'),
      #'presentation.currency3D' => 'GBP'
    }
    http = Net::HTTP.new('test-token.paymill.de', 443)
    http.use_ssl = true
    response = http.get url_query_string(params)
    response.body.scan(/tok_\w*\b/).first # Use a regex to pull the token from the (not-quite-JSON) response
  end

  def url_query_string(hash)
    "/?" << URI.escape(hash.collect{|k,v| "#{k}=#{v}"}.join('&'))
  end

end
Was it helpful?

Solution

As of today, there are no special credit card numbers to simulate those problems. However, due to demands from the community, this is currently in the backlog for being implemented. I'd suggest to send an email to the support, to show interest on this feature. The more requests, the faster the feature will be implemented.

EDIT: PAYMILL now offers a special MasterCard number, which will fail if a certain combination of expiration month and year is used. For instance, the card 5105105105105100 will fail due to RESPONSE_BACKEND_BLACKLISTED if the expiration date is sent as 02/2020.

OTHER TIPS

What you could do is use a string rather than a number for the verification value.

'account.verification'    => 'abc'

This will as of my knowledge result in a failed payment even when using the CONNECTOR_TEST mode.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top