Integracja z Payu

Cześć, próbuje zaimplementować płatności Payu z pomocą tego gema: https://github.com/ronin/payu do mojej aplikacji, jednak mam mały problem. Mianowicie po zatwierdzeniu formularza, przekierowuje mnie na stronę Payu gdzie widnieje błąd 201 który w dokumentacji jest enigmatycznie opisany jako “inny chwilowy błąd bazy danych”

<%= form_tag(@transaction.new_url) do %>
<%= payu_hidden_fields(@transaction) %>
<%= submit_tag ‘Pay’ %>
<% end %>

Tak wygląda mój kontroler:

pos = Payu::Pos.new :pos_id => '305673', :pos_auth_key => 'bXRTYfW', :key1 => '1998bbbf354d6dab2bf13b191996fa19', :key2 => 'abeb5ac45f77821bf5021ea21fb00aba', :add_signature => true
@transaction = pos.new_transaction(:first_name => 'John', :last_name => 'Doe', :email => 'john.doe@example.org', :client_ip => '1.2.3.4', :amount => 1000, :desc => 'Transaction description')

Jeśli zaś chodzi o konto w Payu to założyłem je w ich sandboxie oraz skonfigurowałem sklep z punktem płatności Classic API. Będę wdzięczny za jakiekolwiek wskazówki lub pomoc. Pozdrawiam

Jesteś pewny, że gem sprzed 4 lat będzie działał prawidłowo? Przeglądam źródła i on nie korzysta z REST API tylko z Classic API, który nie jest polecany przez PayU.
Ja właśnie implementuję PayU i robię to sam od podstaw - w sumie to nic trudnego. Zatem idź do skekcji REST API i spróbuj zaimplementować to samemu.

1 Like

Też brałem to pod uwagę a jednak jak bawiłem się z Przelewami24 to gem śmigał aż miło. Mimo wszystko jestem trochę zielony, przeczytałem dokumentację REST API i wywnioskowałem, że muszę wysłać POSTem żądanie utworzenia nowego zamówienia do Payu i w odpowiedzi otrzymam URL na jaki muszę przekierować użytkownika, tak?
Będę wdzięczny za wszelkie wskazówki jak wysłać prawidłowe żądanie POST bo niezbyt wiem jak się do tego zabrać od dobrej strony, pozdrawiam :slight_smile:

1 Like

Mam payu.yaml w config/:

auth_url: https://secure.snd.payu.com/pl/standard/user/oauth/authorize
api_url: https://secure.snd.payu.com/api/v2_1
notify_url: http://my_server/payu_notify
client_id: 123
client_secret: abc123
second_key: cde666
pos_id: 123

Dostęp do tego mam: Rails.configuration.payu

@config = Rails.configuration.payu

Poglądowo:

  1. Access token:

    params = {

       grant_type: 'client_credentials',
       client_id: @config['client_id'],
       client_secret: @config['client_secret'],
       }
     ret = Net::HTTP.post_form(URI.parse(@config['auth_url']), params)
     @access_token = JSON.parse(ret.body)['access_token']
    
  2. Order create request:

    headers = {

       'Content-Type' => 'application/json', 
       'Authorization' => "Bearer #{@access_token}"
     }
     ip = opt[:ip] ? opt[:ip] : '127.0.0.1' 
     uri = URI("#{@config['api_url']}/orders")
     http = Net::HTTP.new(uri.host, uri.port)
     http.use_ssl = true
     req = Net::HTTP::Post.new(uri.path, headers)
     req['Content-Type'] = 'application/json'
     req.body = {
    
       'notifyUrl' => @config['notify_url'],
       'continueUrl' => @config['continue_url'],
       'merchantPosId' => @config['pos_id'],
       'description' => 'xxx',
       'currencyCode' => 'PLN',
       'totalAmount' => to_pay,
       'buyer' => buyer,
       'customerIp' => ip,
       'settings' => {
         'invoiceDisabled' => 'true'
         },
       'products' => [
         products
       ]
     }.to_json
     res = http.request(req)
    

w res masz wynik, jeśli wszystko poszło ok to wyłuskujesz z niego:
JSON.parse(res)['redirectUri']

Zostaje Notify:

Słuchasz na przychodzący post - czyli robisz kontroler a w nim na post wyłuskujesz parametry - tutaj przyda się również sprawdzanie sygnatury, które jest w headerze:
request.headers["OpenPayu-Signature"]

Opis jak to obliczać jest na stronie payu

PS. Wygląd zapytań - masz też na stronie payu

1 Like

Wielkie dzięki za odpowiedź, problem wyszedł dość szybko bo już na etapie access tokena, w odpowiedzi na zapytanie otrzymuje:

{"error":"invalid_client","error_description":"Can't find oauthClient with clientId = 305701"}

Co jest dość dziwne. Czy przy wysyłaniu requesta z danymi z sandbox’a dostawałeś prawidłową odpowiedź? Przy użyciu danych z przykładu na stronie Payu poprawnie zwraca token.

Tak - u mnie wszystko działa. Spróbuj ręcznie wypełnić te dane - bez configów - zrób o w skypcie .rb lub nawet w konsoli irb i zobacz co Ci zwróci. Na dobry auth_url wysyłasz?

Racja, wysyłałem auth_url od produkcji a nie sandboxa. Wielkie dzięki, będę walczył dalej :slight_smile: