adyen 1.4.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.travis.yml +17 -13
 - data/Gemfile +4 -0
 - data/README.rdoc +1 -1
 - data/adyen.gemspec +4 -15
 - data/lib/adyen.rb +4 -0
 - data/lib/adyen/api.rb +8 -6
 - data/lib/adyen/api/cacert.pem +369 -260
 - data/lib/adyen/api/payment_service.rb +43 -7
 - data/lib/adyen/api/simple_soap_client.rb +8 -8
 - data/lib/adyen/api/templates/payment_service.rb +51 -40
 - data/lib/adyen/api/test_helpers.rb +49 -49
 - data/lib/adyen/api/xml_querier.rb +10 -2
 - data/lib/adyen/encoding.rb +2 -2
 - data/lib/adyen/form.rb +32 -0
 - data/lib/adyen/version.rb +1 -1
 - data/spec/api/api_spec.rb +6 -6
 - data/spec/api/payment_service_spec.rb +24 -6
 - data/spec/api/recurring_service_spec.rb +2 -2
 - data/spec/api/response_spec.rb +1 -1
 - data/spec/api/simple_soap_client_spec.rb +1 -1
 - data/spec/api/spec_helper.rb +6 -2
 - data/spec/form_spec.rb +58 -7
 - data/spec/functional/api_spec.rb +36 -32
 - data/spec/functional/initializer.rb.ci +3 -0
 - data/spec/functional/initializer.rb.sample +3 -3
 - data/spec/spec_helper.rb +0 -2
 - metadata +11 -9
 
| 
         @@ -98,15 +98,16 @@ module Adyen 
     | 
|
| 
       98 
98 
     | 
    
         | 
| 
       99 
99 
     | 
    
         
             
                  def authorise_one_click_payment_request_body
         
     | 
| 
       100 
100 
     | 
    
         
             
                    validate_parameters!(:recurring_detail_reference,
         
     | 
| 
       101 
     | 
    
         
            -
                                         :shopper => [:email, :reference] 
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
                    content  
     | 
| 
      
 101 
     | 
    
         
            +
                                         :shopper => [:email, :reference])
         
     | 
| 
      
 102 
     | 
    
         
            +
                    content = one_click_card_partial
         
     | 
| 
      
 103 
     | 
    
         
            +
                    content << ONE_CLICK_PAYMENT_BODY_PARTIAL % [@params[:recurring_detail_reference]]
         
     | 
| 
       104 
104 
     | 
    
         
             
                    payment_request_body(content)
         
     | 
| 
       105 
105 
     | 
    
         
             
                  end
         
     | 
| 
       106 
106 
     | 
    
         | 
| 
       107 
107 
     | 
    
         
             
                  def payment_request_body(content)
         
     | 
| 
       108 
108 
     | 
    
         
             
                    validate_parameters!(:merchant_account, :reference, :amount => [:currency, :value])
         
     | 
| 
       109 
109 
     | 
    
         
             
                    content << amount_partial
         
     | 
| 
      
 110 
     | 
    
         
            +
                    content << installments_partial if @params[:installments]
         
     | 
| 
       110 
111 
     | 
    
         
             
                    content << shopper_partial if @params[:shopper]
         
     | 
| 
       111 
112 
     | 
    
         
             
                    content << fraud_offset_partial if @params[:fraud_offset]
         
     | 
| 
       112 
113 
     | 
    
         
             
                    LAYOUT % [@params[:merchant_account], @params[:reference], content]
         
     | 
| 
         @@ -139,8 +140,18 @@ module Adyen 
     | 
|
| 
       139 
140 
     | 
    
         
             
                    AMOUNT_PARTIAL % @params[:amount].values_at(:currency, :value)
         
     | 
| 
       140 
141 
     | 
    
         
             
                  end
         
     | 
| 
       141 
142 
     | 
    
         | 
| 
      
 143 
     | 
    
         
            +
                  def one_click_card_partial
         
     | 
| 
      
 144 
     | 
    
         
            +
                    if @params[:card] && @params[:card][:encrypted] && @params[:card][:encrypted][:json]
         
     | 
| 
      
 145 
     | 
    
         
            +
                      ENCRYPTED_CARD_PARTIAL % [@params[:card][:encrypted][:json]]
         
     | 
| 
      
 146 
     | 
    
         
            +
                    else
         
     | 
| 
      
 147 
     | 
    
         
            +
                      validate_parameters!(:card => [:cvc])
         
     | 
| 
      
 148 
     | 
    
         
            +
                      card  = @params[:card].values_at(:cvc)
         
     | 
| 
      
 149 
     | 
    
         
            +
                      ONE_CLICK_CARD_PARTIAL % card
         
     | 
| 
      
 150 
     | 
    
         
            +
                    end
         
     | 
| 
      
 151 
     | 
    
         
            +
                  end
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
       142 
153 
     | 
    
         
             
                  def card_partial
         
     | 
| 
       143 
     | 
    
         
            -
                    if @params[:card]  
     | 
| 
      
 154 
     | 
    
         
            +
                    if @params[:card] && @params[:card][:encrypted] && @params[:card][:encrypted][:json]
         
     | 
| 
       144 
155 
     | 
    
         
             
                      ENCRYPTED_CARD_PARTIAL % [@params[:card][:encrypted][:json]]
         
     | 
| 
       145 
156 
     | 
    
         
             
                    else
         
     | 
| 
       146 
157 
     | 
    
         
             
                      validate_parameters!(:card => [:holder_name, :number, :cvc, :expiry_year, :expiry_month])
         
     | 
| 
         @@ -150,15 +161,21 @@ module Adyen 
     | 
|
| 
       150 
161 
     | 
    
         
             
                    end
         
     | 
| 
       151 
162 
     | 
    
         
             
                  end
         
     | 
| 
       152 
163 
     | 
    
         | 
| 
      
 164 
     | 
    
         
            +
                  def installments_partial
         
     | 
| 
      
 165 
     | 
    
         
            +
                    if @params[:installments] && @params[:installments][:value]
         
     | 
| 
      
 166 
     | 
    
         
            +
                      INSTALLMENTS_PARTIAL % @params[:installments].values_at(:value)
         
     | 
| 
      
 167 
     | 
    
         
            +
                    end
         
     | 
| 
      
 168 
     | 
    
         
            +
                  end
         
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
       153 
170 
     | 
    
         
             
                  def shopper_partial
         
     | 
| 
       154 
171 
     | 
    
         
             
                    @params[:shopper].map { |k, v| SHOPPER_PARTIALS[k] % v }.join("\n")
         
     | 
| 
       155 
172 
     | 
    
         
             
                  end
         
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
      
 173 
     | 
    
         
            +
             
     | 
| 
       157 
174 
     | 
    
         
             
                  def fraud_offset_partial
         
     | 
| 
       158 
175 
     | 
    
         
             
                    validate_parameters!(:fraud_offset)
         
     | 
| 
       159 
176 
     | 
    
         
             
                    FRAUD_OFFSET_PARTIAL % @params[:fraud_offset]
         
     | 
| 
       160 
177 
     | 
    
         
             
                  end
         
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
       162 
179 
     | 
    
         
             
                  class AuthorisationResponse < Response
         
     | 
| 
       163 
180 
     | 
    
         
             
                    ERRORS = {
         
     | 
| 
       164 
181 
     | 
    
         
             
                      "validation 101 Invalid card number"                           => [:number,       'is not a valid creditcard number'],
         
     | 
| 
         @@ -171,7 +188,8 @@ module Adyen 
     | 
|
| 
       171 
188 
     | 
    
         
             
                    AUTHORISED = 'Authorised'
         
     | 
| 
       172 
189 
     | 
    
         
             
                    REFUSED    = 'Refused'
         
     | 
| 
       173 
190 
     | 
    
         | 
| 
       174 
     | 
    
         
            -
                    response_attrs :result_code, :auth_code, :refusal_reason, :psp_reference
         
     | 
| 
      
 191 
     | 
    
         
            +
                    response_attrs :result_code, :auth_code, :refusal_reason, :psp_reference,
         
     | 
| 
      
 192 
     | 
    
         
            +
                      :additional_data
         
     | 
| 
       175 
193 
     | 
    
         | 
| 
       176 
194 
     | 
    
         
             
                    def success?
         
     | 
| 
       177 
195 
     | 
    
         
             
                      super && params[:result_code] == AUTHORISED
         
     | 
| 
         @@ -217,10 +235,28 @@ module Adyen 
     | 
|
| 
       217 
235 
     | 
    
         
             
                          :psp_reference  => result.text('./payment:pspReference'),
         
     | 
| 
       218 
236 
     | 
    
         
             
                          :result_code    => result.text('./payment:resultCode'),
         
     | 
| 
       219 
237 
     | 
    
         
             
                          :auth_code      => result.text('./payment:authCode'),
         
     | 
| 
      
 238 
     | 
    
         
            +
                          :additional_data => parse_additional_data(result.xpath('.//payment:additionalData')),
         
     | 
| 
       220 
239 
     | 
    
         
             
                          :refusal_reason => (invalid_request? ? fault_message : result.text('./payment:refusalReason'))
         
     | 
| 
       221 
240 
     | 
    
         
             
                        }
         
     | 
| 
       222 
241 
     | 
    
         
             
                      end
         
     | 
| 
       223 
242 
     | 
    
         
             
                    end
         
     | 
| 
      
 243 
     | 
    
         
            +
             
     | 
| 
      
 244 
     | 
    
         
            +
                    private
         
     | 
| 
      
 245 
     | 
    
         
            +
                      def parse_additional_data(xpath)
         
     | 
| 
      
 246 
     | 
    
         
            +
                        if xpath.empty?
         
     | 
| 
      
 247 
     | 
    
         
            +
                          {}
         
     | 
| 
      
 248 
     | 
    
         
            +
                        else
         
     | 
