156 lines
5.4 KiB
Ruby
156 lines
5.4 KiB
Ruby
# vandar is payment proxy
|
|
module Vandar
|
|
# data keys are:
|
|
# api_key string required
|
|
# amount Integer required
|
|
# callback_url String required
|
|
# mobile_number String optional
|
|
# factorNumber String optional
|
|
# description String optional
|
|
# valid_card_number String optional
|
|
module Deposit
|
|
def generate_token(data)
|
|
url = 'https://ipg.vandar.io/api/v3/send'
|
|
# POST JSON content
|
|
data.merge!(api_key: VandarService::API_KEY)
|
|
parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json')
|
|
end
|
|
|
|
# step two
|
|
# handle by ui, open payment page by token
|
|
# METHOD: get
|
|
# URL: https://ipg.vandar.io/v3/{token}
|
|
|
|
# step three
|
|
def transaction(token)
|
|
url = 'https://vandar.io/api/ipg/2step/transaction'
|
|
data = { api_key: VandarService::API_KEY, token: token }
|
|
# POST JSON content
|
|
parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json')
|
|
end
|
|
|
|
# step four
|
|
def verify(token)
|
|
url = 'https://ipg.vandar.io/api/v3/verify'
|
|
data = { api_key: VandarService::API_KEY, token: token }
|
|
# POST JSON content
|
|
parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json')
|
|
end
|
|
end
|
|
|
|
# vandar withdraw fiat
|
|
module Withdraw
|
|
def list_withdraw
|
|
url = "https://api.vandar.io/v2.1/business/#{VandarService::BUSINESS_NAME}/settlement"
|
|
headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" }
|
|
Faraday.get(url, nil, headers).body
|
|
end
|
|
|
|
def create_withdraw(data)
|
|
# amount: تومان و بزرگتر یا مساوی 5000
|
|
url = "https://api.vandar.io/v3/business/#{VandarService::BUSINESS_NAME}/settlement/store"
|
|
headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" }
|
|
|
|
# POST JSON content
|
|
data.merge!(track_id: ::SecureRandom.uuid)
|
|
self.class.parse Faraday.post(url, data.to_json, headers)
|
|
end
|
|
|
|
def info_withdraw(id)
|
|
url = "https://api.vandar.io/v2.1/business/#{VandarService::BUSINESS_NAME}/settlement/#{id}"
|
|
headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" }
|
|
self.class.parse Faraday.get(url, nil, headers)
|
|
end
|
|
|
|
def delete_withdraw
|
|
url = "https://api.vandar.io/v2.1/business/#{VandarService::BUSINESS_NAME}/settlement/{transaction_id}"
|
|
headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" }
|
|
self.class.parse Faraday.delete(url, nil, headers)
|
|
end
|
|
end
|
|
|
|
# for login in Vandar Account
|
|
module Login
|
|
MOBILE = ENV.fetch('VANDAR_MOBILE') || raise('please set Vandar mobile')
|
|
PASSWORD = ENV.fetch('VANDAR_PASSWORD') || raise('please set Vandar password')
|
|
def login
|
|
return @login_token if @login_token.present?
|
|
|
|
url = 'https://api.vandar.io/v3/login'
|
|
# POST JSON content
|
|
data = { mobile: MOBILE, password: PASSWORD }
|
|
response = self.class.parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json')
|
|
@login_token = response.dig('access_token') || raise('login in vandar accrued error')
|
|
::Rails.cache.write('vandar_login_token', @login_token, expires_in: 345_600)
|
|
@login_token
|
|
end
|
|
end
|
|
|
|
|
|
# related to Vandar transactions
|
|
module Transaction
|
|
# Name Type Status
|
|
# fromDate String optional
|
|
# toDate String optional
|
|
# statusKind String optional
|
|
# status String optional
|
|
# channel String optional
|
|
# formId String optional
|
|
# ref_id String optional
|
|
# tracking_code String optional
|
|
# per_page String optional
|
|
# q String optional
|
|
#
|
|
#
|
|
# status
|
|
# 1: نشان دهنده تراکنش با وضعیت موفق
|
|
# - 1: نشان دهنده تراکنش با وضعیت ناموفق
|
|
# 3 : نشان دهنده تراکنش با وضعیت درحال انجام
|
|
# 2 : نشان دهنده تسویه با وضعیت موفق
|
|
# -2 : نشان دهنده تسویه با وضعیت درحال انجام
|
|
# -3 : نشان دهنده تسویه با وضعیت ناموفق
|
|
# -4 : نشان دهنده تسویه با وضعیت لغو شده
|
|
# 5 : نشان دهنده تراکنش واریزی از نوع انتقال وجه داخلی
|
|
# -5 : نشان دهنده تراکنش خروجی از نوع انتقال وجه داخلی
|
|
# 6 : نشان دهنده تراکنش نوع حق اشتراک
|
|
|
|
def list_transactions(**filters)
|
|
url = "https://api.vandar.io/v2/business/#{VandarService::BUSINESS_NAME}/transaction"
|
|
headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" }
|
|
response = Faraday.get(url, filters, headers)
|
|
self.class.parse response
|
|
end
|
|
|
|
|
|
end
|
|
end
|
|
|
|
|
|
class VandarService
|
|
API_KEY = ENV.fetch('VANDAR_API_KEY') || raise('please set Vandar Api_Key')
|
|
BUSINESS_NAME = ENV.fetch('VANDAR_BUSINESS_NAME') || 'developers'
|
|
SUCCESS_WITHDRAW = [2].freeze
|
|
UNSUCCESS_WITHDRAW = [-3, -4].freeze
|
|
|
|
attr_accessor :login_token
|
|
|
|
def initialize
|
|
@login_token = ::Rails.cache.read('vandar_login_token') || login
|
|
end
|
|
|
|
extend Vandar::Deposit
|
|
include Vandar::Login
|
|
include Vandar::Withdraw
|
|
include Vandar::Transaction
|
|
|
|
class << self
|
|
# # step one
|
|
def parse(response)
|
|
raise 'response is empty' unless response.present?
|
|
raise "unexpected response status #{response.status}" unless response.status == 200
|
|
|
|
JSON.parse(response.body)
|
|
end
|
|
end
|
|
end
|