yellow-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +63 -0
- data/lib/yellow-sdk/client.rb +105 -0
- data/lib/yellow-sdk.rb +6 -0
- metadata +50 -0
data/README.md
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
Yellow Python SDK
|
2
|
+
=====================
|
3
|
+
This is the Yellow Ruby SDK. This simple SDK contains couple of Ruby methods that makes it easy to integrate with the Yellow API. To get started just:
|
4
|
+
```
|
5
|
+
pip install yellow-sdk-python
|
6
|
+
```
|
7
|
+
|
8
|
+
Examples
|
9
|
+
---------
|
10
|
+
```
|
11
|
+
import json
|
12
|
+
import yellow
|
13
|
+
|
14
|
+
|
15
|
+
# You can get your api key/secret from your merchant dashboard.
|
16
|
+
|
17
|
+
api_key = "YOUR_API_KEY" # store it in environment variable for better security
|
18
|
+
api_secret = "YOUR_API_SECRET" # store it in environment variable for better security
|
19
|
+
base_ccy = "USD" # Required: A 3-letter currency code
|
20
|
+
base_price = "0.05" # Required: The invoice price in the above currency
|
21
|
+
callback = "https://example.com" # Optional: URL for Yellow to POST to as a callback
|
22
|
+
|
23
|
+
created_invoice = yellow.create_invoice(api_key, api_secret, base_ccy, base_price, callback)
|
24
|
+
|
25
|
+
# Print the result beautifully!
|
26
|
+
print json.dumps(created_invoice.json(), sort_keys=True, indent=4)
|
27
|
+
```
|
28
|
+
You should see something similar to the following in your terminal:
|
29
|
+
```
|
30
|
+
{
|
31
|
+
"address": "155xsayoDXxRFP9rxDoecmpVUo7y5xKtc7", # Invoice Address
|
32
|
+
"base_ccy": "USD",
|
33
|
+
"base_price": "0.05",
|
34
|
+
"callback": "https://example.com",
|
35
|
+
"expiration": "2015-03-10T18:17:51.248Z", # Each invoice expires after 10 minutes of creation
|
36
|
+
"id": "6dd264975861fddbfe4404ed995f1ca4", # Invoice ID (to query the invoice later if you need to!)
|
37
|
+
"invoice_ccy": "BTC",
|
38
|
+
"invoice_price": "0.00017070",
|
39
|
+
"received": "0",
|
40
|
+
"redirect": null,
|
41
|
+
"remaining": "0.00017070",
|
42
|
+
"server_time": "2015-03-10T18:07:51.454Z",
|
43
|
+
"status": "new", # Status of the invoice. Other values are "authorizing" for unconfirmed transactions, and "paid" for confirmed transactions
|
44
|
+
"url": "https://cdn.yellowpay.co/invoice.5f0d082e.html?invoiceId=6dd264975861fddbfe4404ed995f1ca4" # Direct URL for the invoice. You can use it to embed the invoice widget in an iframe on your website.
|
45
|
+
}
|
46
|
+
|
47
|
+
```
|
48
|
+
To query an invoice that you created, just pass in the `invoice_id` to the `query_invoice` function:
|
49
|
+
```
|
50
|
+
invoice_id = "..." # invoice ID you received when you created the invoice.
|
51
|
+
invoice = yellow.query_invoice(api_key, api_secret, invoice_id)
|
52
|
+
print json.dumps(invoice.json(), sort_keys=True, indent=4)
|
53
|
+
```
|
54
|
+
You should see exactly the same returned data you got from `create_invoice` above!
|
55
|
+
|
56
|
+
Verifying Yellow POST requests
|
57
|
+
---------------------------
|
58
|
+
To verify that the request you just receive really is from us, we created a helper function that checks the signature of the request. Just pass in your api_secret, the callback URL you passed when you created the invoice, and the request object.
|
59
|
+
|
60
|
+
This function will return True if the signature matches (verified), or False if it doesn't match (not verified).
|
61
|
+
```
|
62
|
+
is_verified = yellow.verify_ipn(api_secret, host_url, request)
|
63
|
+
```
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Yellow
|
2
|
+
|
3
|
+
VERSION = "0.0.1"
|
4
|
+
YELLOW_SERVER = "https://" + (ENV["YELLOW_SERVER"] || "api.yellowpay.co")
|
5
|
+
|
6
|
+
class YellowApiError < Exception ; end
|
7
|
+
|
8
|
+
class Client
|
9
|
+
def initialize(api_key, api_secret)
|
10
|
+
@api_key = api_key
|
11
|
+
@api_secret = api_secret
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_invoice(hash={})
|
15
|
+
####
|
16
|
+
# This method creates a yellow invoices based on the following options:
|
17
|
+
#
|
18
|
+
# #param hash hash hash keys matching the expected
|
19
|
+
# HTTP arguments described here:
|
20
|
+
# http://yellowpay.co/docs/api/#creating-invoices
|
21
|
+
# #returns JSON parsed data
|
22
|
+
####
|
23
|
+
|
24
|
+
endpoint = "/v1/invoice/"
|
25
|
+
|
26
|
+
make_request('POST', endpoint, hash.to_json)
|
27
|
+
end
|
28
|
+
|
29
|
+
def query_invoice(invoice_id)
|
30
|
+
####
|
31
|
+
# Use this method to query an invoice you created earlier using its ID
|
32
|
+
#
|
33
|
+
# #param str invoice_id the ID of the invoice you're querying
|
34
|
+
#
|
35
|
+
# #returns JSON parsed data
|
36
|
+
####
|
37
|
+
|
38
|
+
endpoint = "/v1/invoice/#{invoice_id}/"
|
39
|
+
make_request('GET', endpoint, "")
|
40
|
+
end
|
41
|
+
|
42
|
+
def verify_ipn(host_url, request_signature, request_nonce, request_body)
|
43
|
+
####
|
44
|
+
# This is a helper method to verify that the request you just received really is from Yellow:
|
45
|
+
#
|
46
|
+
# #param str host_url the callback URL you set when you created the invoice
|
47
|
+
# #param str request_signature the signature header of the request
|
48
|
+
# #param str request_nonce the nonce header of the request
|
49
|
+
# #param str request_body the body of the request
|
50
|
+
#
|
51
|
+
# #returns boolean
|
52
|
+
####
|
53
|
+
|
54
|
+
signature = get_signature(host_url, request_body, request_nonce, @api_secret)
|
55
|
+
signature == request_signature ? return true : return false
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def make_request(method, endpoint, body)
|
60
|
+
####
|
61
|
+
# A method used by our SDK to make requests to our server.
|
62
|
+
####
|
63
|
+
|
64
|
+
url = YELLOW_SERVER + endpoint
|
65
|
+
|
66
|
+
nonce = Time.now.to_i * 1000
|
67
|
+
signature = get_signature(url, body, nonce, @api_secret)
|
68
|
+
|
69
|
+
uri = URI.parse(YELLOW_SERVER)
|
70
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
71
|
+
http.use_ssl = true
|
72
|
+
|
73
|
+
if method == 'GET'
|
74
|
+
request = Net::HTTP::Get.new(endpoint)
|
75
|
+
elsif method == 'POST'
|
76
|
+
request = Net::HTTP::Post.new(endpoint)
|
77
|
+
end
|
78
|
+
|
79
|
+
request.add_field('Content-Type', 'application/json')
|
80
|
+
request.add_field('API-Key', @api_key)
|
81
|
+
request.add_field('API-Nonce', nonce)
|
82
|
+
request.add_field('API-Sign', signature)
|
83
|
+
request.add_field('API-Platform', "#{RUBY_PLATFORM} - Ruby #{RUBY_VERSION}")
|
84
|
+
request.add_field('API-Version', VERSION)
|
85
|
+
request.body = body
|
86
|
+
response = http.request(request)
|
87
|
+
|
88
|
+
if response.code == '200'
|
89
|
+
return JSON.parse(response.body)
|
90
|
+
else
|
91
|
+
raise YellowApiError.new(response.body)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
def get_signature(url, body, nonce, api_secret)
|
97
|
+
####
|
98
|
+
# A tiny method used by our SDK to sign and verify requests.
|
99
|
+
####
|
100
|
+
|
101
|
+
message = nonce.to_s + url + body
|
102
|
+
hash = OpenSSL::HMAC.hexdigest('sha256', api_secret, message)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/lib/yellow-sdk.rb
ADDED
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yellow-sdk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Eslam A. Hefnawy
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-04-29 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Yellow SDK. A ruby module to easily integrate with the Yellow bitcoin
|
15
|
+
payments API.
|
16
|
+
email: eslam@yellowpay.co
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/yellow-sdk.rb
|
22
|
+
- lib/yellow-sdk/client.rb
|
23
|
+
- README.md
|
24
|
+
homepage: http://yellowpay.co
|
25
|
+
licenses:
|
26
|
+
- Apache 2.0
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
none: false
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 1.8.23
|
46
|
+
signing_key:
|
47
|
+
specification_version: 3
|
48
|
+
summary: Yellow SDK. A ruby module to easily integrate with the Yellow bitcoin payments
|
49
|
+
API.
|
50
|
+
test_files: []
|