class PayCallSms::SmsSender

this class sends smses and parses responses

Attributes

logger[R]

Public Class Methods

new(options = {}) click to toggle source

Create new sms sender with given options

  • api_url: endpoint api url to make request to

  • username: endpoint auth user

  • password: endpoint auth pass

# File lib/pay_call_sms/sms_sender.rb, line 14
def initialize(options = {})
  @options = {api_url: 'https://api.multisend.co.il/MultiSendAPI/sendsms'}.merge(options)
  @logger = Logging.logger[self.class]

  %w(api_url  username  password).each{|key| raise ArgumentError.new("options :#{key} must be present") if @options[key.to_sym].blank? }
end

Public Instance Methods

api_url() click to toggle source
# File lib/pay_call_sms/sms_sender.rb, line 21
def api_url
  @options[:api_url]
end
build_send_sms_params(message_text, phones, message_id, options = {}) click to toggle source
# File lib/pay_call_sms/sms_sender.rb, line 69
def build_send_sms_params(message_text, phones, message_id, options = {})
  result = {
    user: @options[:username],
    password: @options[:password],
    recipient: phones.join(','),
    message: message_text,
    customermessageid: message_id
  }
  if options[:delivery_notification_url].present?
    result[:deliverynotificationURL] = options[:delivery_notification_url]
    result[:deliverynotificationmethod] = 'POST'
  end
  result[:from] = options[:sender_number]
  result[:from] = options[:sender_name] if options[:sender_name].present?
  result
end
send_sms(message_text, phones, options = {}) click to toggle source

send text string to the phones array of phone numbers options - is a hash of optional configuration that can be passed to sms sender:

* +sender_name+ - sender name that will override gateway sender name
* +sender_number+ - sender number that will override gateway sender number
* +delivery_notification_url+ - url which will be invoked upon notification delivery

Returns response OpenStruct that contains:

* +message_id+ - message id string. You must save this id if you want to receive delivery notifications via push/pull
# File lib/pay_call_sms/sms_sender.rb, line 32
def send_sms(message_text, phones, options = {})
  raise ArgumentError.new("Text must be at least 1 character long") if message_text.blank?
  raise ArgumentError.new("No phones were given") if phones.blank?
  raise ArgumentError.new("Either :sender_name or :sender_number attribute required") if options[:sender_name].blank? && options[:sender_number].blank?
  raise ArgumentError.new("Sender number must be between 4 to 14 digits: #{options[:sender_number]}") if options[:sender_number].present? && !PhoneNumberUtils.valid_sender_number?(options[:sender_number])
  raise ArgumentError.new("Sender name must be between 2 and 11 latin chars") if options[:sender_name].present? && !PhoneNumberUtils.valid_sender_name?(options[:sender_name])

  phones = [phones] unless phones.is_a?(Array)
  phones.each do |p| # check that phones are in valid cellular format
    raise ArgumentError.new("Phone number '#{p}' must be cellular phone with 972 country code") unless PhoneNumberUtils.valid_cellular_phone?(p)
  end

  message_id = UUIDTools::UUID.timestamp_create.to_str
  body_params = build_send_sms_params(message_text, phones, message_id, options)
  logger.debug "#send_sms - making post to #{@options[:api_url]} with params: \n #{body_params}"
  http_response = HTTParty.post(@options[:api_url], :body => body_params, :headers => {'Accept' => 'application/json'})
  logger.debug "#send_sms - got http response: code=#{http_response.code}; body=\n#{http_response.parsed_response}"
  raise StandardError.new("Non 200 http response code: #{http_response.code} \n #{http_response.parsed_response}") if http_response.code != 200
  if http_response.parsed_response.is_a?(Hash)
    json = http_response.parsed_response
  elsif http_response.parsed_response.is_a?(String)
    begin
      json = JSON.parse(http_response.parsed_response)
    rescue JSON::ParserError => e
      raise PayCallSms::GatewayError.new("Failed to parse response to json: #{http_response.parsed_response}")
    end
    logger.debug "#send_sms - parsed response: #{json.inspect}"
  end
  if json['success'] == true
    OpenStruct.new(
       message_id: message_id,
     )
  else
    raise PayCallSms::GatewayError.new("Failed to send sms: #{json.inspect}")
  end
end