pagarme 2.1.0 → 2.1.1
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/README.md +49 -0
- data/lib/pagarme.rb +4 -2
- data/lib/pagarme/resources/postback.rb +23 -6
- data/lib/pagarme/version.rb +1 -1
- data/test/fixtures.rb +2 -7
- data/test/pagarme/resources/payable_test.rb +1 -1
- data/test/pagarme/resources/postback_test.rb +10 -4
- metadata +2 -4
- data/test/pagarme/pagarme_test.rb +0 -10
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 19db5c088393486c4bc44af6ee169fb3a50a37f5
         | 
| 4 | 
            +
              data.tar.gz: 33157926082f202f8affcc8dc8093831d1acb37e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 438ca7c4e957ac3561b4663b899fbbccbd7d3c6bbaa4dbaff918307a6cac1ce2fd08025e8476936306c5bd7073a3ab3de0099fa3ea5e0fd5e10426292a20e261
         | 
| 7 | 
            +
              data.tar.gz: 4b61661fd23f341dcd0194019693021aba613b1ab62934565ee136cb7078180befb4df5734f25680d85b897011cda19edaded58916e73dd3ef984eb27287d60c
         | 
    
        data/README.md
    CHANGED
    
    | @@ -269,6 +269,55 @@ More about [Querying Payables](https://docs.pagar.me/api/#retornando-recebiveis) | |
| 269 269 |  | 
| 270 270 | 
             
            More about [Payable Transactions](https://docs.pagar.me/api/#retornando-pagamentos-da-transacao)
         | 
| 271 271 |  | 
| 272 | 
            +
            ### Validating Postback
         | 
| 273 | 
            +
             | 
| 274 | 
            +
            You need to ensure that all received postback are sent by Pagar.me and not from anyone else,
         | 
| 275 | 
            +
            to do this, is very important to validate it.
         | 
| 276 | 
            +
             | 
| 277 | 
            +
            You must do it using the raw payload received on post request, and check it signature provided
         | 
| 278 | 
            +
            in HTTP header X-Hub-Signature.
         | 
| 279 | 
            +
             | 
| 280 | 
            +
            You can check it like this:
         | 
| 281 | 
            +
             | 
| 282 | 
            +
            ```ruby
         | 
| 283 | 
            +
              PagarMe::Postback.valid_request_signature?(payload, signature)
         | 
| 284 | 
            +
            ```
         | 
| 285 | 
            +
             | 
| 286 | 
            +
            #### Rails Example
         | 
| 287 | 
            +
             | 
| 288 | 
            +
            If you are using Rails, you should do it your controller like this:
         | 
| 289 | 
            +
             | 
| 290 | 
            +
            ```ruby
         | 
| 291 | 
            +
             | 
| 292 | 
            +
                class PostbackController < ApplicationController
         | 
| 293 | 
            +
                  skip_before_action :verify_authenticity_token
         | 
| 294 | 
            +
                  
         | 
| 295 | 
            +
                  def postback
         | 
| 296 | 
            +
                    if valid_postback?
         | 
| 297 | 
            +
                      # Handle your code here
         | 
| 298 | 
            +
                      # postback payload is in params
         | 
| 299 | 
            +
                    else
         | 
| 300 | 
            +
                      render_invalid_postback_response
         | 
| 301 | 
            +
                    end
         | 
| 302 | 
            +
                  end
         | 
| 303 | 
            +
                  
         | 
| 304 | 
            +
                  protected
         | 
| 305 | 
            +
                  def valid_postback?
         | 
| 306 | 
            +
                    raw_post  = request.raw_post
         | 
| 307 | 
            +
                    signature = request.headers['HTTP_X_HUB_SIGNATURE']
         | 
| 308 | 
            +
                    PagarMe::Postback.valid_request_signature?(raw_post, signature)
         | 
| 309 | 
            +
                  end
         | 
| 310 | 
            +
                  
         | 
| 311 | 
            +
                  def render_invalid_postback_response
         | 
| 312 | 
            +
                    render json: {error: 'invalid postback'}, status: 400
         | 
| 313 | 
            +
                  end
         | 
| 314 | 
            +
                end
         | 
| 315 | 
            +
             | 
| 316 | 
            +
             | 
| 317 | 
            +
            ```
         | 
| 318 | 
            +
             | 
| 319 | 
            +
            request.raw_post
         | 
| 320 | 
            +
             | 
| 272 321 | 
             
            ### Undocumented Features
         | 
| 273 322 |  | 
| 274 323 | 
             
            This gem is stable, but in constant development.
         | 
    
        data/lib/pagarme.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            require 'set'
         | 
| 2 2 | 
             
            require 'time'
         | 
| 3 3 | 
             
            require 'digest/sha1'
         | 
| 4 | 
            +
            require 'openssl'
         | 
| 4 5 |  | 
| 5 6 | 
             
            require_relative 'pagarme/version'
         | 
| 6 7 | 
             
            require_relative 'pagarme/core_ext'
         | 
| @@ -25,7 +26,8 @@ module PagarMe | |
| 25 26 | 
             
              self.timeout      = 90
         | 
| 26 27 | 
             
              self.api_key      = ENV['PAGARME_API_KEY']
         | 
| 27 28 |  | 
| 28 | 
            -
               | 
| 29 | 
            -
             | 
| 29 | 
            +
              # TODO: Remove deprecated PagarMe.validate_fingerprint
         | 
| 30 | 
            +
              def self.validate_fingerprint(*args)
         | 
| 31 | 
            +
                raise '[Deprecation Error] PagarMe.validate_fingerprint is deprecated, use PagarMe::Postback.valid_request_signature? instead'
         | 
| 30 32 | 
             
              end
         | 
| 31 33 | 
             
            end
         | 
| @@ -1,15 +1,32 @@ | |
| 1 1 | 
             
            module PagarMe
         | 
| 2 2 | 
             
              class Postback < PagarMeObject
         | 
| 3 3 | 
             
                def valid?
         | 
| 4 | 
            -
                  self.class. | 
| 4 | 
            +
                  signature == self.class.signature(payload)
         | 
| 5 5 | 
             
                end
         | 
| 6 6 |  | 
| 7 | 
            -
                 | 
| 8 | 
            -
                   | 
| 9 | 
            -
             | 
| 7 | 
            +
                class << self
         | 
| 8 | 
            +
                  def valid_request_signature?(payload, signature)
         | 
| 9 | 
            +
                    kind, raw_signature = signature.split '=', 2
         | 
| 10 | 
            +
                    return false if kind.blank? || raw_signature.blank?
         | 
| 11 | 
            +
                    signature(payload, kind) == raw_signature
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                  alias :validate_request_signature :valid_request_signature?
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def signature(payload, hash_method = 'sha1')
         | 
| 16 | 
            +
                    OpenSSL::HMAC.hexdigest hash_method, PagarMe.api_key, payload
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  # TODO: Remove deprecated Postback.validate
         | 
| 20 | 
            +
                  def validate(id, fingerprint)
         | 
| 21 | 
            +
                    $stderr.puts '[DEPRECATION WARNING] PagarMe.validate method is deprecated, use PagarMe.validate_request_signature instead'
         | 
| 22 | 
            +
                    valid_request_signature? id, fingerprint
         | 
| 23 | 
            +
                  end
         | 
| 10 24 |  | 
| 11 | 
            -
             | 
| 12 | 
            -
                   | 
| 25 | 
            +
                  # TODO: Remove deprecated Postback.fingerprint_for
         | 
| 26 | 
            +
                  def fingerprint_for(id)
         | 
| 27 | 
            +
                    $stderr.puts '[DEPRECATION WARNING] PagarMe.fingerprint_for method is deprecated, use PagarMe.signature instead'
         | 
| 28 | 
            +
                    signature id
         | 
| 29 | 
            +
                  end
         | 
| 13 30 | 
             
                end
         | 
| 14 31 | 
             
              end
         | 
| 15 32 | 
             
            end
         | 
    
        data/lib/pagarme/version.rb
    CHANGED
    
    
    
        data/test/fixtures.rb
    CHANGED
    
    | @@ -121,13 +121,8 @@ class Fixtures | |
| 121 121 |  | 
| 122 122 | 
             
              def postback_response
         | 
| 123 123 | 
             
                {
         | 
| 124 | 
            -
                  id: | 
| 125 | 
            -
                   | 
| 126 | 
            -
                  fingerprint:    'f8eb5ce941d70473ea691959ea4bfdeb79d48e2c',
         | 
| 127 | 
            -
                  desired_status: 'paid',
         | 
| 128 | 
            -
                  current_status: 'paid',
         | 
| 129 | 
            -
                  object:         'transaction',
         | 
| 130 | 
            -
                  old_status:     'processing'
         | 
| 124 | 
            +
                  payload:   "id=406483&fingerprint=9e9496ef28d1154b2db9a446323db90103069330&event=transaction_status_changed&old_status=processing&desired_status=paid¤t_status=paid&object=transaction&transaction[object]=transaction&transaction[status]=paid&transaction[refuse_reason]=null&transaction[status_reason]=acquirer&transaction[acquirer_response_code]=0&transaction[acquirer_name]=pagarme&transaction[authorization_code]=18051&transaction[soft_descriptor]=null&transaction[tid]=406483&transaction[nsu]=406483&transaction[date_created]=2016-03-03T19:13:31.000Z&transaction[date_updated]=2016-03-03T19:13:32.000Z&transaction[amount]=1000&transaction[authorized_amount]=1000&transaction[paid_amount]=1000&transaction[refunded_amount]=0&transaction[installments]=1&transaction[id]=406483&transaction[cost]=50&transaction[card_holder_name]=Jose da Silva&transaction[card_last_digits]=4448&transaction[card_first_digits]=490172&transaction[card_brand]=visa&transaction[postback_url]=http://example.com/postback/1&transaction[payment_method]=credit_card&transaction[capture_method]=ecommerce&transaction[antifraud_score]=null&transaction[boleto_url]=null&transaction[boleto_barcode]=null&transaction[boleto_expiration_date]=null&transaction[referer]=api_key&transaction[ip]=179.185.132.108&transaction[subscription_id]=null&transaction[phone][object]=phone&transaction[phone][ddi]=55&transaction[phone][ddd]=21&transaction[phone][number]=922334455&transaction[phone][id]=21123&transaction[address][object]=address&transaction[address][street]=Av. Brigadeiro Faria Lima&transaction[address][complementary]=null&transaction[address][street_number]=2941&transaction[address][neighborhood]=Itaim bibi&transaction[address][city]=São Paulo&transaction[address][state]=SP&transaction[address][zipcode]=1452000&transaction[address][country]=Brasil&transaction[address][id]=21810&transaction[customer][object]=customer&transaction[customer][document_number]=84931126235&transaction[customer][document_type]=cpf&transaction[customer][name]=Jose da Silva&transaction[customer][email]=pagarmetestruby@mailinator.com&transaction[customer][born_at]=1970-10-11T00:00:00.000Z&transaction[customer][gender]=M&transaction[customer][date_created]=2016-03-01T18:38:25.000Z&transaction[customer][id]=43304&transaction[card][object]=card&transaction[card][id]=card_cil9rcdql00gmbp6er9i5q48u&transaction[card][date_created]=2016-03-01T18:38:25.000Z&transaction[card][date_updated]=2016-03-01T18:38:29.000Z&transaction[card][brand]=visa&transaction[card][holder_name]=Jose da Silva&transaction[card][first_digits]=490172&transaction[card][last_digits]=4448&transaction[card][country]=BR&transaction[card][fingerprint]=F0Y0+wH0d8DS&transaction[card][customer]=undefined&transaction[card][valid]=true",
         | 
| 125 | 
            +
                  signature: '57925d5954efd85613bbffa121dc06b4e7737256'
         | 
| 131 126 | 
             
                }
         | 
| 132 127 | 
             
              end
         | 
| 133 128 |  | 
| @@ -18,7 +18,7 @@ module PagarMe | |
| 18 18 | 
             
                  assert_equal transaction.payables.map(&:recipient_id).sort, fixtures.persistent_recipient_ids.sort
         | 
| 19 19 | 
             
                end
         | 
| 20 20 |  | 
| 21 | 
            -
                should ' | 
| 21 | 
            +
                should 'be found' do
         | 
| 22 22 | 
             
                  payables = PagarMe::Payable.find_by type: 'refund'
         | 
| 23 23 |  | 
| 24 24 | 
             
                  assert payables.count > 0
         | 
| @@ -2,17 +2,23 @@ require_relative '../../test_helper' | |
| 2 2 |  | 
| 3 3 | 
             
            module PagarMe
         | 
| 4 4 | 
             
              class TransactionTest < Test::Unit::TestCase
         | 
| 5 | 
            -
                should 'be valid when has valid  | 
| 5 | 
            +
                should 'be valid when has valid signature' do
         | 
| 6 6 | 
             
                  fixed_api_key do
         | 
| 7 7 | 
             
                    postback = PagarMe::Postback.new postback_response_params
         | 
| 8 8 | 
             
                    assert postback.valid?
         | 
| 9 9 | 
             
                  end
         | 
| 10 10 | 
             
                end
         | 
| 11 11 |  | 
| 12 | 
            -
                should 'be valid when has invalid  | 
| 13 | 
            -
                   | 
| 14 | 
            -
                  postback = PagarMe::Postback.new postback_response_params(fingerprint: invalid_fingerprint)
         | 
| 12 | 
            +
                should 'be valid when has invalid signature' do
         | 
| 13 | 
            +
                  postback = PagarMe::Postback.new postback_response_params(signature: 'invalid signature')
         | 
| 15 14 | 
             
                  assert !postback.valid?
         | 
| 16 15 | 
             
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                should 'validate signature' do
         | 
| 18 | 
            +
                  params = postback_response_params
         | 
| 19 | 
            +
                  assert  PagarMe::Postback.valid_request_signature?(params[:payload], "sha1=#{params[:signature]}")
         | 
| 20 | 
            +
                  assert !PagarMe::Postback.valid_request_signature?(params[:payload], params[:signature])
         | 
| 21 | 
            +
                  assert !PagarMe::Postback.valid_request_signature?(params[:payload], 'invalid signature')
         | 
| 22 | 
            +
                end
         | 
| 17 23 | 
             
              end
         | 
| 18 24 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: pagarme
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.1. | 
| 4 | 
            +
              version: 2.1.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Pedro Franceschi
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2016-03- | 
| 12 | 
            +
            date: 2016-03-18 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: bundler
         | 
| @@ -185,7 +185,6 @@ files: | |
| 185 185 | 
             
            - test/fixtures.rb
         | 
| 186 186 | 
             
            - test/pagarme/error_test.rb
         | 
| 187 187 | 
             
            - test/pagarme/object_test.rb
         | 
| 188 | 
            -
            - test/pagarme/pagarme_test.rb
         | 
| 189 188 | 
             
            - test/pagarme/resources/balance_test.rb
         | 
| 190 189 | 
             
            - test/pagarme/resources/bank_account_test.rb
         | 
| 191 190 | 
             
            - test/pagarme/resources/bulk_anticipation_test.rb
         | 
| @@ -227,7 +226,6 @@ test_files: | |
| 227 226 | 
             
            - test/fixtures.rb
         | 
| 228 227 | 
             
            - test/pagarme/error_test.rb
         | 
| 229 228 | 
             
            - test/pagarme/object_test.rb
         | 
| 230 | 
            -
            - test/pagarme/pagarme_test.rb
         | 
| 231 229 | 
             
            - test/pagarme/resources/balance_test.rb
         | 
| 232 230 | 
             
            - test/pagarme/resources/bank_account_test.rb
         | 
| 233 231 | 
             
            - test/pagarme/resources/bulk_anticipation_test.rb
         | 
| @@ -1,10 +0,0 @@ | |
| 1 | 
            -
            require_relative '../test_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module PagarMe
         | 
| 4 | 
            -
              class PagarMeTest < Test::Unit::TestCase
         | 
| 5 | 
            -
                should 'validate fingerprint correctly' do
         | 
| 6 | 
            -
                  finderprint = Digest::SHA1.hexdigest "123##{PagarMe.api_key}"
         | 
| 7 | 
            -
                  assert PagarMe.validate_fingerprint(123, finderprint)
         | 
| 8 | 
            -
                end
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
            end
         |