unified_iap 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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +101 -0
- data/Rakefile +2 -0
- data/lib/unified_iap.rb +26 -0
- data/lib/unified_iap/amazon_client.rb +38 -0
- data/lib/unified_iap/amazon_exceptions.rb +12 -0
- data/lib/unified_iap/amazon_result.rb +31 -0
- data/lib/unified_iap/android_amazon_iap.rb +16 -0
- data/lib/unified_iap/googleplay_iap.rb +49 -0
- data/lib/unified_iap/ios_iap.rb +7 -0
- data/lib/unified_iap/version.rb +3 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/unifedplatform_spec.rb +47 -0
- data/unified_iap.gemspec +27 -0
- metadata +133 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1c66dce7100e7c74bce2dc3ff4fe21a83347f5c5
|
4
|
+
data.tar.gz: d00f1df12528a98ecf001a0b464ddc1f3a62184e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c5c2b8e2fc829a9a8cded651bb763329b17e80795acfc1e7f19ea1dbf5a3d1b7a0d0c2d5ffb7c5239d1fd45eba9682d1bf2f263a153d86abb8653419e3b5468f
|
7
|
+
data.tar.gz: 10350ccd5afbbff5a02677c6c3f1ad8a0f4cef7fc7afd241f5aeea0febd4c20e62b943cfcedfffdfa5e55670478526d707217a18c07462a5ac5385ecab41390c
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Ailenswpu
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# UnifiedIap
|
2
|
+
|
3
|
+
UnifiedIap is for mobile game or app developer to verify the accuracy if inapppurchase to prevent hacker. UnifiedIap the main platform:
|
4
|
+
|
5
|
+
* iOS
|
6
|
+
* Googleplay
|
7
|
+
* Amazon
|
8
|
+
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'unified_iap'
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install unified_iap
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
### 1.Android Gooleplay
|
29
|
+
If you apps or games are published to googleplay, see [gp-purchase-status-api](https://developer.android.com/google/play/billing/gp-purchase-status-api.html), to get your `service_account_email`,`p12 key_file` .
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
googleplay_account_secret_params = {
|
33
|
+
api_version: 'v1.1',
|
34
|
+
service_account_email: 'REPLACE YOUR SERVICE ACCOUNT EMAIL',
|
35
|
+
key_file: "PATH TO YOUR p12 File",
|
36
|
+
key_secret: 'notasecret',
|
37
|
+
scope_url: 'https://www.googleapis.com/auth/androidpublisher',
|
38
|
+
token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
|
39
|
+
audience: 'https://accounts.google.com/o/oauth2/token',
|
40
|
+
person: 'YOUR GOOGLEPLAY ACCOUNT EMAIL',
|
41
|
+
}
|
42
|
+
#do not forget replace service_account_email, key_file, person with your own information.
|
43
|
+
|
44
|
+
googleplay_callback_info = {
|
45
|
+
package_name: 'com.bbg.dw.ww1',
|
46
|
+
product_id: 'com.bbg.dw.ww1.60000',
|
47
|
+
purchase_token: "dmkgpgikajliabogedjojdak.AO-J1OzEhpio5zq-F-LzuYEMsryAopNT4sdEIUBnSfOja4jgbfAMyOkCtquULWGqKRT_VEnL2V9oCh-cBBPbJp1amuh5CKDzHeVAJFe_VjjvdgngeT8rWRN98SqzOSXCRCWGZSu6KpTR"
|
48
|
+
}
|
49
|
+
|
50
|
+
# you can get package_name, product_id, purchase_token from your mobile app googleplay response when you purchase success.
|
51
|
+
|
52
|
+
UnifiedIap.verify("ANDROID_GP", googleplay_account_secret_params, googleplay_callback_info)
|
53
|
+
|
54
|
+
#make sure the constant `ANDROID_GP`.
|
55
|
+
```
|
56
|
+
The example return of valid iap order
|
57
|
+
```ruby
|
58
|
+
<Google::APIClient::Schema::Androidpublisher::V1_1::InappPurchase:0x3fd7bc6649b8 DATA:{"kind"=>"androidpublisher#inappPurchase", "purchaseTime"=>"1428479533509", "purchaseState"=>1, "consumptionState"=>1, "developerPayload"=>""}>
|
59
|
+
```
|
60
|
+
|
61
|
+
The example return of invalid iap order
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
<Google::APIClient::Schema::Androidpublisher::V1_1::InappPurchase:0x3fd7bc938f40 DATA:{"error"=>{"errors"=>[{"domain"=>"global", "reason"=>"applicationNotFound", "message"=>"No application was found for the given package name.", "locationType"=>"parameter", "location"=>"packageName"}], "code"=>404, "message"=>"No application was found for the given package name."}}>
|
65
|
+
```
|
66
|
+
|
67
|
+
### 2. iOS
|
68
|
+
if your apps or games published to AppStore, you only need the response from appstore of user orders.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
ios_iap_response = {
|
72
|
+
receipt: 'IOS RECEIPT OF IAP'
|
73
|
+
}
|
74
|
+
|
75
|
+
UnifiedIap.verify("IOS", nil, ios_iap_response)
|
76
|
+
```
|
77
|
+
|
78
|
+
### 3. Amazon
|
79
|
+
|
80
|
+
if your apps or games published to AmazonStore.you need your [secretkey](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html)
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
amazon_secret = "REPLACE AMAZON SECRET"
|
84
|
+
|
85
|
+
amazon_iap_params = {
|
86
|
+
amazon_user_id:"REPLACE USER ID",
|
87
|
+
purchase_token: "REPLACE PURCHASE TOKEN"
|
88
|
+
}
|
89
|
+
|
90
|
+
UnifiedIap.verify("AMAZON", amazon_secret, amazon_iap_params)
|
91
|
+
|
92
|
+
|
93
|
+
```
|
94
|
+
|
95
|
+
## Contributing
|
96
|
+
|
97
|
+
1. Fork it ( https://github.com/Ailenswpu/unified_iap/fork )
|
98
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
99
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
100
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
101
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/lib/unified_iap.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "unified_iap/version"
|
2
|
+
require "unified_iap/googleplay_iap"
|
3
|
+
require "unified_iap/android_amazon_iap"
|
4
|
+
require "unified_iap/ios_iap"
|
5
|
+
require "unified_iap/amazon_client"
|
6
|
+
require "unified_iap/amazon_result"
|
7
|
+
require "unified_iap/amazon_exceptions"
|
8
|
+
require "google/api_client"
|
9
|
+
require "venice"
|
10
|
+
|
11
|
+
module UnifiedIap
|
12
|
+
class UnsupportPlatformException < Exception;end
|
13
|
+
|
14
|
+
def self.verify(platform, platform_account_secret, iap_params)
|
15
|
+
raise "must provide platform" unless platform
|
16
|
+
if platform == "IOS"
|
17
|
+
IosIap.new.verify(iap_params)
|
18
|
+
elsif platform == "ANDROID_GP"
|
19
|
+
GoogleplayIap.new(platform_account_secret).verify(iap_params)
|
20
|
+
elsif platform == "AMAZON"
|
21
|
+
AndroidAmazonIap.new(platform_account_secret).verify(iap_params)
|
22
|
+
else
|
23
|
+
raise UnsupportPlatformException
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module UnifiedIap
|
2
|
+
class AmazonClient
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
PRODUCTION_HOST = 'https://appstore-sdk.amazon.com'
|
7
|
+
|
8
|
+
def initialize(developer_secret, host=nil)
|
9
|
+
@developer_secret = developer_secret
|
10
|
+
@host = host || PRODUCTION_HOST
|
11
|
+
end
|
12
|
+
|
13
|
+
def verify(user_id, purchase_token, renew_on_failure=true)
|
14
|
+
begin
|
15
|
+
process :verify, user_id, purchase_token
|
16
|
+
rescue UnifiedIap::AmazonExceptions::ExpiredCredentials => e
|
17
|
+
raise e unless renew_on_failure
|
18
|
+
|
19
|
+
renewal = renew(user_id, purchase_token)
|
20
|
+
verify(user_id, renewal.purchase_token, false)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def renew(user_id, purchase_token)
|
25
|
+
process :renew, user_id, purchase_token
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def process(path, user_id, purchase_token)
|
31
|
+
path = "/version/2.0/#{path}/developer/#{@developer_secret}/user/#{user_id}/purchaseToken/#{purchase_token}"
|
32
|
+
uri = URI.parse "#{@host}#{path}"
|
33
|
+
req = Net::HTTP::Get.new uri.request_uri
|
34
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') { |http| http.request req }
|
35
|
+
UnifiedIap::AmazonResult.new res
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module UnifiedIap
|
2
|
+
module AmazonExceptions
|
3
|
+
class Exception < Exception; end
|
4
|
+
class InvalidTransaction < UnifiedIap::AmazonExceptions::Exception; end
|
5
|
+
class InvalidSharedSecret < UnifiedIap::AmazonExceptions::Exception; end
|
6
|
+
class InvalidUserId < UnifiedIap::AmazonExceptions::Exception; end
|
7
|
+
class InvalidPurchaseToken < UnifiedIap::AmazonExceptions::Exception; end
|
8
|
+
class ExpiredCredentials < UnifiedIap::AmazonExceptions::Exception; end
|
9
|
+
class InternalError < UnifiedIap::AmazonExceptions::Exception; end
|
10
|
+
class General < UnifiedIap::AmazonExceptions::Exception; end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module UnifiedIap
|
2
|
+
class AmazonResult
|
3
|
+
attr_accessor :item_type, :sku, :start_date, :start_time, :end_date, :end_time, :purchase_token
|
4
|
+
|
5
|
+
def initialize(response)
|
6
|
+
case response.code.to_i
|
7
|
+
when 200
|
8
|
+
parsed = JSON.parse(response.body)
|
9
|
+
|
10
|
+
if parsed.has_key? 'startDate'
|
11
|
+
parsed['startTime'] = parsed['startDate'].nil? ? nil : Time.at(parsed['startDate'] / 1000)
|
12
|
+
end
|
13
|
+
if parsed.has_key? 'endDate'
|
14
|
+
parsed['endTime'] = parsed['endDate'].nil? ? nil : Time.at(parsed['endDate'] / 1000)
|
15
|
+
end
|
16
|
+
|
17
|
+
parsed.each do |key, value|
|
18
|
+
underscore = key.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').tr('-', '_').downcase
|
19
|
+
send "#{underscore}=", value
|
20
|
+
end
|
21
|
+
when 400 then raise UnifiedIap::AmazonExceptions::InvalidTransaction
|
22
|
+
when 496 then raise UnifiedIap::AmazonExceptions::InvalidSharedSecret
|
23
|
+
when 497 then raise UnifiedIap::AmazonExceptions::InvalidUserId
|
24
|
+
when 498 then raise UnifiedIap::AmazonExceptions::InvalidPurchaseToken
|
25
|
+
when 499 then raise UnifiedIap::AmazonExceptions::ExpiredCredentials
|
26
|
+
when 500 then raise UnifiedIap::AmazonExceptions::InternalError
|
27
|
+
else raise UnifiedIap::AmazonExceptions::General
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module UnifiedIap
|
2
|
+
class AndroidAmazonIap
|
3
|
+
def initialize(amazon_secret_key)
|
4
|
+
raise "amazon_secret_key must exsist" unless amazon_secret_key
|
5
|
+
@client ||= UnifiedIap::AmazonClient.new amazon_secret_key#, "http://localhost:8080/RVSSandbox"
|
6
|
+
end
|
7
|
+
|
8
|
+
def verify(amazon_iap_params = {})
|
9
|
+
begin
|
10
|
+
@client.verify amazon_iap_params[:amazon_user_id], amazon_iap_params[:purchase_token]
|
11
|
+
rescue UnifiedIap::AmazonExceptions::Exception => e
|
12
|
+
raise e
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module UnifiedIap
|
2
|
+
|
3
|
+
class NoApiVersionException < Exception;end
|
4
|
+
class NoServiceAccountEmailException < Exception;end
|
5
|
+
class NoKeyFileException < Exception;end
|
6
|
+
class NoDeveloperEmailException < Exception;end
|
7
|
+
|
8
|
+
class GoogleplayIap
|
9
|
+
def verify(googleplay_iap_params = {})
|
10
|
+
publisher = client.discovered_api('androidpublisher', 'v1.1')
|
11
|
+
client.execute(
|
12
|
+
api_method: publisher.inapppurchases.get,
|
13
|
+
parameters: { packageName: googleplay_iap_params[:package_name],
|
14
|
+
productId: googleplay_iap_params[:product_id],
|
15
|
+
token: googleplay_iap_params[:purchase_token]}).data
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(params = {})
|
19
|
+
@api_version = params[:api_version] || (raise NoApiVersionException)
|
20
|
+
@service_account_email = params[:service_account_email] || (raise NoServiceAccountEmailException)
|
21
|
+
@key_file = params[:key_file] || (raise NoKeyFileException)
|
22
|
+
@key_secret = params[:key_secret] || 'notasecret'
|
23
|
+
@scope_url = params[:scope_url] || 'https://www.googleapis.com/auth/androidpublisher'
|
24
|
+
@token_credential_uri = params[:token_credential_uri] || 'https://accounts.google.com/o/oauth2/token'
|
25
|
+
@audience = params[:audience] || 'https://accounts.google.com/o/oauth2/token'
|
26
|
+
@person = params[:person] || (raise NoDeveloperEmailException)
|
27
|
+
end
|
28
|
+
|
29
|
+
def client
|
30
|
+
@client ||= init_googleplay_api_client
|
31
|
+
end
|
32
|
+
|
33
|
+
def init_googleplay_api_client
|
34
|
+
client = Google::APIClient.new(application_name: 'Ruby Inapppurchases verify', application_version: @api_version)
|
35
|
+
|
36
|
+
client.authorization = Signet::OAuth2::Client.new(
|
37
|
+
token_credential_uri: @token_credential_uri,
|
38
|
+
audience: @audience,
|
39
|
+
scope: @scope_url,
|
40
|
+
issuer: @service_account_email,
|
41
|
+
signing_key: Google::APIClient::KeyUtils.load_from_pkcs12(@key_file, @key_secret),
|
42
|
+
person: @person)
|
43
|
+
|
44
|
+
client.authorization.fetch_access_token!
|
45
|
+
client
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'UnifiedIap' do
|
4
|
+
describe "#verify" do
|
5
|
+
|
6
|
+
let(:iap_params) do
|
7
|
+
{
|
8
|
+
package_name: 'com.bbg.dw.ww1',
|
9
|
+
product_id: 'com.bbg.dw.ww1.60000',
|
10
|
+
purchase_token: "dmkgpgikajliabogedjojdak.AO-J1OzEhpio5zq-F-LzuYEMsryAopNT4sdEIUBnSfOja4jgbfAMyOkCtquULWGqKRT_VEnL2V9oCh-cBBPbJp1amuh5CKDzHeVAJFe_VjjvdgngeT8rWRN98SqzOSXCRCWGZSu6KpTR"
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:googleplay_account_secret_params) do
|
15
|
+
{
|
16
|
+
api_version: 'v1.1',
|
17
|
+
service_account_email: 'REPLACE YOUR SERVICE ACCOUNT EMAIL',
|
18
|
+
key_file: "PATH TO YOUR p12 File",
|
19
|
+
key_secret: 'notasecret',
|
20
|
+
scope_url: 'https://www.googleapis.com/auth/androidpublisher',
|
21
|
+
token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
|
22
|
+
audience: 'https://accounts.google.com/o/oauth2/token',
|
23
|
+
person: 'YOUR GOOGLEPLAY ACCOUNT EMAIL',
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
let (:amazon_iap_params) do
|
28
|
+
{
|
29
|
+
amazon_user_id:"tfzqEZANv3rrrvQsLAjDtWjTZ-7INPv54GyJzrWdH1Q=",
|
30
|
+
purchase_token: "2:I3YhwaI6ICNNnt_FTCylN9dhlghTyItfuMbGzH8dVvQih7AT_pl-fP3vLDcRbPTGEAdiWrU2rztBVPktNrU0NXg1G6wMf1YscKbQmGo447RoS8IVfeJU-3cX8_yYxG6TThhzNxI_-QdVU1IsloMewhKQcfuFYTyckkC54VYXyEW_k3yVLtduN-DIc_N7rwr0F58ahfNiCAMkAS3aDxjtHVRE2NI8ALajaIZqk4sv228QOPxkp_a_Z_g27XX7t8o0_O-OgZo0XTYKJlcUn38ozfEuWpNfH82Gzv-267faw9x8rOw07HeLhUCtW5YAwCQW:s0w4JQor7XKkWtVHHHy2nA=="
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:amazon_iap) do
|
35
|
+
"REPLACE YOUR AMAZON SECRET"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "verify gp success" do
|
39
|
+
expect(UnifiedIap.verify("ANDROID_GP", googleplay_account_secret_params, iap_params)['error']).to be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "verify amazon" do
|
43
|
+
expect(UnifiedIap.verify("AMAZON", amazon_iap, amazon_iap_params)).to_not be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
data/unified_iap.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'unified_iap/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "unified_iap"
|
8
|
+
spec.version = UnifiedIap::VERSION
|
9
|
+
spec.authors = ["Ailenswpu"]
|
10
|
+
spec.email = ["renkaiswpu@gmail.com"]
|
11
|
+
spec.summary = %q{iap order veify service for googleplay and amazon and ios}
|
12
|
+
spec.description = %q{iap order veify service for googleplay and amazon and ios}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
|
25
|
+
spec.add_runtime_dependency "google-api-client"
|
26
|
+
spec.add_runtime_dependency "venice"
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: unified_iap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ailenswpu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: google-api-client
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: venice
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: iap order veify service for googleplay and amazon and ios
|
84
|
+
email:
|
85
|
+
- renkaiswpu@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- ".rspec"
|
92
|
+
- Gemfile
|
93
|
+
- LICENSE.txt
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- lib/unified_iap.rb
|
97
|
+
- lib/unified_iap/amazon_client.rb
|
98
|
+
- lib/unified_iap/amazon_exceptions.rb
|
99
|
+
- lib/unified_iap/amazon_result.rb
|
100
|
+
- lib/unified_iap/android_amazon_iap.rb
|
101
|
+
- lib/unified_iap/googleplay_iap.rb
|
102
|
+
- lib/unified_iap/ios_iap.rb
|
103
|
+
- lib/unified_iap/version.rb
|
104
|
+
- spec/spec_helper.rb
|
105
|
+
- spec/unifedplatform_spec.rb
|
106
|
+
- unified_iap.gemspec
|
107
|
+
homepage: ''
|
108
|
+
licenses:
|
109
|
+
- MIT
|
110
|
+
metadata: {}
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options: []
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
requirements: []
|
126
|
+
rubyforge_project:
|
127
|
+
rubygems_version: 2.2.2
|
128
|
+
signing_key:
|
129
|
+
specification_version: 4
|
130
|
+
summary: iap order veify service for googleplay and amazon and ios
|
131
|
+
test_files:
|
132
|
+
- spec/spec_helper.rb
|
133
|
+
- spec/unifedplatform_spec.rb
|