| 
      
 249 
     | 
    
         
            +
                          results = {}
         
     | 
| 
      
 250 
     | 
    
         
            +
             
     | 
| 
      
 251 
     | 
    
         
            +
                          xpath.map do |node|
         
     | 
| 
      
 252 
     | 
    
         
            +
                            key = node.text('./payment:entry/payment:key')
         
     | 
| 
      
 253 
     | 
    
         
            +
                            value = node.text('./payment:entry/payment:value')
         
     | 
| 
      
 254 
     | 
    
         
            +
                            results[key] = value unless key.empty?
         
     | 
| 
      
 255 
     | 
    
         
            +
                          end
         
     | 
| 
      
 256 
     | 
    
         
            +
             
     | 
| 
      
 257 
     | 
    
         
            +
                          results
         
     | 
| 
      
 258 
     | 
    
         
            +
                        end
         
     | 
| 
      
 259 
     | 
    
         
            +
                      end
         
     | 
| 
       224 
260 
     | 
    
         
             
                  end
         
     | 
| 
       225 
261 
     | 
    
         | 
| 
       226 
262 
     | 
    
         
             
                  class ModificationResponse < Response
         
     | 
| 
         @@ -8,14 +8,14 @@ module Adyen 
     | 
|
| 
       8 
8 
     | 
    
         
             
                # The base class of the API classes that map to Adyen SOAP services.
         
     | 
| 
       9 
9 
     | 
    
         
             
                class SimpleSOAPClient
         
     | 
| 
       10 
10 
     | 
    
         
             
                  # @private
         
     | 
| 
       11 
     | 
    
         
            -
                  ENVELOPE =  
     | 
| 
       12 
     | 
    
         
            -
            <?xml version="1.0"?>
         
     | 
| 
       13 
     | 
    
         
            -
            <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
            </soap:Envelope>
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                  ENVELOPE = <<-EOXML.strip.freeze
         
     | 
| 
      
 12 
     | 
    
         
            +
                    <?xml version="1.0"?>
         
     | 
| 
      
 13 
     | 
    
         
            +
                    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         
     | 
| 
      
 14 
     | 
    
         
            +
                      <soap:Body>
         
     | 
| 
      
 15 
     | 
    
         
            +
                        %s
         
     | 
| 
      
 16 
     | 
    
         
            +
                      </soap:Body>
         
     | 
| 
      
 17 
     | 
    
         
            +
                    </soap:Envelope>
         
     | 
| 
      
 18 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  # A CA file used to verify certificates when connecting to Adyen.
         
     | 
| 
       21 
21 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -5,24 +5,24 @@ module Adyen 
     | 
|
| 
       5 
5 
     | 
    
         
             
                    private
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                    def modification_request(method, body = nil)
         
     | 
| 
       8 
     | 
    
         
            -
                       
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 8 
     | 
    
         
            +
                      <<-EOXML
         
     | 
| 
      
 9 
     | 
    
         
            +
                        <payment:#{method} xmlns:payment="http://payment.services.adyen.com" xmlns:recurring="http://recurring.services.adyen.com" xmlns:common="http://common.services.adyen.com">
         
     | 
| 
      
 10 
     | 
    
         
            +
                          <payment:modificationRequest>
         
     | 
| 
      
 11 
     | 
    
         
            +
                            <payment:merchantAccount>%s</payment:merchantAccount>
         
     | 
| 
      
 12 
     | 
    
         
            +
                            <payment:originalReference>%s</payment:originalReference>
         
     | 
| 
      
 13 
     | 
    
         
            +
                            #{body}
         
     | 
| 
      
 14 
     | 
    
         
            +
                          </payment:modificationRequest>
         
     | 
| 
      
 15 
     | 
    
         
            +
                        </payment:#{method}>
         
     | 
| 
      
 16 
     | 
    
         
            +
                      EOXML
         
     | 
| 
       17 
17 
     | 
    
         
             
                    end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                    def modification_request_with_amount(method)
         
     | 
