Giter Club home page Giter Club logo

pagseguro-sdk-ruby's Introduction

DEPRECATED # Biblioteca de integração PagSeguro em Ruby

NOTE: Esse SDK foi descontinuado
Estamos trabalhando em soluções e facilidades para evoluirmos a Plataforma de API’s do PagSeguro. Conheça nossa Plataforma de API’s acessando https://dev.pagseguro.uol.com.br/reference/pagseguro-reference-intro

Build Status Code Climate

Descrição

A biblioteca PagSeguro em Ruby é um conjunto de classes de domínio que facilitam, para o desenvolvedor Ruby, a utilização das funcionalidades que o PagSeguro oferece na forma de APIs. Com a biblioteca instalada e configurada, você pode facilmente integrar funcionalidades como:

Requisitos

Instalação

  • Adicione a biblioteca ao seu Gemfile.
gem "pagseguro-oficial", "~> 2.5.0"
  • Execute o comando bundle install.

Configuração

Para fazer a autenticação, você precisará configurar as credenciais do PagSeguro. Crie o arquivo config/initializers/pagseguro.rb com o conteúdo abaixo.

PagSeguro.configure do |config|
  config.token       = "seu token"
  config.email       = "seu e-mail"
  config.environment = :production # ou :sandbox. O padrão é production.
  config.encoding    = "UTF-8" # ou ISO-8859-1. O padrão é UTF-8.
end

O token de segurança está disponível em sua conta do PagSeguro.

Pagamentos (API V2)

Para iniciar uma requisição de pagamento, você precisa instanciar a classe PagSeguro::PaymentRequest. Isso normalmente será feito em seu controller de checkout.

class CheckoutController < ApplicationController
  def create
    # O modo como você irá armazenar os produtos que estão sendo comprados
    # depende de você. Neste caso, temos um modelo Order que referência os
    # produtos que estão sendo comprados.
    order = Order.find(params[:id])

    payment = PagSeguro::PaymentRequest.new

    # Você também pode fazer o request de pagamento usando credenciais
    # diferentes, como no exemplo abaixo

    payment = PagSeguro::PaymentRequest.new(email: 'abc@email', token: 'token')

    payment.reference = order.id
    payment.notification_url = notifications_url
    payment.redirect_url = processing_url

    order.products.each do |product|
      payment.items << {
        id: product.id,
        description: product.title,
        amount: product.price,
        weight: product.weight
      }
    end

    # Caso você precise passar parâmetros para a api que ainda não foram
    # mapeados na gem, você pode fazer de maneira dinâmica utilizando um
    # simples hash.
    payment.extra_params << { paramName: 'paramValue' }
    payment.extra_params << { senderBirthDate: '07/05/1981' }
    payment.extra_params << { extraAmount: '-15.00' }

    response = payment.register

    # Caso o processo de checkout tenha dado errado, lança uma exceção.
    # Assim, um serviço de rastreamento de exceções ou até mesmo a gem
    # exception_notification poderá notificar sobre o ocorrido.
    #
    # Se estiver tudo certo, redireciona o comprador para o PagSeguro.
    if response.errors.any?
      raise response.errors.join("\n")
    else
      redirect_to response.url
    end
  end
end

Notificações (API V3)

O PagSeguro irá notificar a URL informada no processo de checkout. Isso é feito através do método PagSeguro::PaymentRequest#notification_url. Esta URL irá receber o código da notificação e tipo de notificação. Com estas informações, podemos recuperar as informações detalhadas sobre o pagamento.

class NotificationsController < ApplicationController
  skip_before_filter :verify_authenticity_token, only: :create

  def create
    transaction = PagSeguro::Transaction.find_by_notification_code(params[:notificationCode])

    if transaction.errors.empty?
      # Processa a notificação. A melhor maneira de se fazer isso é realizar
      # o processamento em background. Uma boa alternativa para isso é a
      # biblioteca Sidekiq.
    end

    render nothing: true, status: 200
  end
end

Consultas (API V3)

Transações abandonadas (API V2)

Para quantificar o número de transações abandonadas, você pode solicitar uma lista com histórico dessas transações.

report = PagSeguro::Transaction.find_abandoned

