pagseguro_client 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -10,17 +10,18 @@ Este é um plugin do Ruby on Rails que permite utilizar o [PagSeguro](https://pa
10
10
 
11
11
  ### Instalação
12
12
 
13
- Adicione a biblioteca ao arquivo Gemfile:
13
+ Adicione a biblioteca ao arquivo Gemfile:
14
14
 
15
15
  ```ruby
16
16
  gem 'pagseguro_client', git: "git://github.com/matheustardivo/pagseguro_client.git"
17
17
  ```
18
18
 
19
- E crie o arquivo de configuração em `config/pagseguro.yml`:
19
+ E crie o arquivo de configuração em `config/pagseguro.yml`:
20
20
 
21
21
  ```yaml
22
22
  development: &development
23
- base_url: "http://localhost:4000"
23
+ ws_url: "http://localhost:4000"
24
+ ps_url: "http://localhost:4000"
24
25
  email: matheustardivo@gmail.com
25
26
  token: "a1951ac04115012fabb660334b97cc6e"
26
27
 
@@ -28,7 +29,8 @@ test:
28
29
  <<: *development
29
30
 
30
31
  production:
31
- base_url: "https://ws.pagseguro.uol.com.br"
32
+ ws_url: "https://ws.pagseguro.uol.com.br"
33
+ ps_url: "https://pagseguro.uol.com.br"
32
34
  email: matheustardivo@gmail.com
33
35
  token: "tokenGeradoPeloPagseguro"
34
36
  ```
@@ -41,7 +43,7 @@ Para realizar os seus testes você pode usar um servidor de testes do Pagseguro
41
43
  @order = PagseguroClient::Order.new(id) # Seu identificador da ordem de pagamento
42
44
  @order.add(
43
45
  id: "1", # Seu identificador do produto
44
- description: produto.descricao,
46
+ description: produto.descricao,
45
47
  amount: produto.preco)
46
48
  @response = order.send_request
47
49
  ```
@@ -63,10 +65,10 @@ Agora basta usar a url retornada para enviar o usuário para efetuar o pagamento
63
65
  # No seu controller
64
66
  def notificacao
65
67
  return unless request.post?
66
-
68
+
67
69
  @notification = PagseguroClient::Notification.retrieve(params[:notificationCode])
68
70
  # Seu código para utilizar a notificação
69
-
71
+
70
72
  render nothing: true
71
73
  end
72
74
  ```
@@ -75,7 +77,6 @@ O objeto `notification` possui os seguintes métodos:
75
77
 
76
78
  * `PagseguroClient::Notification#code`: Código da notificação
77
79
  * `PagseguroClient::Notification#order_id`: Código da sua ordem de pagamento
78
- * `PagseguroClient::Notification#order_code`: Código do Pagseguro para sua ordem de pagamento
79
80
  * `PagseguroClient::Notification#status`: Status da ordem de pagamento atual
80
81
  * `PagseguroClient::Notification#payment_method`: Método utilizado para o pagamento
81
82
 
@@ -23,8 +23,12 @@ module PagseguroClient
23
23
  @@config[Rails.env]
24
24
  end
25
25
 
26
- def base_url
27
- config["base_url"]
26
+ def ws_url
27
+ config["ws_url"]
28
+ end
29
+
30
+ def ps_url
31
+ config["ps_url"]
28
32
  end
29
33
 
30
34
  def token
@@ -35,12 +39,16 @@ module PagseguroClient
35
39
  config["email"]
36
40
  end
37
41
 
42
+ def checkout_url
43
+ "#{ws_url}/v2/checkout"
44
+ end
45
+
38
46
  def payment_url(code)
39
- "#{base_url}/v2/checkout/payment.html?code=#{code}"
47
+ "#{ps_url}/v2/checkout/payment.html?code=#{code}"
40
48
  end
41
49
 
42
50
  def notification_url(code)
43
- "#{base_url}/v2/transactions/notifications/#{code}"
51
+ "#{ws_url}/v2/transactions/notifications/#{code}"
44
52
  end
45
53
 
46
54
  class MissingEnvironmentError < StandardError; end
@@ -27,7 +27,7 @@ module PagseguroClient
27
27
  products.each_with_index do |item, index|
28
28
  index += 1
29
29
  data["itemId#{index}"] = item[:id]
30
- data["itemDescription#{index}"] = item[:description]
30
+ data["itemDescription#{index}"] = item[:description].to_s.unpack("U*").pack("C*")
31
31
  data["itemAmount#{index}"] = item[:amount]
32
32
  data["itemQuantity#{index}"] = item[:quantity] || 1
33
33
  end
@@ -35,18 +35,45 @@ module PagseguroClient
35
35
  data
36
36
  end
37
37
 
38
+ def parse_response(xml)
39
+ doc = Nokogiri::XML(xml)
40
+
41
+ # Verify if this is an error
42
+ unless doc.css("error").empty?
43
+ code = doc.xpath("//code").text
44
+ message = doc.xpath("//message").text
45
+ PagseguroError.new(code, message)
46
+
47
+ else
48
+ code = doc.xpath("//code").text
49
+ {
50
+ code: code,
51
+ url: PagseguroClient.payment_url(code)
52
+ }
53
+ end
54
+ end
55
+
38
56
  # Send a new payment request to Pagseguro
39
57
  # Returns the URL to redirect your user to complete the payment in Pagseguro
40
58
  def send_request
41
- response = RestClient.post("#{PagseguroClient.base_url}/v2/checkout", data)
59
+ begin
60
+ response = RestClient.post(PagseguroClient.checkout_url, data, {
61
+ :content_type => "application/x-www-form-urlencoded",
62
+ :charset => "UTF-8"
63
+ })
42
64
 
43
- doc = Nokogiri::XML(response.body)
44
- code = doc.xpath("//code").text
65
+ parse_response(response.body)
45
66
 
46
- {
47
- code: code,
48
- url: PagseguroClient.payment_url(code)
49
- }
67
+ rescue => e
68
+ raise parse_response(e.response)
69
+ end
70
+ end
71
+ end
72
+
73
+ class PagseguroError < StandardError
74
+ attr_reader :code, :message
75
+ def initialize(code, message)
76
+ @code, @message = code, message
50
77
  end
51
78
  end
52
79
  end
@@ -1,3 +1,3 @@
1
1
  module PagseguroClient
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -2,10 +2,10 @@ require "spec_helper"
2
2
 
3
3
  describe "Base" do
4
4
  it "should return the payment url" do
5
- PagseguroClient.payment_url("XPTO").should == "#{PagseguroClient.base_url}/v2/checkout/payment.html?code=XPTO"
5
+ PagseguroClient.payment_url("XPTO").should == "#{PagseguroClient.ws_url}/v2/checkout/payment.html?code=XPTO"
6
6
  end
7
7
 
8
8
  it "should return the notification url" do
9
- PagseguroClient.notification_url("XPTO").should == "#{PagseguroClient.base_url}/v2/transactions/notifications/XPTO"
9
+ PagseguroClient.notification_url("XPTO").should == "#{PagseguroClient.ws_url}/v2/transactions/notifications/XPTO"
10
10
  end
11
11
  end
@@ -18,6 +18,19 @@ module PagseguroClient
18
18
  order
19
19
  }
20
20
 
21
+ it "should parse success response xml" do
22
+ xml = <<-XML
23
+ <?xml version="1.0" encoding="ISO-8859-1"?>
24
+ <checkout>
25
+ <code>8CF4BE7DCECEF0F004A6DFA0A8243412</code>
26
+ <date>2010-12-02T10:11:28.000-02:00</date>
27
+ </checkout>
28
+ XML
29
+
30
+ hash = subject.parse_response(xml)
31
+ hash[:code].should == "8CF4BE7DCECEF0F004A6DFA0A8243412"
32
+ end
33
+
21
34
  it "should add product" do
22
35
  subject.products.should_not be_empty
23
36
  subject.products.size.should == 1
@@ -38,5 +51,19 @@ module PagseguroClient
38
51
  data["itemId3"].should == "3"
39
52
  end
40
53
  end
54
+
55
+ context "order with invalid product amount" do
56
+ it "should parse error response xml" do
57
+ response_xml = <<-XML
58
+ <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><errors><error><code>11029</code><message>Item amount invalid pattern: 30. Must fit the patern: \\d+.\\d{2} </message></error></errors>
59
+ XML
60
+
61
+ order = Order.new("XPTO")
62
+ error = order.parse_response(response_xml)
63
+ error.kind_of?(PagseguroError).should be_true
64
+ error.code.should == "11029"
65
+ error.message.should == "Item amount invalid pattern: 30. Must fit the patern: \\d+.\\d{2} "
66
+ end
67
+ end
41
68
  end
42
69
  end
@@ -1,5 +1,6 @@
1
1
  development: &development
2
- base_url: "http://localhost:4000"
2
+ ws_url: "http://localhost:4000"
3
+ ps_url: "http://localhost:4000"
3
4
  email: matheustardivo@gmail.com
4
5
  token: "a1951ac04115012fabb660334b97cc6e"
5
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagseguro_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: