t2_airtime 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 326cdd5b38f8d1c9749d76ba60268f5d5d7c98d1
4
- data.tar.gz: '07913bae3db4c8571829ac372aac6a4112472023'
3
+ metadata.gz: 0a465a10576955be1e193df5070890b80d6884d4
4
+ data.tar.gz: 1182a3ea5ee57f02f690ac599ce286fc2bc5af53
5
5
  SHA512:
6
- metadata.gz: 28c3c4f9055cbd006ff05b2bd629e874d93162859e25ab7180a463a61aa68028aad04e7d9bcad5da4038f8544bae6b06ebec7e2d6951006b5b617a601161853e
7
- data.tar.gz: f64ba5dd35a5e8d7ba427526ccc732c5c6049fe9a979bdee67b4e0311b02983eb0bbaef0f6c5caa5cbca09840b79b414dab0b9cef154dc23e8285c18447cf3b6
6
+ metadata.gz: b77299b057c64afb6e9a4591d89cb308b027bc89d08c79c98c24eeab8ade528cc39e37160c7efce85a5abb4ed9f6f61dd86a8a53e21a8e57c85b430a5936290d
7
+ data.tar.gz: 5d13a4d7bb0f2bfa5ee5daf76eed8e3f67f897b5b667d464a8c72189bd2c316377ff34913a022e7e3a8b8fc5a03ee2371eb9c3df81bac68665d7a08d303edac5
data/README.md CHANGED
@@ -1,464 +1,518 @@
1
- # TransferTo Airtime API
1
+ FORMAT: 1A
2
+ HOST: http://polls.apiblueprint.org/
2
3
 
