Я тут подумал: меня беспокоит тот факт, что неясно, что должно входить в description. И чтобы узнать, надо вкуривать код и API Payture.

Может, завернём параметры init в value-object, структуру?

```ruby
# Параметры платежа. Обязательные - в конструкторе.
class PaymentInitParams < Struct.new(:order_id, :amount, :ip, :product, :template_tag, :language)
  def initialize(order_id, amount, ip)
    self.order_id = order_id
    self.amount = amount
    self.ip = ip
  end
end

# Класс, преобразующий параметры в пригодный для отправки запроса в Payture вид.
class EncodedPaymentInitParams
  def initialize(payment_init_params)
    @payment_init_params = payment_init_params
  end
  
  def to_s
    URI.escape(@payment_init_params.each_pair.to_a.map { |a|
      a[1] && "#{a[0].to_s.camelize}=#{a[1]}" 
    }.compact.join(';'))
  end
end
```

И, где надо:

```ruby
EncodedPaymentInitParams.new(params).to_s
```