while report.next_page?
  report.next_page!
  puts "=> Page #{report.page}"

  abort "=> Errors: #{report.errors.join("\n")}" unless report.valid?

  puts "=> Report was created at: #{report.created_at}"
  puts

  report.transactions.each do |transaction|
    puts "=> Abandoned transaction"
    puts "   created at: #{transaction.created_at}"
    puts "   code: #{transaction.code}"
    puts "   type_id: #{transaction.type_id}"
    puts "   gross amount: #{transaction.gross_amount}"
    puts
  end
end

Histórico de transações

Para facilitar seu controle financeiro e seu estoque, você pode solicitar uma lista com histórico das transações da sua loja.

report = PagSeguro::Transaction.find_by_date

while report.next_page?
  report.next_page!
  puts "== Page #{report.page}"
  abort "=> Errors: #{report.errors.join("\n")}" unless report.valid?
  puts "Report created on #{report.created_at}"
  puts

  report.transactions.each do |transaction|
    puts "=> Transaction"
    puts "   created_at: #{transaction.created_at}"
    puts "   code: #{transaction.code}"
    puts "   cancellation_source: #{transaction.cancellation_source}"
    puts "   payment method: #{transaction.payment_method.type}"
    puts "   gross amount: #{transaction.gross_amount}"
    puts "   updated at: #{transaction.updated_at}"
    puts
  end
end

Histórico de status de transações

É possível consultar o histórico de mudanças de status em transações

response = PagSeguro::Transaction.find_status_history("transaction_code")

response.each do |status|
  puts "STATUS:"
  puts "  code: #{status.code}"
  puts "  date: #{status.date}"
  puts "  notification_code: #{status.notification_code}"
end

Consultar opções de parcelamento

Você pode consultar as opções de parcelamento para um determinado valor.

installments = PagSeguro::Installment.find("100.00")

puts "=> INSTALLMENTS"
puts
installments.each do |installment|
  puts installment.inspect
end

visa_installments = PagSeguro::Installment.find("100.00", "visa")

puts
puts "=> VISA INSTALLMENTS"
puts
visa_installments.each do |installment|
  puts installment.inspect
end

Modelo de aplicações

Setando autorizações

  options = {
    credentials: PagSeguro::ApplicationCredentials.new("app4521929942", "1D47384E6565EBE664DAEF9AD690438B"),
    permissions: [:searches, :notifications],
    notification_url: 'foo.com.br',
    redirect_url: 'bar.com.br'
  }
  response = PagSeguro::Authorization.new(options).authorize

Em seguida, acesse o link para confirmar as autorizações

  response.url

Estorno de Transações

Você pode estornar pagamentos que as transações estiverem com status: Paga (3), Disponível (4), Em disputa (5).

  refund = PagSeguro::TransactionRefund.new
  refund.transaction_code = "D5D5BE444148407891E497B421975599"

  response = refund.register

  if response.errors.any?
    puts response.errors.join("\n")
  else
    puts "=> REFUND RESPONSE"
    puts response.result
  end

Cancelamento de Transações

Você pode cancelar transações que estiverem com status: Aguardando pagamento ou Em análise.

  cancellation = PagSeguro::TransactionCancellation.new
  cancellation.transaction_code = "AFB8FCF29496401681257C1ECE3A98FF"

  cancellation.register

  if cancellation.errors.any?
    puts cancellation.errors.join("\n")
  else
    puts "=> CANCELLATION RESPONSE"
    puts cancellation.result
  end

API

PagSeguro::PaymentRequest (utiliza versão V2)

Definindo identificador do pedido

payment.reference = "ref1234"

Definindo informações de entrega

payment = PagSeguro::PaymentRequest.new
payment.shipping = {
  type_name: "sedex",
  cost: 20.00,
  address: {
    street: "Av. Brig. Faria Lima",
    number: 1384,
    complement: "5 andar",
    district: "Jardim Paulistano",
    city: "São Paulo",
    state: "SP",
    postal_code: "01452002"
  }
}

Alternativamente você pode definir uma instância da classe PagSeguro::Shipping

shipping_options = {
  type_name: "sedex",
  cost: 20.00,
  address: {
    street: "Av. Brig. Faria Lima",
    number: 1384,
    complement: "5 andar",
    district: "Jardim Paulistano",
    city: "São Paulo",
    state: "SP",
    postal_code: "01452002"
  }
}

payment.shipping = PagSeguro::Shipping.new(shipping_options)

Definindo informações do comprador