| 
       20 
     | 
    
         
            -
                      modification_request(method,  
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
                      modification_request(method, <<-EOXML)
         
     | 
| 
      
 21 
     | 
    
         
            +
                        <payment:modificationAmount>
         
     | 
| 
      
 22 
     | 
    
         
            +
                          <common:currency>%s</common:currency>
         
     | 
| 
      
 23 
     | 
    
         
            +
                          <common:value>%s</common:value>
         
     | 
| 
      
 24 
     | 
    
         
            +
                        </payment:modificationAmount>
         
     | 
| 
      
 25 
     | 
    
         
            +
                      EOXML
         
     | 
| 
       26 
26 
     | 
    
         
             
                    end
         
     | 
| 
       27 
27 
     | 
    
         
             
                  end
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
         @@ -36,26 +36,26 @@ EOS 
     | 
|
| 
       36 
36 
     | 
    
         
             
                  CANCEL_OR_REFUND_LAYOUT = modification_request(:cancelOrRefund)
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
38 
     | 
    
         
             
                  # @private
         
     | 
| 
       39 
     | 
    
         
            -
                  LAYOUT =  
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
            %s
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
      
 39 
     | 
    
         
            +
                  LAYOUT = <<-EOXML
         
     | 
| 
      
 40 
     | 
    
         
            +
                    <payment:authorise xmlns:payment="http://payment.services.adyen.com" xmlns:recurring="http://recurring.services.adyen.com" xmlns:common="http://common.services.adyen.com">
         
     | 
| 
      
 41 
     | 
    
         
            +
                      <payment:paymentRequest>
         
     | 
| 
      
 42 
     | 
    
         
            +
                        <payment:merchantAccount>%s</payment:merchantAccount>
         
     | 
| 
      
 43 
     | 
    
         
            +
                        <payment:reference>%s</payment:reference>
         
     | 
| 
      
 44 
     | 
    
         
            +
                        %s
         
     | 
| 
      
 45 
     | 
    
         
            +
                      </payment:paymentRequest>
         
     | 
| 
      
 46 
     | 
    
         
            +
                    </payment:authorise>
         
     | 
| 
      
 47 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
                  # @private
         
     | 
| 
       50 
     | 
    
         
            -
                  AMOUNT_PARTIAL =  
     | 
| 
      
 50 
     | 
    
         
            +
                  AMOUNT_PARTIAL = <<-EOXML
         
     | 
| 
       51 
51 
     | 
    
         
             
                    <payment:amount>
         
     | 
| 
       52 
52 
     | 
    
         
             
                      <common:currency>%s</common:currency>
         
     | 
| 
       53 
53 
     | 
    
         
             
                      <common:value>%s</common:value>
         
     | 
| 
       54 
54 
     | 
    
         
             
                    </payment:amount>
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
      
 55 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
57 
     | 
    
         
             
                  # @private
         
     | 
| 
       58 
     | 
    
         
            -
                  CARD_PARTIAL =  
     | 
| 
      
 58 
     | 
    
         
            +
                  CARD_PARTIAL = <<-EOXML
         
     | 
| 
       59 
59 
     | 
    
         
             
                    <payment:card>
         
     | 
| 
       60 
60 
     | 
    
         
             
                      <payment:holderName>%s</payment:holderName>
         
     | 
| 
       61 
61 
     | 
    
         
             
                      <payment:number>%s</payment:number>
         
     | 
| 
         @@ -63,10 +63,24 @@ EOS 
     | 
|
| 
       63 
63 
     | 
    
         
             
                      <payment:expiryYear>%s</payment:expiryYear>
         
     | 
| 
       64 
64 
     | 
    
         
             
                      <payment:expiryMonth>%02d</payment:expiryMonth>
         
     | 
| 
       65 
65 
     | 
    
         
             
                    </payment:card>
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
      
 66 
     | 
    
         
            +
                  EOXML
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 69 
     | 
    
         
            +
                  ONE_CLICK_CARD_PARTIAL = <<-EOXML
         
     | 
| 
      
 70 
     | 
    
         
            +
                    <payment:card>
         
     | 
| 
      
 71 
     | 
    
         
            +
                      <payment:cvc>%s</payment:cvc>
         
     | 
| 
      
 72 
     | 
    
         
            +
                    </payment:card>
         
     | 
| 
      
 73 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       67 
74 
     | 
    
         | 
| 
       68 
75 
     | 
    
         
             
                  # @private
         
     | 
| 
       69 
     | 
    
         
            -
                   
     | 
| 
      
 76 
     | 
    
         
            +
                  INSTALLMENTS_PARTIAL = <<-EOXML
         
     | 
| 
      
 77 
     | 
    
         
            +
                    <payment:installments>
         
     | 
| 
      
 78 
     | 
    
         
            +
                      <common:value>%s</common:value>
         
     | 
| 
      
 79 
     | 
    
         
            +
                    </payment:installments>
         
     | 
| 
      
 80 
     | 
    
         
            +
                  EOXML
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 83 
     | 
    
         
            +
                  ENCRYPTED_CARD_PARTIAL = <<-EOXML
         
     | 
| 
       70 
84 
     | 
    
         
             
                    <additionalAmount xmlns="http://payment.services.adyen.com" xsi:nil="true" />
         
     | 
| 
       71 
85 
     | 
    
         
             
                    <additionalData xmlns="http://payment.services.adyen.com">
         
     | 
| 
       72 
86 
     | 
    
         
             
                      <entry>
         
     | 
| 
         @@ -74,34 +88,31 @@ EOS 
     | 
|
| 
       74 
88 
     | 
    
         
             
                        <value xsi:type="xsd:string">%s</value>
         
     | 
| 
       75 
89 
     | 
    
         
             
                      </entry>
         
     | 
| 
       76 
90 
     | 
    
         
             
                    </additionalData>
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
      
 91 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       78 
92 
     | 
    
         | 
| 
       79 
93 
     | 
    
         
             
                  # @private
         
     | 
| 
       80 
     | 
    
         
            -
                  ENABLE_RECURRING_CONTRACTS_PARTIAL =  
     | 
| 
      
 94 
     | 
    
         
            +
                  ENABLE_RECURRING_CONTRACTS_PARTIAL = <<-EOXML
         
     | 
| 
       81 
95 
     | 
    
         
             
                    <payment:recurring>
         
     | 
| 
       82 
96 
     | 
    
         
             
                      <payment:contract>RECURRING,ONECLICK</payment:contract>
         
     | 
| 
       83 
97 
     | 
    
         
             
                    </payment:recurring>
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
      
 98 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       85 
99 
     | 
    
         | 
| 
       86 
100 
     | 
    
         
             
                  # @private
         
     | 
| 
       87 
     | 
    
         
            -
                  RECURRING_PAYMENT_BODY_PARTIAL =  
     | 
| 
      
 101 
     | 
    
         
            +
                  RECURRING_PAYMENT_BODY_PARTIAL = <<-EOXML
         
     | 
| 
       88 
102 
     | 
    
         
             
                    <payment:recurring>
         
     | 
| 
       89 
103 
     | 
    
         
             
                      <payment:contract>RECURRING</payment:contract>
         
     | 
| 
       90 
104 
     | 
    
         
             
                    </payment:recurring>
         
     | 
| 
       91 
105 
     | 
    
         
             
                    <payment:selectedRecurringDetailReference>%s</payment:selectedRecurringDetailReference>
         
     | 
| 
       92 
106 
     | 
    
         
             
                    <payment:shopperInteraction>ContAuth</payment:shopperInteraction>
         
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
      
 107 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       94 
108 
     | 
    
         | 
| 
       95 
109 
     | 
    
         
             
                  # @private
         
     | 
| 
       96 
     | 
    
         
            -
                  ONE_CLICK_PAYMENT_BODY_PARTIAL =  
     | 
| 
      
 110 
     | 
    
         
            +
                  ONE_CLICK_PAYMENT_BODY_PARTIAL = <<-EOXML
         
     | 
| 
       97 
111 
     | 
    
         
             
                    <payment:recurring>
         
     | 
| 
       98 
112 
     | 
    
         
             
                      <payment:contract>ONECLICK</payment:contract>
         
     | 
| 
       99 
113 
     | 
    
         
             
                    </payment:recurring>
         
     | 
| 
       100 
114 
     | 
    
         
             
                    <payment:selectedRecurringDetailReference>%s</payment:selectedRecurringDetailReference>
         
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
                      <payment:cvc>%s</payment:cvc>
         
     | 
| 
       103 
     | 
    
         
            -
                    </payment:card>
         
     | 
| 
       104 
     | 
    
         
            -
            EOS
         
     | 
| 
      
 115 
     | 
    
         
            +
                  EOXML
         
     | 
| 
       105 
116 
     | 
    
         | 
| 
       106 
117 
     | 
    
         
             
                  # @private
         
     | 
| 
       107 
118 
     | 
    
         
             
                  SHOPPER_PARTIALS = {
         
     | 
| 
         @@ -110,7 +121,7 @@ EOS 
     | 
|
| 
       110 
121 
     | 
    
         
             
                    :ip        => '        <payment:shopperIP>%s</payment:shopperIP>',
         
     | 
| 
       111 
122 
     | 
    
         
             
                    :statement => '        <payment:shopperStatement>%s</payment:shopperStatement>',
         
     | 
| 
       112 
123 
     | 
    
         
             
                  }
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
       114 
125 
     | 
    
         
             
                  # @private
         
     | 
| 
       115 
126 
     | 
    
         
             
                  FRAUD_OFFSET_PARTIAL = '<payment:fraudOffset>%s</payment:fraudOffset>'
         
     | 
| 
       116 
127 
     | 
    
         
             
                end
         
     | 
| 
         @@ -8,48 +8,48 @@ module Adyen 
     | 
|
| 
       8 
8 
     | 
    
         
             
                  #
         
     | 
| 
       9 
9 
     | 
    
         
             
                  # This module extends the {PaymentService} class and thus these methods are callable on it.
         
     | 
| 
       10 
10 
     | 
    
         
             
                  module TestHelpers
         
     | 
| 
       11 
     | 
    
         
            -
                    AUTHORISE_RESPONSE = SimpleSOAPClient::ENVELOPE %  
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                    AUTHORISE_RESPONSE = SimpleSOAPClient::ENVELOPE % <<-EOXML
         
     | 
| 
      
 12 
     | 
    
         
            +
                      <ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com">
         
     | 
| 
      
 13 
     | 
    
         
            +
                        <ns1:paymentResult>
         
     | 
| 
      
 14 
     | 
    
         
            +
                          <additionalData xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 15 
     | 
    
         
            +
                          <authCode xmlns="http://payment.services.adyen.com">1234</authCode>
         
     | 
| 
      
 16 
     | 
    
         
            +
                          <dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 17 
     | 
    
         
            +
                          <dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 18 
     | 
    
         
            +
                          <fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 19 
     | 
    
         
            +
                          <issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 20 
     | 
    
         
            +
                          <md xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 21 
     | 
    
         
            +
                          <paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 22 
     | 
    
         
            +
                          <pspReference xmlns="http://payment.services.adyen.com">9876543210987654</pspReference>
         
     | 
| 
      
 23 
     | 
    
         
            +
                          <refusalReason xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 24 
     | 
    
         
            +
                          <resultCode xmlns="http://payment.services.adyen.com">Authorised</resultCode>
         
     | 
| 
      
 25 
     | 
    
         
            +
                        </ns1:paymentResult>
         
     | 
| 
      
 26 
     | 
    
         
            +
                      </ns1:authoriseResponse>
         
     | 
| 
      
 27 
     | 
    
         
            +
                    EOXML
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
                    AUTHORISATION_REFUSED_RESPONSE = SimpleSOAPClient::ENVELOPE %  
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 29 
     | 
    
         
            +
                    AUTHORISATION_REFUSED_RESPONSE = SimpleSOAPClient::ENVELOPE % <<-EOXML
         
     | 
| 
      
 30 
     | 
    
         
            +
                      <ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com">
         
     | 
| 
      
 31 
     | 
    
         
            +
                        <ns1:paymentResult>
         
     | 
| 
      
 32 
     | 
    
         
            +
                          <additionalData xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 33 
     | 
    
         
            +
                          <authCode xmlns="http://payment.services.adyen.com">1234</authCode>
         
     | 
| 
      
 34 
     | 
    
         
            +
                          <dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 35 
     | 
    
         
            +
                          <dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 36 
     | 
    
         
            +
                          <fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 37 
     | 
    
         
            +
                          <issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 38 
     | 
    
         
            +
                          <md xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 39 
     | 
    
         
            +
                          <paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
         
     | 
| 
      
 40 
     | 
    
         
            +
                          <pspReference xmlns="http://payment.services.adyen.com">9876543210987654</pspReference>
         
     | 
| 
      
 41 
     | 
    
         
            +
                          <refusalReason xmlns="http://payment.services.adyen.com">You need to actually own money.</refusalReason>
         
     | 
| 
      
 42 
     | 
    
         
            +
                          <resultCode xmlns="http://payment.services.adyen.com">Refused</resultCode>
         
     | 
| 
      
 43 
     | 
    
         
            +
                        </ns1:paymentResult>
         
     | 
| 
      
 44 
     | 
    
         
            +
                      </ns1:authoriseResponse>
         
     | 
| 
      
 45 
     | 
    
         
            +
                    EOXML
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
                    AUTHORISATION_REQUEST_INVALID_RESPONSE = SimpleSOAPClient::ENVELOPE %  
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 47 
     | 
    
         
            +
                    AUTHORISATION_REQUEST_INVALID_RESPONSE = SimpleSOAPClient::ENVELOPE % <<-EOXML
         
     | 
| 
      
 48 
     | 
    
         
            +
                      <soap:Fault>
         
     | 
| 
      
 49 
     | 
    
         
            +
                        <faultcode>soap:Server</faultcode>
         
     | 
| 
      
 50 
     | 
    
         
            +
                        <faultstring>validation 101 Invalid card number</faultstring>
         
     | 
| 
      
 51 
     | 
    
         
            +
                      </soap:Fault>
         
     | 
| 
      
 52 
     | 
    
         
            +
                    EOXML
         
     | 
| 
       53 
53 
     | 
    
         | 
| 
       54 
54 
     | 
    
         
             
                    # @return [AuthorisationResponse] A authorisation succeeded response instance.
         
     | 
| 
       55 
55 
     | 
    
         
             
                    def success_stub
         
     | 
| 
         @@ -104,15 +104,15 @@ EOS 
     | 
|
| 
       104 
104 
     | 
    
         
             
                  #
         
     | 
| 
       105 
105 
     | 
    
         
             
                  # This module extends the {RecurringService} class and thus these methods are callable on it.
         
     | 
| 
       106 
106 
     | 
    
         
             
                  module TestHelpers
         
     | 
| 
       107 
     | 
    
         
            -
                    DISABLE_RESPONSE = SimpleSOAPClient::ENVELOPE %  
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
      
 107 
     | 
    
         
            +
                    DISABLE_RESPONSE = SimpleSOAPClient::ENVELOPE % <<-EOXML
         
     | 
| 
      
 108 
     | 
    
         
            +
                      <ns1:disableResponse xmlns:ns1="http://recurring.services.adyen.com">
         
     | 
| 
      
 109 
     | 
    
         
            +
                        <ns1:result>
         
     | 
| 
      
 110 
     | 
    
         
            +
                          <response xmlns="http://recurring.services.adyen.com">
         
     | 
| 
      
 111 
     | 
    
         
            +
                            %s
         
     | 
| 
      
 112 
     | 
    
         
            +
                          </response>
         
     | 
| 
      
 113 
     | 
    
         
            +
                        </ns1:result>
         
     | 
| 
      
 114 
     | 
    
         
            +
                      </ns1:disableResponse>
         
     | 
| 
      
 115 
     | 
    
         
            +
                    EOXML
         
     | 
| 
       116 
116 
     | 
    
         | 
| 
       117 
117 
     | 
    
         
             
                    # @return [DisableResponse] A ‘disable succeeded’ response instance.
         
     | 
| 
       118 
118 
     | 
    
         
             
                    def disabled_stub
         
     | 
| 
         @@ -31,6 +31,10 @@ module Adyen 
     | 
|
| 
       31 
31 
     | 
    
         
             
                    def perform_xpath(query, root_node)
         
     | 
| 
       32 
32 
     | 
    
         
             
                      root_node.xpath(query, NS)
         
     | 
| 
       33 
33 
     | 
    
         
             
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    def stringify_nodeset(nodeset)
         
     | 
| 
      
 36 
     | 
    
         
            +
                      nodeset.to_xml(encoding: 'UTF-8')
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
       34 
38 
     | 
    
         
             
                  end
         
     | 
| 
       35 
39 
     | 
    
         | 
| 
       36 
40 
     | 
    
         
             
                  class REXMLBackend
         
     | 
| 
         @@ -48,7 +52,11 @@ module Adyen 
     | 
|
| 
       48 
52 
     | 
    
         | 
| 
       49 
53 
     | 
    
         
             
                    def perform_xpath(query, root_node)
         
     | 
| 
       50 
54 
     | 
    
         
             
                      REXML::XPath.match(root_node, query, NS)
         
     | 
| 
       51 
     | 
    
         
            -
                    end 
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                    def stringify_nodeset(nodeset)
         
     | 
| 
      
 58 
     | 
    
         
            +
                      nodeset.map { |n| n.to_s }.join("")
         
     | 
| 
      
 59 
     | 
    
         
            +
                    end
         
     | 
| 
       52 
60 
     | 
    
         
             
                  end
         
     | 
| 
       53 
61 
     | 
    
         | 
| 
       54 
62 
     | 
    
         
             
                  # @return A backend to handle XML parsing.
         
     | 
| 
         @@ -116,7 +124,7 @@ module Adyen 
     | 
|
| 
       116 
124 
     | 
    
         | 
| 
       117 
125 
     | 
    
         
             
                  # @return [String] A string representation of this node.
         
     | 
| 
       118 
126 
     | 
    
         
             
                  def to_s
         
     | 
| 
       119 
     | 
    
         
            -
                     
     | 
| 
      
 127 
     | 
    
         
            +
                    backend.stringify_nodeset(@node)
         
     | 
| 
       120 
128 
     | 
    
         
             
                  end
         
     | 
| 
       121 
129 
     | 
    
         | 
| 
       122 
130 
     | 
    
         
             
                  # @yield [XMLQuerier] A member of this node set, ready to be queried.
         
     | 
    
        data/lib/adyen/encoding.rb
    CHANGED
    
    | 
         @@ -7,7 +7,7 @@ module Adyen 
     | 
|
| 
       7 
7 
     | 
    
         
             
              module Encoding
         
     | 
| 
       8 
8 
     | 
    
         
             
                def self.hmac_base64(hmac_key, message)
         
     | 
| 
       9 
9 
     | 
    
         
             
                  digest = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), hmac_key, message)
         
     | 
