android_in_app_billing 0.1.0 → 0.2.0
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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97580ae696924c35d2fac3368163abaf34205584
|
4
|
+
data.tar.gz: 1023ecc30ac9f98f00033b075a29348246c37b12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4180326a9dd7526e1007b2bee7020bf90dd13af44639699a4df918bca48440cc7b755c086274eefe617a88ac28179f4513140b90f203619312999207853b7eb6
|
7
|
+
data.tar.gz: 4c26867335b907c2ccd70225750288301b1dde536c7587f47e82e114dbf59c3b4ff6e5d8deabf2cc0a3b7b13d85bd7b7870a971f3035cf291b5b9ced0908eea7
|
data/README.md
CHANGED
@@ -59,6 +59,27 @@ subscription.expires_at # => some DateTime
|
|
59
59
|
# ... (other attributes, see `AndroidInAppBilling::SubscriptionPurchase` and the link above)
|
60
60
|
```
|
61
61
|
|
62
|
+
## Testing
|
63
|
+
|
64
|
+
This gem provides a factory to generate raw purchase data+signature, which you can use in your tests:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
require 'android_in_app_billing/testing'
|
68
|
+
|
69
|
+
# See lib/factories/raw_inapp_purchase.rb for the list of attributes
|
70
|
+
raw = build(:android_in_app_billing_raw_inapp_purchase)
|
71
|
+
# => { data: "...", signature: "..." }
|
72
|
+
|
73
|
+
# Factory signs purchase data using AndroidInAppBilling::Testing::PRIVATE_KEY.
|
74
|
+
# If you want to verify this signature, you should configure AndroidInAppBilling
|
75
|
+
# to use correspondent public key
|
76
|
+
AndroidInAppBilling.config.package_public_key = AndroidInAppBilling::Testing::PUBLIC_KEY
|
77
|
+
|
78
|
+
# Then signature verification will pass
|
79
|
+
inapp = AndroidInAppBilling::InAppPurchase.new(raw)
|
80
|
+
inapp.signature_valid? # => true
|
81
|
+
```
|
82
|
+
|
62
83
|
## Development
|
63
84
|
|
64
85
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -67,10 +88,10 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
67
88
|
|
68
89
|
## Contributing
|
69
90
|
|
70
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
91
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/SPBTV/android_in_app_billing.
|
71
92
|
|
72
93
|
|
73
94
|
## License
|
74
95
|
|
75
|
-
The gem is available as open source under the terms of the [
|
96
|
+
The gem is available as open source under the terms of the [Apache 2.0 License](https://opensource.org/licenses/Apache-2.0).
|
76
97
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module AndroidInAppBilling
|
3
|
+
module Testing
|
4
|
+
# Both public and private keys were generated using this code:
|
5
|
+
#
|
6
|
+
# require 'openssl'
|
7
|
+
#
|
8
|
+
# key = OpenSSL::PKey::RSA.new(2048)
|
9
|
+
#
|
10
|
+
# key.public_key.to_pem # => public key
|
11
|
+
# key.to_pem # => private key
|
12
|
+
PUBLIC_KEY = <<-KEY.gsub(/^\s*/, '')
|
13
|
+
-----BEGIN PUBLIC KEY-----
|
14
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0VZoxr2Z4Z55PR9DnBEl
|
15
|
+
xNneoXvBEofqT0lstG/TKLaNdIGnyZASO0cupb1U08H/2qGIRFznSCJyW4H69Qsv
|
16
|
+
FLQQCPy7mitA9HPK5FQ9/7//lwNBvZkxPaNGNbjpX2/nolQUjLJ8Mz088vfVBvf/
|
17
|
+
WaabsjkIWtKIQgRWJU/Xa/Hbj8v5YcC500B4KiyMSKwKaOPylcQW3fX5w2f+JZbh
|
18
|
+
krmqK+yQimvny07e/g6bS5BeJwmA9NG5PxGtM1ifgTK9ahypUkr6zb6Fy22POepO
|
19
|
+
4PfXEIaE9rHrMkVE7A48SrSaB1yR0vubxp98oLLgFcpFYip+YFcuVqWGam13187a
|
20
|
+
5wIDAQAB
|
21
|
+
-----END PUBLIC KEY-----
|
22
|
+
KEY
|
23
|
+
|
24
|
+
# Is used only for purchase data signing
|
25
|
+
PRIVATE_KEY = <<-KEY.gsub(/^\s*/, '')
|
26
|
+
-----BEGIN RSA PRIVATE KEY-----
|
27
|
+
MIIEowIBAAKCAQEA0VZoxr2Z4Z55PR9DnBElxNneoXvBEofqT0lstG/TKLaNdIGn
|
28
|
+
yZASO0cupb1U08H/2qGIRFznSCJyW4H69QsvFLQQCPy7mitA9HPK5FQ9/7//lwNB
|
29
|
+
vZkxPaNGNbjpX2/nolQUjLJ8Mz088vfVBvf/WaabsjkIWtKIQgRWJU/Xa/Hbj8v5
|
30
|
+
YcC500B4KiyMSKwKaOPylcQW3fX5w2f+JZbhkrmqK+yQimvny07e/g6bS5BeJwmA
|
31
|
+
9NG5PxGtM1ifgTK9ahypUkr6zb6Fy22POepO4PfXEIaE9rHrMkVE7A48SrSaB1yR
|
32
|
+
0vubxp98oLLgFcpFYip+YFcuVqWGam13187a5wIDAQABAoIBAQC9/YaqmXoH4yR1
|
33
|
+
7OIXyxhUSMheF0tr3h8yRpl6SeODl+taSjJWJYPmePxFQEi0x+XGL8TVBtyCA4F2
|
34
|
+
u8lgjP319FZ5UaeSjJ8vPchu4mZCr6bxD+uigF7Ial9WcrScAZxhH55m87b1aibe
|
35
|
+
/T9CS+JdI3E7l7eVdm5kPDtTMdt6Ayu/JIdPARdgOvh3Ez82I3ZO8HtgQ6bVD8J4
|
36
|
+
x/UJSyqQkGuWi+pOaz3bWao/DlfilLhySov430xEWoH5FmOIgxqdVb3Lb0HlCFiQ
|
37
|
+
2L9lsCyLZQplf1SQLbF+LDEg/l4cWVwWPBcCg5Gy/dXj3a3KQyowiZcnKPAGW+2o
|
38
|
+
ZAcRjc9BAoGBAO2+1M/I918Os3IDQEuza+63N6YsgpKNdqBDokGuNpJz6pnefRFY
|
39
|
+
6a5HKmCds/3YDhqijXNrMUWN9LRW7pQaxVZgnmo2hO/uYpgP+CaLX+FTc5gKB8RU
|
40
|
+
Ujp4YvnBomSzGIBpUR8j/ioVKGfXKdagJFnTUHBUsLn5ktaYj8pjnyM9AoGBAOFp
|
41
|
+
L+DTzQLkbLCLweianDp3NpD++CWOIucC4MZGI1BYBYROti55sCwyePcOeQXYIgxl
|
42
|
+
hH8CiXa9lS4299lXUVPA4ATp7dtoNzNHfKN2qOzDQfl/K8NbQzVFjI/EDs+655KT
|
43
|
+
68hbEZpdAY/WxrJzZ+yBlEwoOmlHkhEjxZPhqIjzAoGAEH3GQUuNbTiV1fjHwviF
|
44
|
+
Kh/nak14GTZa3i8S2D9/ZZVI1reKMWPbgc1J8T2/OIJ+J/bSnQj4d/yq1r+Y+QkK
|
45
|
+
Wz2Ef5WcjxAYIrgo3HOaiQTC5e78LvAya//hzbVS0G1j67Rifih+/uhMzzcrncmp
|
46
|
+
+9keoUwenifjuaMHhmB2r3kCgYAP69MS6ULgwmue6LAwksMYKhVzll7GoEx8zqo7
|
47
|
+
tvaFlUIGf1zE2ZmE9aevo5kOvZ5iC8WZBv/YoDlqQz2sX0uCQ+xOzIsdZTYI7DK0
|
48
|
+
hQwXdQ8y5TWdHdQYbiooeWumZog2xTXxN+V9ZrZWh5APSLF9dgWYf3rotsJtbX5m
|
49
|
+
HJk/2wKBgG8NCzqi/INQNdDBsSDPdi1oU2nvI/eQfGcnvyvuDHmd3nd/GrPkHUHn
|
50
|
+
suAxetCm2u/Q0B+V+5szG3UyF/AIiKoYdBf2fwnAxEyRebQFCisGxzb6izxM/z6V
|
51
|
+
8NweZnhm8CMgaka6W+IjKu2OB3CeqIPDzKo+GY5ArdEcsgjtuo9n
|
52
|
+
-----END RSA PRIVATE KEY-----
|
53
|
+
KEY
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
FactoryGirl.define do
|
3
|
+
factory :android_in_app_billing_raw_inapp_purchase, class: Hash do
|
4
|
+
package_name 'com.spbtv.android.rspec'
|
5
|
+
product_id 'test_subscription'
|
6
|
+
purchase_time { (Date.today - 1) }
|
7
|
+
purchase_state 0
|
8
|
+
developer_payload ''
|
9
|
+
purchase_token 'kicgkmmieakfkgfnkclldoao.AO-J1OyAN-PCXHeriJ7W99KLeA_hZhqOZS3vnA9a5Mo1fyFhg4iF61FMVOfCq8B9Jc5tzknR-Et58T79LsdIEWH2vBHOkSHJDOBTnknZgaSuhKjoGXq33M2VQxbQaz_KrQLRAZGPn7-gxQXcqaxvorNj4c2Q_1jaA'
|
10
|
+
auto_renewing true
|
11
|
+
order_id 'GPA.1234-5678-9012-34567'
|
12
|
+
|
13
|
+
trait :cancelled do
|
14
|
+
purchase_state 1
|
15
|
+
auto_renewing false
|
16
|
+
end
|
17
|
+
|
18
|
+
# After successfull in-app purchase, clients send us purchase data and
|
19
|
+
# it's signature. Data is a json string. Signature is base64-encoded.
|
20
|
+
#
|
21
|
+
initialize_with do
|
22
|
+
data = attributes
|
23
|
+
|
24
|
+
# Google uses milliseconds since the epoch as timestamps
|
25
|
+
data[:purchase_time] = data[:purchase_time].strftime('%s%3N')
|
26
|
+
|
27
|
+
# Google uses lowerCamelCase for data field names
|
28
|
+
to_lower_camelcase = Proc.new do |str|
|
29
|
+
str.split('_').map.with_index { |part, i| i == 0 ? part : part.capitalize }.join
|
30
|
+
end
|
31
|
+
data = data.map { |k, v| [to_lower_camelcase.call(k.to_s), v] }.to_h
|
32
|
+
|
33
|
+
data_json = data.to_json
|
34
|
+
|
35
|
+
# Google uses SHA1 when signing data
|
36
|
+
private_key = OpenSSL::PKey::RSA.new(AndroidInAppBilling::Testing::PRIVATE_KEY)
|
37
|
+
signature = private_key.sign(OpenSSL::Digest::SHA1.new, data_json)
|
38
|
+
# And then encodes signature using base64
|
39
|
+
base64_encoded_signature = Base64.encode64(signature).delete("\n")
|
40
|
+
|
41
|
+
{ data: data_json, signature: base64_encoded_signature }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: android_in_app_billing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dkrasnov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-api-client
|
@@ -159,6 +159,9 @@ files:
|
|
159
159
|
- lib/android_in_app_billing/publisher_client/client_builder.rb
|
160
160
|
- lib/android_in_app_billing/signature_verifier.rb
|
161
161
|
- lib/android_in_app_billing/subscription_purchase.rb
|
162
|
+
- lib/android_in_app_billing/testing.rb
|
163
|
+
- lib/android_in_app_billing/testing/constants.rb
|
164
|
+
- lib/android_in_app_billing/testing/factories.rb
|
162
165
|
- lib/android_in_app_billing/version.rb
|
163
166
|
homepage: https://github.com/SPBTV/android_in_app_billing
|
164
167
|
licenses:
|