payment.sender = {
  name: "John Doe",
  email: "[email protected]",
  cpf: "12345678901",
  phone: {
    area_code: "11",
    number: "123456789"
  }
}

Definindo valores de acréscimo/desconto

payment.extra_amount = 123.45   # acréscimo
payment.extra_amount = -123.45  # desconto

URLS

# URL de notificação
payment.notification_url = "http://example.org/notifications"

# URL de retorno
payment.return_url = "http://example.org/processando"

Definindo tempo de vida do código de pagamento

payment.max_uses = 100
payment.max_age = 3600  # em segundos

Definindo encoding

PagSeguro.encoding = "UTF-8" # UTF-8 ou ISO-8859-1

Checkout Transparente

Encontre toda a documentação necessária para o checkout transparente aqui: https://github.com/pagseguro/ruby/blob/master/docs/transparent_checkout.md

Docker

Docker é uma ferramenta open-source que cria uma camada de abstração e automação da virtualização do kernel do GNU/Linux*.

Primeiro certifique-se de que o Docker está instalado e configurado corretamente, em seguida construa a imagem:

% docker build -t pagseguro .

E para entrar na imagem:

% docker run --rm -it -v ${PWD}:/app pagseguro
root@5c480dd6e22a:/app#

Ou se preferir você pode usar o docker-compose:

% docker-compose run script
root@c6697abac095:/app#

Dúvidas?

Caso tenha dúvidas ou precise de suporte, acesse nosso fórum.

Licença

Copyright 2013 PagSeguro Internet LTDA.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Notas

  • O PagSeguro somente aceita pagamento utilizando a moeda Real brasileiro (BRL).
  • Certifique-se que o email e o token informados estejam relacionados a uma conta que possua o perfil de vendedor ou empresarial.
  • Certifique-se que tenha definido corretamente o charset de acordo com a codificação (ISO-8859-1 ou UTF-8) do seu sistema. Isso irá prevenir que as transações gerem possíveis erros ou quebras ou ainda que caracteres especiais possam ser apresentados de maneira diferente do habitual.
  • Para que ocorra normalmente a geração de logs, certifique-se que o diretório e o arquivo de log tenham permissões de leitura e escrita.

Contribuições

Achou e corrigiu um bug ou tem alguma feature em mente e deseja contribuir?

  • Faça um fork
  • Adicione sua feature ou correção de bug (git checkout -b my-new-feature)
  • Commit suas mudanças (git commit -am 'Added some feature')
  • Rode um push para o branch (git push origin my-new-feature)
  • Envie um Pull Request

O código, os commits e os comentários devem ser em inglês. Adicione exemplos para sua nova feature. Se seu Pull Request for relacionado a uma versão específica, o Pull Request não deve ser enviado para o branch master e sim para o branch correspondente a versão.

pagseguro-sdk-ruby's People

Contributors

antoniofilho avatar bbcoimbra avatar cegoncalves avatar dannnylo avatar dmitryrck avatar douglasfeitosa avatar eduardoazevedo3 avatar filipemenezes avatar fnando avatar frozenfung avatar gabriellucius avatar geekcom avatar jairbj avatar jnettome avatar johnwmcarneiro avatar keernel avatar lucasrcezimbra avatar lucasrenan avatar lucianohr avatar luizamboni avatar marcelo-lopes avatar mjacobus avatar p-lambert avatar rafaelcgo avatar rafaelrpbelo avatar raphaelrejes avatar rodrigoddalmeida avatar s2it-moscou avatar thiago-medeiros avatar vitorkusiaki avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pagseguro-sdk-ruby's Issues

ShippingAddressRequired not working

Hello!

I'm working with a web app thats sells a service, so i won't use the shippingAddress. But in the request_serializer.rb there's missing parse to the shipping: addressRequired variable present in Pagseguro documentation. I checked in request_serializer.rb, method serialize_shipping and i didn't find it. There's another way to solve that?

Thanks in advance!

Consulte Transaction by code error

Este relatório deve ser usado APENAS para reportar bugs

Comportamento esperado

The method should return transaction data

Comportamento atual

I get a message error:

I, [2019-01-15T15:08:20.182851 #19753] INFO -- : Started POST "/notifications?notificationCode=DE26F9-5D0E0F0E0F12-5BB4825F8B7B-70A25A&notificationType=transaction" for 187.115.6$ I, [2019-01-15T15:08:20.186399 #19753] INFO -- : Processing by NotificationsController#create as */* I, [2019-01-15T15:08:20.186599 #19753] INFO -- : Parameters: {"notificationCode"=>"DE26F9-5D0E0F0E0F12-5BB4825F8B7B-70A25A", "notificationType"=>"transaction"} I, [2019-01-15T15:08:20.188627 #19753] INFO -- : Notifications I, [2019-01-15T15:08:20.470655 #19753] INFO -- : Completed 500 Internal Server Error in 284ms (ActiveRecord: 0.0ms) F, [2019-01-15T15:08:20.471845 #19753] FATAL -- : F, [2019-01-15T15:08:20.471932 #19753] FATAL -- : ArgumentError (invalid value for BigDecimal(): ""): F, [2019-01-15T15:08:20.471996 #19753] FATAL -- : F, [2019-01-15T15:08:20.472058 #19753] FATAL -- : app/controllers/notifications_controller.rb:8:in create'`

Ambiente (produção, sandbox)

Passos para reproduzir o bug

  1. Call method:
    transaction = PagSeguro::Transaction.find_by_notification_code(params[:notificationCode])

Descrição Detalhada

Possível solução

Problemas ao encontrar a transaction pelo code

Estou implementando a integração com o pagseguro aqui, ainda em ambiente de desenvolvimento, mas estou tendo problema de Bad Request quando tento consultar uma transação que fiz de teste.

O que fiz foi uma compra pela minha ferramenta de R$ 1,00 e efetuei o pagamento dela, agora eu queria pelo rails console encontrar a transação pelo código que me retornou (C16073A1-9A8C-4D05-8025-9993E2BC78F9). Assim:

transaction = PagSeguro::Transaction.find_by_code("C16073A1-9A8C-4D05-8025-9993E2BC78F9")

E obtenho esse erro:

=> #<PagSeguro::Transaction::Response:0x007ff6a6e31ff8 @errors=#<PagSeguro::Errors:0x007ff6a9de3b48 @response=#<Aitch::Response 400 Bad Request (application/xml)>, @messages=["O código de notificação informado é inválido."]>> 

Daí usei o exemplo do README para listar as transações pela data, e obtive este resultado:

== Page 1
Report created on 2013-11-18 13:48:53 -0200

=> Transaction
   created_at: 2013-11-18 13:31:58 -0200
   code: C16073A1-9A8C-4D05-8025-9993E2BC78F9
   gross amount: 1.0
   updated at: 2013-11-18 13:40:21 -0200

Estou usando a gem pagseguro-oficial (2.0.2) no Rails 3.2.14, ruby 1.9.3p429

Poderiam me ajudar a resolver isto?

RubyGems

Why this gem is not available on RubyGems?

in order to get:

gem install pagseguro-oficial 

or

# Gemfile
gem 'pagseguro-oficial', '2.0.4'

Problema ao fazer POST para API de Pagamento

Estou usando a gem para fazer a integração com a api de pagamentos, entretanto, estou recebendo erro "Unauthorized" com minhas credenciais configuradas.

Já fiz vários testes e parece que o problema ocorre somente com a gem (suspeito que seja com o Aitch).

Fiz o mesmo request (com todos os mesmos parâmetros) usando um REST Client e funcionou corretamente. Tentei, também, com o HTTParty e funcionou normalmente, o problema parece ocorrer quando a gem tenta fazer o post.

require 'httparty'
require 'aitch'

url = "https://ws.pagseguro.uol.com.br/v2/checkout"

headers = {"Accept-Charset"=>"UTF-8",
 "Content-Type"=>"application/x-www-form-urlencoded; charset=UTF-8"}

body = {:currency=>"BRL",
 :reference=>6,
 :redirectURL=>"http://url.com/redirect/pagseguro",
 :notificationURL=> "http://url.com/redirect/pagseguro",
 "itemId1"=>15,
 "itemDescription1"=>"Acesso por 1 ano",
 "itemAmount1"=>"50.00",
 "itemQuantity1"=>1,
 "itemWeight1"=>0,
 :email=>"[email protected]",
 :token=>"NUMERODATOKEN",
 :charset=>"UTF-8"}

HTTParty.post(url, {body: body, headers: headers})
=> #<HTTParty::Response:0x7ff6d41370b8 parsed_response={"checkout"=>{"code"=>"NUMEROCODE", "date"=>"2013-09-08T21:25:55.000-03:00"}}, @response=#<Net::HTTPOK 200 OK readbody=true>, @headers={"date"=>["Mon, 09 Sep 2013 00:25:54 GMT"], "server"=>["Apache-Coyote/1.1"], "content-type"=>["application/xml;charset=ISO-8859-1"], "cache-control"=>["max-age=180"], "expires"=>["Mon, 09 Sep 2013 00:28:54 GMT"], "vary"=>["User-Agent"], "connection"=>["close"], "transfer-encoding"=>["chunked"]}>

Aitch.post(url, body, headers, {})
=> #<Aitch::Response:0x007fdea39cf2f0 @config=#<Aitch::Configuration:0x007fdea3ac4188 @timeout=10, @redirect_limit=5, @follow_redirect=true, @user_agent="Aitch/0.1.4 (http://rubygems.org/gems/aitch)", @default_headers={}, @json_parser=JSON, @xml_parser=Aitch::XMLParser, @html_parser=Aitch::HTMLParser>, @http_response=#<Net::HTTPUnauthorized 401 Unauthorized readbody=true>>

Primeiramente pensei que poderia ser algo com o user agent do Aitch, mas isso não se confirmou.

Identifiquei a chamada (e todos os parâmetros utilizados para realizar o request) neste arquivo: https://github.com/pagseguro/ruby/blob/master/lib/pagseguro/request.rb#L32

A chamada acontece em PaymentRequest#register

Problema com retorno do shipping

Opa, estou tendo problemas com o retorno das notificações. Estou recebendo o erro:
PagSeguro::Shipping::InvalidShippingTypeError (invalid "" type id)

Vejo que o shipping type está vindo preenchido no XML, mas por algum motivo o parser não está puxando. Alguém tem alguma idéia?

abaixo segue o XML do retorno:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<transaction>
    <date>2013-10-08T20:48:03.000-03:00</date>
    <code>0B9A4CD5-8946-4591-B29B-51A3EAA8FCB5</code>
    <reference>52535cc272ac26fa1f000001</reference>
    <type>1</type>
    <status>7</status>
    <cancellationSource>INTERNAL</cancellationSource>
    <lastEventDate>2013-10-08T20:49:13.000-03:00</lastEventDate>
    <paymentMethod>
        <type>1</type>
        <code>101</code>
    </paymentMethod>
    <grossAmount>1.95</grossAmount>
    <discountAmount>0.00</discountAmount>
    <feeAmount>0.50</feeAmount>
    <netAmount>1.45</netAmount>
    <extraAmount>0.00</extraAmount>
    <installmentCount>1</installmentCount>
    <itemCount>1</itemCount>
    <items>
        <item>
            <id>1</id>
            <description>Produto teste</description>
            <quantity>1</quantity>
            <amount>1.95</amount>
        </item>
    </items>
    <sender>
        <name>Gastao B Brun</name>
        <email>[email protected]</email>
        <phone>
            <areaCode>21</areaCode>
            <number>xxxxxxxxx</number>
        </phone>
    </sender>
    <shipping>
        <address>
            <street>RUA xxxxxxxxx</street>
            <number>104</number>
            <complement>xxxx</complement>
            <district>xxxxxx</district>
            <city>RIO DE JANEIRO</city>
            <state>RJ</state>
            <country>BRA</country>
            <postalCode>xxxxxxx</postalCode>
        </address>
        <type>2</type>
        <cost>0.00</cost>
    </shipping>
</transaction>

Please Release Updated Version of Gem

I noticed the last release 2.6.1 release was made in Aug 27, 2018. However, there are several updates to this library that are useful to us. Would it be possible to make a more recent release of the Gem?

We are currently installing this in our Gemfile using a ref to a more recent commit but that is a bit hacky.

NoMethodError (undefined method `escrow_end_date=' for #<PagSeguro::Transaction:0x007ff6f4377c40>)

Estou tentando simular uma compra e, quando a compra não é finalizada ainda (por exemplo, estou gerando o boleto), eu posso prosseguir com o meu método sem problemas. Ontem tentei fazer uma compra real, e este erro apareceu:

NoMethodError (undefined method `escrow_end_date=' for #PagSeguro::Transaction:0x007ff6f4377c40)

O que isso quer dizer? Eu não estou utilizando a propriedade de escrow_end_date de forma alguma!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.