| 
       10 
     | 
    
         
            -
                  Base64. 
     | 
| 
      
 10 
     | 
    
         
            +
                  Base64.strict_encode64(digest).strip
         
     | 
| 
       11 
11 
     | 
    
         
             
                end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
                def self.gzip_base64(message)
         
     | 
| 
         @@ -15,7 +15,7 @@ module Adyen 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  gz  = Zlib::GzipWriter.new(sio)
         
     | 
| 
       16 
16 
     | 
    
         
             
                  gz.write(message)
         
     | 
| 
       17 
17 
     | 
    
         
             
                  gz.close
         
     | 
| 
       18 
     | 
    
         
            -
                  Base64. 
     | 
| 
      
 18 
     | 
    
         
            +
                  Base64.strict_encode64(sio.string)
         
     | 
| 
       19 
19 
     | 
    
         
             
                end
         
     | 
| 
       20 
20 
     | 
    
         
             
              end
         
     | 
| 
       21 
21 
     | 
    
         
             
            end
         
     | 
    
        data/lib/adyen/form.rb
    CHANGED
    
    | 
         @@ -119,6 +119,10 @@ module Adyen 
     | 
|
| 
       119 
119 
     | 
    
         
             
                    parameters[:billing_address_sig] = calculate_billing_address_signature(parameters, shared_secret)
         
     | 