3
- [TransferTo](https://www.transfer-to.com/home) helps businesses offer airtime top-ups, goods and services, and mobile money around the world in real time.
4
- TransferTo Airtime API enables developers to integrate TransferTo Top-up service into their system.
4
+ # t2-airtime
5
5
 
6
- This gem is a convenience wrapper around the Airtime API. Requirement is that Two Factor Authentication (2FA) is enabled in your [TransferTo Shop](https://shop.transferto.com) Security Center section.
6
+ T2-Airtime is a Ruby gem providing a proxy cache and a REST API to [TransferTo](https://www.transfer-to.com/home) Airtime service.
7
7
 
8
+ ## Authorization
8
9
 
9
- ## Usage
10
-
11
- Create a new rails application:
12
-
13
- rails new t2_airtime
14
-
15
- Add this line to your application's Gemfile:
16
-
17
- ```ruby
18
- gem 't2_airtime'
19
- ```
20
-
21
- And then execute:
22
-
23
- $ bundle
24
-
25
- Create a `.env` file with the required information:
26
-
27
- T2_SHOP_USER=
28
- T2_AIRTIME_KEY=
29
-
30
- Start the server: `bundle exec puma -C config/puma.rb`
31
-
32
- ### Routes
33
-
34
- The following routes are mada available to your application when you mount the API engine in `config/routes.rb`:
10
+ + Two Factor Authentication (2FA) is enabled in your [TransferTo Shop](https://shop.transferto.com) Security Center section
11
+ + You have your Transfer-To Shop username and Airtime secret key generated by 2FA
12
+ + Export the secrets as environment variables `T2_SHOP_USER`, `T2_AIRTIME_KEY`
13
+
14
+ # Account
35
15
 
36
16
  ```ruby
37
- mount T2Airtime::Engine => '/t2_airtime'
17
+ irb(main)> account= T2Airtime::Account.get
18
+ irb(main)> T2Airtime::Account.serialize(account.data)
38
19
  ```
39
20
 
40
- * `/t2_airtime/account` [Account information](#account_info)
41
- * `/t2_airtime/countries` [List of all countries offered](#country_list)
42
- * `/t2_airtime/countries/<country_id>/operators` [List of all operators available for a certain country](#operator_list)
43
- * `/t2_airtime/countries/<country_id>/operators/<operator_id>/products` [List of all products available for a certain operator](#product_list)
44
- * `/t2_airtime/transactions` [List all transactions](#transaction_list)
45
- * `/t2_airtime/transactions/<id>` [Show a transaction](#transaction_show)
46
-
47
- ### API Object
48
-
49
- You can access the Airtime API in Ruby as:
21
+ ## Account Attributes
22
+ - `id` (string) - Transfer-To TShop login name
23
+ - `type` (string) - `Master` (main account) or `Retailer` (subaccount)
24
+ - `name` (string) - Transfer-To TShop account name
25
+ - `currency` (string) - Account currency (USD, GBP, EUR, etc...)
26
+ - `balance` (float) - For `Master` account returns the account’s remaining balance.
27
+ For `Retailer` returns the account’s remaining limit balance of the day
28
+ if a daily limit is fixed. Else, returns the account remaining balance
29
+ - `wallet` (float) - For `Master` returns the total remaining balance (sum
30
+ of all sub-accounts and current master). For `Retailer`:
31
+ 1. If balance is shared and daily limit is fixed: returns the fixed daily limit amount
32
+ 2. If balance is shared but daily limit is not fixed: returns "No Limit"
33
+ 3. Else if balance is not shared: returns the remaining balance
34
+ - `fetchedAt` (string) - The date and time at which the information was fetched
35
+
36
+ # Country
50
37
 
51
38
  ```ruby
52
- api = T2Airtime::API.api
39
+ irb(main)> countries= T2Airtime::Country.all
40
+ irb(main)> T2Airtime::Country.serialize(countries.data)
53
41
  ```
54
42
 
55
- The following methods are available to the `api` object:
56
-
57
- * `ping` [Test the connection to the Airtime API](#ping)
58
- * `account_info` [Information regarding your TransferTo account](#account_info)
59
- * `country_list` [Retrieve available countries](#country_list)
60
- * `operator_list` [Retrieve all operators available for a certain country](#operator_list)
61
- * `product_list` [Retrieve all products available for a certain operator](#product_list)
62
- * `transaction_list` [Retrieve the list of transactions performed within a date range](#transaction_list)
63
- * `transaction_info` [Retrieve available information on a specific transaction](#transaction_info)
64
- * `topup` Recharge a destination number with a specified product.
65
- * `msisdn_info` Retrieve various information of a specific MSISDN as well as the list of all products configured for your specific account and the destination operator of the MSISDN.
66
- * `reserve_id` Reserve a transaction ID in the system. Maybe used in a topup operation.
67
- * `get_id_from_key` Retrieve the ID of a transaction previously performed based on the key used in the request at that time.
68
-
69
- Each method returns an object with the following properties:
70
-
71
- * `success?` `true` if the request was successful.
72
- * `status` The HTTP status of the reply. `200` indicates a successful request.
73
- * `error_code` The error code of the request. `0` indicates a successful request.
74
- * `error_message` The error message of the request. `Transaction successful` indicates a successful request.
75
- * `url` The full URL of the request.
76
- * `information` The response body as a hash.
77
- * `auth_key` The authorization key used in the request.
78
- * `headers` The HTTP Headers of the reply.
79
- * `raw` The raw body of the reply.
80
-
81
- <a name="ping"></a>
82
- #### Ping
83
-
84
- This method can be used for keep-alive. To test the connection with the API:
43
+ ## Country Attributes
44
+ - `id` (integer) - Country Airtime ID
45
+ - `name` (string) - The country name
46
+ - `alpha3` (string) - The alpha3 code of the country
47
+ - `callingCode` (float) - The international dialing code of the country
48
+ - `fetchedAt` (string) - The date and time at which the information was fetched
49
+
50
+ # Operator
85
51
 
86
52
  ```ruby
87
- irb(main)> response= T2Airtime::API.api.ping
88
- irb(main)> response.success?
89
- => true
53
+ irb(main)> operators= T2Airtime::Operator.all(666)
54
+ irb(main)> T2Airtime::Operator.serialize(operators.data)
90
55
  ```
91
56
 
92
- <a name="account_info"></a>
93
- #### Account Information
57
+ ## Operator Attributes
58
+ - `id` (integer) - Operator Airtime ID
59
+ - `name` (string) - The operator name
60
+ - `logo` (string) - The URL to the operator logo
61
+ - `countryId` (float) - The country Airtime ID of the operator
62
+ - `countryName` (float) - The country name
63
+ - `countryAlpha3` (float) - The country alpha3
64
+ - `fetchedAt` (string) - The date and time at which the information was fetched
94
65
 
95
- The `account_info` method retrieves the various information regarding your TransferTo account.
96
- To format the response as JSON-API you can call `T2Airtime::Account.serialize(data)`.
66
+ ## Operator Relationships
67
+ - `country.id` (integer) - Country Airtime ID
97
68
 
98
- From a Rails console (or Ruby file):
69
+ # Product
99
70
 
100
71
  ```ruby
101
- irb(main)> response= T2Airtime::API.api.account_info
102
- irb(main)> account= T2Airtime::Account.serialize(response.data)
72
+ irb(main)> products= T2Airtime::Product.all(2361)
73
+ irb(main)> T2Airtime::Product.serialize(products.data)
103
74
  ```
104
75
 
105
- The serializer returns the following JSON representation of your account:
106
-
107
- ```ruby
108
- {
109
- "type": "accounts",
110
- # Account login name
111
- "id": ACCOUNT_ID,
112
- "attributes": {
113
- # Account type: "Master" (main account) or "Retailer" (subaccount)
114
- "type": ACCOUNT_TYPE
115
- # Account login name
116
- "name": ACCOUNT_NAME,
117
- # Account currency (USD, GBP, EUR, etc…)
118
- "currency": ACCOUNT_CURRENCY,
119
- # For main account: returns the account’s remaining balance.
120
- # For sub-account: returns the account’s remaining limit balance
121
- # of the day if a daily limit is fixed. Else, returns the account
122
- # remaining balance
123
- "balance": ACCOUNT_BALANCE,
124
- # For main account: returns the total remaining balance (sum
125
- # of all sub-accounts and current master).
126
- # For sub-account:
127
- # 1. If balance is shared and daily limit is fixed: returns the fixed daily limit amount
128
- # 2. If balance is shared but daily limit is not fixed: returns "No Limit"
129
- # 3. Else if balance is not shared: returns the remaining balance
130
- "wallet": ACCOUNT_WALLET,
131
- # The time at which the information was fetched.
132
- # Can be used for caching purposes.
133
- "fetched-at": TIMESTAMP
134
- }
135
- }
136
- {{</ highlight >}}
137
-
138
- From a browser:
139
- [http://localhost:3000/account](/)
140
-
141
- ![JSON response](/img/account_json.png)
142
-
143
- <a name="country_list"></a>
144
- #### Country List
145
-
146
- The `country_list` method retrieves the countries offered in your TransferTo price list.
147
- To format the response as JSON-API you can call `T2Airtime::Country.serialize(data)`.
148
-
149
- From a Rails console (or Ruby file):
76
+ ## Product Attributes
77
+ - `id` (integer) - Product Airtime ID
78
+ - `name` (string) - The product name
79
+ - `localCurrency` (string) - The currency code of the product
80
+ - `localCurrencySymbol` (string) - The currency symbol of the product
81
+ - `currency` (string) - The curreny of your account
82
+ - `currencySymbol` (string) - The currency symbol of your account
83
+ - `localPrice` (float) - The face-value of the topup
84
+ - `retailPrice` (float) - The retail price of the product
85
+ - `wholesalePrice` (float) - The wholesale price of the product
86
+ - `countryId` (float) - The country Airtime ID of the product
87
+ - `countryName` (float) - The country name
88
+ - `countryAlpha3` (float) - The country alpha3
89
+ - `operatorId` (string) - The operator Airtime ID of the product
90
+ - `operatorName` (string) - The operator name
91
+ - `operatorLogo` (string) - The URL to the operator logo
92
+ - `fetchedAt` (string) - The date and time at which the information was fetched
93
+
94
+ ## Product Relationships
95
+ - `country.id` (integer) - Country Airtime ID
96
+ - `operator.id` (integer) - Operator Airtime ID
97
+
98
+ # Transaction
150
99
 
151
100
  ```ruby
152
- irb(main)> response= T2Airtime::API.api.country_list
153
- irb(main)> countries= T2Airtime::Country.serialize(response.data)
101
+ irb(main)> transactions= T2Airtime::API.api.transaction_list
102
+ irb(main)> T2Airtime::Transaction.serialize(transactions.data)
154
103
  ```
155
104
 
156
- The serializer returns the following JSON representation of a country:
157
-
158
105
  ```ruby
159
- {
160
- "type": "countries",
161
- # Unique Airtime ID for the country
162
- "id": COUNTRY_ID,
163
- "attributes": {
164
- # The country name
165
- "name": COUNTRY_NAME,
166
- # The ISO 3166-1 country alpha-3, https://it.wikipedia.org/wiki/ISO_3166-1_alpha-3
167
- # Can be used for unique country identification.
168
- "alpha3": COUNTRY_ALPHA3,
169
- # The time at which the country was fetched.
170
- # Can be used for caching purposes.
171
- "fetched-at": TIMESTAMP
172
- },
173
- "relationships": {
174
- "operators": { "links": { "related": "/countries/COUNTRY_ID/operators" } }
175
- }
176
- }
106
+ irb(main)> transaction= T2Airtime::Transaction.get("584171224")
107
+ irb(main)> T2Airtime::Transaction.serialize_one(transaction.data)
177
108
  ```
178
109
 
179
- The `relationships` section of the response provides a link you can use to navigate the country operators.
180
-
181
- From a browser:
182
- [http://localhost:3000/countries](/)
183
-
184
- ![JSON response](/img/country_list_json.png)
185
-
186
- <a name="operator_list"></a>
187
- #### Operator List
188
-
189
- The `operator_list` method retrieves the operators available for a certain country.
190
- To format the response as JSON-API you can call `T2Airtime::Operator.serialize(data)`.
191
-
192
- From a Rails console (or Ruby file):
110
+ ## Transaction Attributes
111
+ - `id` (integer) - Transaction Airtime ID
112
+ - `msisdn` (string) - The international phone number or name of
113
+ the user (sender) requesting to credit a phone number
114
+ - `destinationMsisdn` (string) - Destination MSISDN (usually recipient phone number)
115
+ - `transactionAuthenticationKey` (string) - Authentication key used during the transaction
116
+ - `transactionErrorCode` (string) - Error code for the transaction
117
+ - `transactionErrorTxt` (string) - Description of the error code for the transaction
118
+ - `referenceOperator` (string) - Reference of the operator (returned only if available)
119
+ - `actualProductSent` (string) - Returns the value requested to the operator
120
+ (equals to product_requested in case of successful transaction). It equals to 0 when Top-up
121
+ failed or in a simulation.
122
+ - `sms` (string) - The custom message appended to the default notification SMS sent
123
+ to the recipient
124
+ - `cid1` (string) - Value of the customized field cid1 sent in the Top-up request
125
+ - `cid2` (string) - Value of the customized field cid2 sent in the Top-up request
126
+ - `cid3` (string) - Value of the customized field cid3 sent in the Top-up request
127
+ - `date` (string) - Date of the transaction (GMT)
128
+ - `currency` (string) - Currency of the account from which the transaction is requested
129
+ - `localCurrency` (string) - Currency of the destination country
130
+ - `pinBased` (string) - Type of product returned ("Yes", default "No" if not set)
131
+ - `localInfoAmount` (string) - Final amount received by recipient. Indicative value only
132
+ - `localInfoCurrency` (string) - Local currency in destination
133
+ - `localInfoValue` (string) - Value of the transaction before tax and service fee in local currency
134
+ - `errorCode` (string) - Error code for the transaction
135
+ - `errorTxt` (string) - Description of the error code for the transaction
136
+ - `productName` (string) - The product name
137
+ - `productLocalCurrency` (string) - The currency code of the product
138
+ - `productLocalCurrencySymbol` (string) - The currency symbol of the product
139
+ - `productCurrency` (string) - The curreny of your account
140
+ - `productCurrencySymbol` (string) - The currency symbol of your account
141
+ - `productLocalPrice` (float) - The face-value of the topup
142
+ - `productRetailPrice` (float) - The retail price of the product
143
+ - `productWholesalePrice` (float) - The wholesale price of the product
144
+ - `countryId` (float) - The country Airtime ID of the product
145
+ - `countryName` (float) - The country name
146
+ - `countryAlpha3` (float) - The country alpha3
147
+ - `operatorId` (string) - The operator Airtime ID of the product
148
+ - `operatorName` (string) - The operator name
149
+ - `operatorLogo` (string) - The URL to the operator logo
150
+ - `fetchedAt` (string) - The date and time at which the information was fetched
151
+
152
+ ## Transaction Relationships
153
+ - `country.id` (integer) - Country Airtime ID
154
+ - `operator.id` (integer) - Operator Airtime ID
155
+ - `product.id` (integer) - Product Airtime ID
156
+
157
+ # Topup
193
158
 
194
159
  ```ruby
195
- irb(main)> response= T2Airtime::API.api.operator_list countries.shuffle.first["id"]
196
- irb(main)> operators= T2Airtime::Operator.serialize(response.data)
160
+ irb(main)> topup= T2Airtime::API.api.topup params
161
+ irb(main)> T2Airtime::Topup.serialize(topup.data)
197
162
  ```
198
163
 
199
- The serializer returns the following JSON representation of an operator:
164
+ ## Topup Attributes
165
+ - `balance` (string) - For main account: returns the account’s remaining
166
+ balance. For sub-account: returns the account’s remaining
167
+ limit balance of the day if a daily limit is fixed. Else,
168
+ returns the account remaining balance.
169
+ - `balanceDisplay` (string) - The `balance` value formatted in the currency of your account
170
+ - `transactionId` (integer) - Airtime ID of the transaction.
171
+ - `msisdn` (string) - The international phone number or name of
172
+ the user (sender) requesting to credit a phone number
173
+ - `destinationMsisdn` (string) - Destination MSISDN (usually recipient phone number)
174
+ - `transactionAuthenticationKey` (string) - Authentication key used during the transaction
175
+ - `transactionErrorCode` (string) - Error code for the transaction
176
+ - `transactionErrorTxt` (string) - Description of the error code for the transaction
177
+ - `referenceOperator` (string) - Reference of the operator (returned only if available)
178
+ - `actualProductSent` (string) - Returns the value requested to the operator
179
+ (equals to product_requested in case of successful transaction). It equals to 0 when Top-up
180
+ failed or in a simulation.
181
+ - `sms` (string) - The custom message appended to the default notification SMS sent
182
+ to the recipient
183
+ - `smsSent` (string) - Defines the status of the notification SMS sent to the
184
+ recipient. Returns `yes` only if the SMS has been successfully sent.
185
+ - `smsText` (string) - The custom message appended to the default
186
+ notification SMS sent to the sender.
187
+ - `cid1` (string) - Value of the customized field cid1 sent in the Top-up request
188
+ - `cid2` (string) - Value of the customized field cid2 sent in the Top-up request
189
+ - `cid3` (string) - Value of the customized field cid3 sent in the Top-up request
190
+ - `currency` (string) - Currency of the account from which the transaction is requested
191
+ - `localCurrency` (string) - Currency of the destination country
192
+ - `productName` (string) - The product name
193
+ - `productLocalCurrency` (string) - The currency code of the product
194
+ - `productLocalCurrencySymbol` (string) - The currency symbol of the product
195
+ - `productCurrency` (string) - The curreny of your account
196
+ - `productCurrencySymbol` (string) - The currency symbol of your account
197
+ - `productLocalPrice` (float) - The face-value of the topup
198
+ - `productRetailPrice` (float) - The retail price of the product
199
+ - `productWholesalePrice` (float) - The wholesale price of the product
200
+ - `countryId` (float) - The country Airtime ID of the product
201
+ - `countryName` (float) - The country name
202
+ - `countryAlpha3` (float) - The country alpha3
203
+ - `operatorId` (string) - The operator Airtime ID of the product
204
+ - `operatorName` (string) - The operator name
205
+ - `operatorLogo` (string) - The URL to the operator logo
206
+ - `executedAt` (string) - The date and time at which the information was fetched
207
+
208
+ # Msisdn
200
209
 
201
210
  ```ruby
202
- {
203
- "type": "operators",
204
- # Unique Airtime ID for the operator
205
- "id": OPERATOR_ID,
206
- "attributes": {
207
- # The operator name
208
- "name": OPERATOR_NAME,
209
- # The time at which the operator was fetched.
210
- # Can be used for caching purposes.
211
- "fetched-at": TIMESTAMP
212
- },
213
- "links": {
214
- # The URL at which you can retrieve the operator's logo
215
- logo: OPERATOR_LOGO_URL
216
- },
217
- "relationships": {
218
- "country": { "data": { "type": "countries", "id": COUNTRY_ID } },
219
- "products": { "links": { "related": "/countries/COUNTRY_ID/operators/OPERATOR_ID/products" } }
220
- },
221
- "included": [
222
- {
223
- "type": "countries",
224
- "id": COUNTRY_ID,
225
- "attributes": {
226
- "name": COUNTRY_NAME,
227
- "alpha3": COUNTRY_ALPHA3
228
- }
229
- }
230
- ]
231
- }
232
- ```
233
-
234
- * The `relationships` section of the response provides a link you can use to navigate the operator products.
235
- * The `included` section of the response provides all the information regarding the operator's country.
236
-
237
- From a browser:
238
- [http://localhost:3000/countries/COUNTRY_ID/operators](/)
239
-
240
- ![JSON response](/img/operator_list_json.png)
241
-
242
- <a name="product_list"></a>
243
- #### Product List
244
-
245
- The `product_list` method retrieves the products available for a certain operator.
246
- To format the response as JSON-API you can call `T2Airtime::Product.serialize(data)`.
211
+ irb(main)> msisdn= T2Airtime::Msisdn.info("+628123456710")
212
+ irb(main)> T2Airtime::Msisdn.serialize(msisdn.data)
213
+ ```
247
214
 
248
- From a Rails console (or Ruby file):
215
+ ## Msisdn Attributes
216
+ - `msisdn` (string) - The international mobile number
217
+ - `country` (string) - The country of the number
218
+ - `countryId` (string) - Country Airtime ID
219
+ - `operator` (string) - The operator of the number
220
+ - `operatorId` (string) - Operator Airtime ID
221
+ - `fetchedAt` (string) - The date and time at which the information was fetched
249
222
 
250
- ```ruby
251
- irb(main)> response= T2Airtime::API.api.product_list operators.shuffle.first["id"]
252
- irb(main)> products= T2Airtime::Product.serialize(response.data)
253
- ```
223
+ ## Accounts [/accounts]
224
+ Cached for 1 hour.
254
225
 
255
- The serializer returns the following JSON representation of a product:
226
+ ### Show Account [GET]
227
+ + Response 200 (application/json)
256
228
 
257
- ```ruby
258
- {
259
- "type": "products",
260
- # Airtime ID for the product. Attention! It is only unique within
261
- # the scope of the operator
262
- "id": PRODUCT_ID,
263
- "attributes": {
264
- # The product name, or face value for display, es. 5EUR
265
- "name": PRODUCT_NAME,
266
- # Currency of the destination country
267
- "currency": PRODUCT_CURRENCY,
268
- # The face value of the product (same as id)
269
- "local-price": PRODUCT_LOCAL_PRICE,
270
- # The retail price of the product
271
- "retail-price": PRODUCT_RETAIL_PRICE,
272
- # The wholesale price (also known as your cost) of the product
273
- "wholesale-price": PRODUCT_WHOLESALE_PRICE,
274
- # The time at which the operator was fetched.
275
- # Can be used for caching purposes.
276
- "fetched-at": TIMESTAMP
277
- },
278
- "relationships": {
279
- "country": { "data": { "type": "countries", "id": COUNTRY_ID } },
280
- "operator": { "data": { "type": "operators", "id": OPERATOR_ID } }
281
- },
282
- "included": [
283
229
  {
284
- "type": "countries",
285
- "id": COUNTRY_ID,
230
+ "type": "accounts",
231
+ "id": "my-t2-shop-account",
286
232
  "attributes": {
287
- "name": COUNTRY_NAME,
288
- "alpha3": COUNTRY_ALPHA3
289
- }
290
- },
291
- {
292
- "type": "operators",
293
- "id": OPERATOR_ID,
294
- "attributes": { "name": OPERATOR_NAME },
295
- "links": { "logo": OPERATOR_LOGO_URL }
233
+ "type": "Master",
234
+ "name": "my-t2-shop-account-name",
235
+ "currency": "USD",
236
+ "balance": 16.2,
237
+ "wallet": 16.2,
238
+ "fetchedAt": "2017-09-17T13:48:34Z"
239
+ }
296
240
  }
297
- ]
298
- }
299
- }
300
- ```
301
-
302
- * The `relationships` section of the response provides a link you can use to navigate the product `included` relationships.
303
- * The `included` section of the response provides all the information regarding the product's country and operator.
304
-
305
- From a browser:
306
- [http://localhost:3000/countries/COUNTRY_ID/operators/OPERATOR_ID/products](/)
307
-
308
- ![JSON response](/img/product_list_json.png)
309
-
310
- <a name="transaction_list"></a>
311
- #### Transaction List
312
-
313
- The `transaction_list` method retrieves all transaction within the specified time-range.
314
- To format the response as JSON-API you can call `T2Airtime::Transaction.serialize(data)`.
315
-
316
- From a Rails console (or Ruby file):
317
-
318
- ```ruby
319
- irb(main)> response= T2Airtime::API.api.transaction_list
320
- irb(main)> transactions= T2Airtime::Transaction.serialize(response.data)
321
- ```
322
-
323
- From a browser:
324
- [http://localhost:3000/transactions](/)
325
-
326
- ![JSON response](/img/transaction_list_json.png)
327
241
 
242
+ ## Countries [/countries]
243
+ Cached for 1 hour.
328
244
 
329
- <a name="transaction_info"></a>
330
- #### Transaction Information
245
+ ### List all Countries [GET]
331
246
 
332
- The `transaction_info` method retrieves information regarding a certain transaction.
333
- To format the response as JSON-API you can call `T2Airtime::Transaction.serialize_one(data)`.
247
+ + Response 200 (application/json)
334
248
 
335
- From a Rails console (or Ruby file):
336
-
337
- ```ruby
338
- irb(main)> response= T2Airtime::API.api.transaction_info
339
- irb(main)> transactions= T2Airtime::Transaction.serialize_one(response.data)
340
- {{</ highlight >}}
341
-
342
- The serializer returns the following JSON representation of a transaction:
249
+ [
250
+ {
251
+ "type": "countries"
252
+ "id": 661
253
+ "attributes": {
254
+ "name": "Afghanistan"
255
+ "alpha3": "AFG"
256
+ "callingCode": "93"
257
+ "fetchedAt": "2017-09-17T13:58:46Z"
258
+ }
259
+ }
260
+ ...
261
+ ]
262
+
263
+ ## Operators [/operators]
264
+
265
+ ### List all Operators [GET]
266
+ Cached for 1 hour.
267
+
268
+ + Response 200 (application/json)
269
+
270
+ [
271
+ {
272
+ "type": "operators"
273
+ "id": 2361
274
+ "attributes": {
275
+ "name": "Movicel Angola USD"
276
+ "logo": "https://operator-logo.transferto.com/logo-2361-1.png"
277
+ "countryId": 666
278
+ "countryName": "Angola"
279
+ "countryAlpha3": "AGO"
280
+ "fetchedAt": "2017-09-17T16:44:08Z"
281
+ },
282
+ "relationships": {
283
+ "country": {
284
+ "data":{
285
+ "type": "countries"
286
+ "id": 666
287
+ }
288
+ }
289
+ }
290
+ },
291
+ ...
292
+ ]
293
+
294
+ ## Products [/products]
295
+ Cached for 1 hour.
296
+
297
+ ### List all Products [GET]
298
+
299
+ + Response 200 (application/json)
300
+
301
+ [
302
+ {
303
+ "type": "products"
304
+ "id": 1
305
+ "attributes": {
306
+ "name": "$1.00"
307
+ "localCurrency": "USD"
308
+ "localCurrencySymbol": "$"
309
+ "currency": "USD"
310
+ "currencySymbol": "$"
311
+ "localPrice": 1.0
312
+ "retailPrice": 1.1
313
+ "wholesalePrice": 1.03
314
+ "countryId": 666
315
+ "countryName": "Angola"
316
+ "countryAlpha3": "AGO"
317
+ "operatorId": 2361
318
+ "operatorName": "Movicel Angola USD"
319
+ "operatorLogo": "https://operator-logo.transferto.com/logo-2361-1.png"
320
+ "fetchedAt": "2017-09-17T16:48:20Z"
321
+ },
322
+ "relationships": {
323
+ "country": {
324
+ "data": {
325
+ "type": "countries"
326
+ "id": 666
327
+ }
328
+ },
329
+ "operator": {
330
+ "data": {
331
+ "type": "operators"
332
+ "id": 2361
333
+ }
334
+ }
335
+ },
336
+ ...
337
+ ]
338
+
339
+ ## Transactions [/transactions]
340
+
341
+ ### List all Transactions [GET]
342
+
343
+ + Response 200 (application/json)
344
+
345
+ [
346
+ {
347
+ "type": "transactions"
348
+ "id": 584176053
349
+ "attributes": {
350
+ "msisdn": "+393800000000"
351
+ "destinationMsisdn": "393800000001"
352
+ "transactionAuthenticationKey": "1505553036"
353
+ "transactionErrorCode": 0
354
+ "transactionErrorTxt": "Transaction successful"
355
+ "referenceOperator": nil
356
+ "actualProductSent": "5"
357
+ "sms": nil
358
+ "smsText": "Test"
359
+ "cid1": "Cid1"
360
+ "cid2": "Cid2"
361
+ "cid3": "Cid3"
362
+ "date": "2017-09-16 09:10:39"
363
+ "currency": "USD"
364
+ "localCurrency": "EUR"
365
+ "pinBased": "no"
366
+ "localInfoAmount": "5.00"
367
+ "localInfoCurrency": "EUR"
368
+ "localInfoValue": "5.00"
369
+ "errorCode": 0
370
+ "errorTxt": "Transaction successful"
371
+ "countryId": 772
372
+ "countryName": "Italy"
373
+ "countryAlpha3": "ITA"
374
+ "operatorId": 734
375
+ "operatorName": "Wind Italy"
376
+ "operatorLogo": "https://operator-logo.transferto.com/logo-734-1.png"
377
+ "productName": "€5.00"
378
+ "productLocalCurrency": "EUR"
379
+ "productLocalCurrencySymbol": "€"
380
+ "productCurrency": "USD"
381
+ "productCurrencySymbol": "$"
382
+ "productLocalPrice": 5.0
383
+ "productRetailPrice": 7.5
384
+ "productWholesalePrice": 6.9
385
+ "fetchedAt": "2017-09-17T16:56:29Z"
386
+ },
387
+ "relationships": {
388
+ "country": {
389
+ "data": {
390
+ "type": "countries"
391
+ "id": 772
392
+ }
393
+ },
394
+ "operator": {
395
+ "data": {
396
+ "type": "operators"
397
+ "id": 734
398
+ }
399
+ },
400
+ "product": {
401
+ "data": {
402
+ "type": "products"
403
+ "id": 5
404
+ }
405
+ }
406
+ }
407
+ },
408
+ ...
409
+ ]
410
+
411
+ ### Show Transactions [GET]
412
+
413
+ + Response 200 (application/json)
414
+
415
+ {
416
+ "type": "transactions"
417
+ "id": 584176053
418
+ "attributes": {
419
+ "msisdn": "+393800000000"
420
+ "destinationMsisdn": "393800000001"
421
+ "transactionAuthenticationKey": "1505553036"
422
+ "transactionErrorCode": 0
423
+ "transactionErrorTxt": "Transaction successful"
424
+ "referenceOperator": nil
425
+ "actualProductSent": "5"
426
+ "sms": nil
427
+ "smsText": "Test"
428
+ "cid1": "Cid1"
429
+ "cid2": "Cid2"
430
+ "cid3": "Cid3"
431
+ "date": "2017-09-16 09:10:39"
432
+ "currency": "USD"
433
+ "localCurrency": "EUR"
434
+ "pinBased": "no"
435
+ "localInfoAmount": "5.00"
436
+ "localInfoCurrency": "EUR"
437
+ "localInfoValue": "5.00"
438
+ "errorCode": 0
439
+ "errorTxt": "Transaction successful"
440
+ "countryId": 772
441
+ "countryName": "Italy"
442
+ "countryAlpha3": "ITA"
443
+ "operatorId": 734
444
+ "operatorName": "Wind Italy"
445
+ "operatorLogo": "https://operator-logo.transferto.com/logo-734-1.png"
446
+ "productName": "€5.00"
447
+ "productLocalCurrency": "EUR"
448
+ "productLocalCurrencySymbol": "€"
449
+ "productCurrency": "USD"
450
+ "productCurrencySymbol": "$"
451
+ "productLocalPrice": 5.0
452
+ "productRetailPrice": 7.5
453
+ "productWholesalePrice": 6.9
454
+ "fetchedAt": "2017-09-17T16:56:29Z"
455
+ },
456
+ "relationships": {
457
+ "country": {
458
+ "data": {
459
+ "type": "countries"
460
+ "id": 772
461
+ }
462
+ },
463
+ "operator": {
464
+ "data": {
465
+ "type": "operators"
466
+ "id": 734
467
+ }
468
+ },
469
+ "product": {
470
+ "data": {
471
+ "type": "products"
472
+ "id": 5
473
+ }
474
+ }
475
+ }
476
+ }
477
+
478
+ ### Create (Reserve) Transaction [POST]
479
+
480
+ + Response 200 (application/json)
343
481
 
344
- ```ruby
345
- {
346
- type: "transactions",
347
- # Unique Airtime ID for the transaction
348
- id: TRANSACTION_ID,
349
- attributes: {
350
- # The international phone number or name of
351
- # the user (sender) requesting to credit a phone
352
- # number
353
- "msisdn": TRANSACTION_MSISDN,
354
- # Destination MSISDN (usually recipient phone number)
355
- "destination-msisdn": TRANSACTION_DESTINATION_MSISDN,
356
- # Authentication key used during the transaction
357
- "transaction-authentication-key": TRANSACTION_AUTHENTICATION_KEY,
358
- # Error code for the transaction
359
- "transaction-error-code": TRANSACTION_ERROR_CODE,
360
- # Description of the error code for the transaction
361
- "transaction-error-txt": TRANSACTION_ERROR_TEXT,
362
- # Reference of the operator (returned only if available)
363
- "reference-operator": TRANSACTION_REFERENCE_OPERATOR,
364
- # Returns the value requested to the operator
365
- # (equals to product_requested in case of successful
366
- # transaction). It equals to 0 when Top-up
367
- # failed.
368
- "actual-product-sent": TRANSACTION_PRODUCT_SENT,
369
- # Recipient SMS
370
- # Returns the custom message appended to the
371
- # default notification SMS sent to the recipient
372
- "sms": TRANSACTION_SMS,
373
- # Value of the customized field cid1 sent in the Top-up request
374
- "cid1": TRANSACTION_CID1,
375
- # Value of the customized field cid2 sent in the Top-up request
376
- "cid2": TRANSACTION_CID2,
377
- # Value of the customized field cid3 sent in the Top-up request
378
- "cid3": TRANSACTION_CID3,
379
- # Date of the transaction (GMT)
380
- "date": TRANSACTION_DATE,
381
- # Currency of the account from which the transaction is requested
382
- "originating-currency": TRANSACTION_ORIGINATING_CURRENCY,
383
- # Currency of the destination country
384
- "destination-currency": TRANSACTION_DESTINATION_CURRENCY,
385
- # Type of product returned ("Yes", default "No" if not set)
386
- "pin-based": TRANSACTION_PIN_BASED,
387
- # Final amount received by recipient. Indicative value only
388
- "local-info-amount": TRANSACTION_LOCAL_INFO_AMOUNT,
389
- # Local currency in destination
390
- "local-info-currency": TRANSACTION_LOCAL_INFO_CURRENCY,
391
- # Value of the transaction before tax and service
392
- # fee in local currency.
393
- "local-info-amount": TRANSACTION_LOCAL_INFO_AMOUNT,
394
- # The time at which the transaction was fetched.
395
- # Can be used for caching purposes.
396
- "fetched-at": TIMESTAMP
397
- },
398
- relationships: {
399
- country: { data: { type: "countries", id: COUNTRY_ID } },
400
- operator: { data: { type: "operators", id: OPERATOR_ID } },
401
- product: { data: { type: "products", id: PRODUCT_ID } }
402
- },
403
- included: [
404
- {
405
- type: "countries",
406
- id: COUNTRY_ID,
407
- attributes: {
408
- "name": COUNTRY_NAME,
409
- "alpha3": COUNTRY_ALPHA3
410
- }
411
- },
412
482
  {
413
- type: "operators",
414
- id: OPERATOR_ID,
415
- attributes: { "name": OPERATOR_NAME },
416
- links: { logo: OPERATOR_LOGO_URL }
417
- },
418
- {
419
- type: "products",
420
- id: PRODUCT_ID,
421
- attributes: {
422
- "name": PRODUCT_NAME,
423
- "currency": PRODUCT_CURRENCY,
424
- "wholesale-price": PRODUCT_WHOLESALE_PRICE,
425
- "retail-price": PRODUCT_RETAIL_PRICE,
426
- "local-price": PRODUCT_LOCAL_PRICE
427
- }
483
+ "type": "transactions"
484
+ "id": 584176053
428
485
  }
429
- ]
430
- }
431
- ```
432
-
433
- * The `relationships` section of the response provides a link you can use to navigate the product `included` relationships.
434
- * The `included` section of the response provides all the information regarding the product's country and operator.
435
-
436
- From a browser:
437
- [http://localhost:3000/transactions/TRANSACTION_ID](/)
438
-
439
- ![JSON response](/img/transaction_list_json.png)
440
-
441
- ## Testing
442
-
443
- Clone this repository and export your secrets:
444
-
445
- $> export T2_SHOP_USER=
446
- $> export T2_AIRTIME_KEY=
447
-
448
- Execute:
449
-
450
- rake
486
+
487
+ ## Number Information [/msisdn_info]
488
+ Cached for 24 hours.
451
489
 
452
- To execute the test application:
490
+ ### Show Number Information [GET]
453
491
 
454
- cd spec/dummy
492
+ + Response 200 (application/json)
455
493
 
456
- Start the server: `puma -C config/puma.rb`
494
+ {
495
+ "type": "msisdn"
496
+ "msisdn": "628123456710"
497
+ "country": "Indonesia"
498
+ "countryId": "767"
499
+ "operator": "AAA-TESTING Indonesia USD"
500
+ "operatorId": "1562"
501
+ "fetchedAt": "2017-09-17T17:05:08Z"
502
+ }
457
503
 
458
- ## Contributing
504
+ ## Topup [/topup]
459
505
 
460
- Bug reports and pull requests are welcome on GitHub at https://github.com/matteolc/t2_airtime.
506
+ ### Create Topup [POST]
461
507
 
462
- ## License
508
+ + Response 200 (application/json)
463
509
 
464
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
510
+ {
511
+ "type": "msisdn"
512
+ "msisdn": "628123456710"
513
+ "country": "Indonesia"
514
+ "countryId": "767"
515
+ "operator": "AAA-TESTING Indonesia USD"
516
+ "operatorId": "1562"
517
+ "fetchedAt": "2017-09-17T17:05:08Z"
518
+ }