| 
       120 
120 
     | 
    
         
             
                  end
         
     | 
| 
       121 
121 
     | 
    
         | 
| 
      
 122 
     | 
    
         
            +
                  if parameters[:shopper]
         
     | 
| 
      
 123 
     | 
    
         
            +
                    parameters[:shopper_sig] = calculate_shopper_signature(parameters, shared_secret)
         
     | 
| 
      
 124 
     | 
    
         
            +
                  end
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
       122 
126 
     | 
    
         
             
                  return parameters
         
     | 
| 
       123 
127 
     | 
    
         
             
                end
         
     | 
| 
       124 
128 
     | 
    
         | 
| 
         @@ -165,6 +169,20 @@ module Adyen 
     | 
|
| 
       165 
169 
     | 
    
         
             
                  }.join('&')
         
     | 
| 
       166 
170 
     | 
    
         
             
                end
         
     | 
| 
       167 
171 
     | 
    
         | 
| 
      
 172 
     | 
    
         
            +
                # @see Adyen::Form.redirect_url
         
     | 
| 
      
 173 
     | 
    
         
            +
                #
         
     | 
| 
      
 174 
     | 
    
         
            +
                # Returns an absolute URL very similar to the one returned by Adyen::Form.redirect_url
         
     | 
| 
      
 175 
     | 
    
         
            +
                # except that it uses the directory.shtml call which returns a list of all available
         
     | 
| 
      
 176 
     | 
    
         
            +
                # payment methods
         
     | 
| 
      
 177 
     | 
    
         
            +
                #
         
     | 
| 
      
 178 
     | 
    
         
            +
                # @param [Hash] parameters The payment parameters to include in the payment request.
         
     | 
| 
      
 179 
     | 
    
         
            +
                # @return [String] An absolute URL to redirect to the Adyen payment system.
         
     | 
| 
      
 180 
     | 
    
         
            +
                def payment_methods_url(parameters = {})
         
     | 
| 
      
 181 
     | 
    
         
            +
                  url(nil, :directory) + '?' + flat_payment_parameters(parameters).map { |(k, v)|
         
     | 
| 
      
 182 
     | 
    
         
            +
                    "#{k}=#{CGI.escape(v)}"
         
     | 
| 
      
 183 
     | 
    
         
            +
                  }.join('&')
         
     | 
| 
      
 184 
     | 
    
         
            +
                end
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
       168 
186 
     | 
    
         
             
                # Returns a HTML snippet of hidden INPUT tags with the provided payment parameters.
         
     | 
| 
       169 
187 
     | 
    
         
             
                # The snippet can be included in a payment form that POSTs to the Adyen payment system.
         
     | 
| 
       170 
188 
     | 
    
         
             
                #
         
     | 
| 
         @@ -266,6 +284,20 @@ module Adyen 
     | 
|
| 
       266 
284 
     | 
    
         
             
                  Adyen::Encoding.hmac_base64(shared_secret, calculate_billing_address_signature_string(parameters[:billing_address]))
         
     | 
| 
       267 
285 
     | 
    
         
             
                end
         
     | 
| 
       268 
286 
     | 
    
         | 
| 
      
 287 
     | 
    
         
            +
                # shopperSig: shopper.firstName + shopper.infix + shopper.lastName + shopper.gender + shopper.dateOfBirthDayOfMonth + shopper.dateOfBirthMonth + shopper.dateOfBirthYear + shopper.telephoneNumber
         
     | 
| 
      
 288 
     | 
    
         
            +
                # (Note that you can send only shopper.firstName and shopper.lastName if you like. Do NOT include shopperSocialSecurityNumber in the shopperSig!)
         
     | 
| 
      
 289 
     | 
    
         
            +
                def calculate_shopper_signature_string(parameters)
         
     | 
| 
      
 290 
     | 
    
         
            +
                  %w(first_name infix last_name gender date_of_birth_day_of_month date_of_birth_month date_of_birth_year telephone_number).map do |key|
         
     | 
| 
      
 291 
     | 
    
         
            +
                    parameters[key.to_sym]
         
     | 
| 
      
 292 
     | 
    
         
            +
                  end.join
         
     | 
| 
      
 293 
     | 
    
         
            +
                end
         
     | 
| 
      
 294 
     | 
    
         
            +
             
     | 
| 
      
 295 
     | 
    
         
            +
                def calculate_shopper_signature(parameters, shared_secret = nil)
         
     | 
| 
      
 296 
     | 
    
         
            +
                  shared_secret ||= parameters.delete(:shared_secret)
         
     | 
| 
      
 297 
     | 
    
         
            +
                  raise ArgumentError, "Cannot calculate shopper request signature with empty shared_secret" if shared_secret.to_s.empty?
         
     | 
| 
      
 298 
     | 
    
         
            +
                  Adyen::Encoding.hmac_base64(shared_secret, calculate_shopper_signature_string(parameters[:shopper]))
         
     | 
| 
      
 299 
     | 
    
         
            +
                end
         
     | 
| 
      
 300 
     | 
    
         
            +
             
     | 
| 
       269 
301 
     | 
    
         
             
                ######################################################
         
     | 
| 
       270 
302 
     | 
    
         
             
                # REDIRECT SIGNATURE CHECKING
         
     | 
| 
       271 
303 
     | 
    
         
             
                ######################################################
         
     |