motion-wechat 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +39 -0
- data/lib/motion-wechat.rb +7 -0
- data/lib/motion-wechat/access_token.rb +86 -0
- data/lib/motion-wechat/api.rb +74 -2
- data/lib/motion-wechat/client.rb +75 -0
- data/lib/motion-wechat/config.rb +8 -11
- data/lib/motion-wechat/version.rb +1 -1
- data/spec/motion-wechat/access_token_spec.rb +69 -0
- data/spec/motion-wechat/api_spec.rb +16 -8
- data/spec/motion-wechat/client_spec.rb +70 -0
- metadata +37 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a19b83c93b6167b56d74f08b976f73c5156af0f7
|
4
|
+
data.tar.gz: 8cbb139358b5a526d01faa0f29bedb8556a4268b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9eed5cd35a4eedb2e812f4f99b0eb033ffe5e93a70105b5081e7de0d90f9cbe90959417351c303c4d1bd88e8a471d7748b1c6bf9364273de299c7fd4c2f1149
|
7
|
+
data.tar.gz: 4f99a7c8c256c55415292459e0b40253fa7c44ba9fa76dd17e40d1bd7105033c7fa829c887359d1e7b40f7fa413120247f6573a7f50814d6475e6abc1fd43eba
|
data/README.md
CHANGED
@@ -24,6 +24,12 @@ Then setup configuration in your Rakefile:
|
|
24
24
|
MotionWechat::Config.setup(app, 'app_key', 'app_secret')
|
25
25
|
```
|
26
26
|
|
27
|
+
Then register app in your `app_delegate.rb`
|
28
|
+
```ruby
|
29
|
+
MotionWechat::API.instance.registerApp @key
|
30
|
+
```
|
31
|
+
|
32
|
+
|
27
33
|
Usage
|
28
34
|
==========
|
29
35
|
|
@@ -34,8 +40,41 @@ MotionWechat::API.instance.send_webpage "http://www.rubymotion.com", \
|
|
34
40
|
title: "Ruby Motion", description: "Awesome way to write ios/osx app"
|
35
41
|
```
|
36
42
|
|
43
|
+
Wechat Authorization:
|
44
|
+
|
45
|
+
#### 1. authorize, this will direct user to wechat app
|
46
|
+
```ruby
|
47
|
+
MotionWechat::API.instance.authorize
|
48
|
+
```
|
49
|
+
|
50
|
+
#### 2. then make sure you have weixin delegate set up in `app_delegate.rb`
|
51
|
+
```ruby
|
52
|
+
def application(application, handleOpenURL:url)
|
53
|
+
WXApi.handleOpenURL(url, delegate:self)
|
54
|
+
end
|
55
|
+
|
56
|
+
def application(application, openURL:url, sourceApplication:sourceApplication, annotation:annotation)
|
57
|
+
WXApi.handleOpenURL(url, delegate:self)
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
#### 3. set up `onResp` in `app_delegate.rb`. this is when it comes back from wexin app
|
62
|
+
```ruby
|
63
|
+
def onResp(resp)
|
64
|
+
if resp.is_a? SendAuthResp
|
65
|
+
# token lang country code
|
66
|
+
MotionWechat::API.instance.registerClient resp.code
|
67
|
+
MotionWechat::API.instance.get_user_info do |info|
|
68
|
+
p info
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
|
37
75
|
## TODO
|
38
76
|
- delegate helpers, i.e. `WXApi.handleOpenURL(url, delegate:self)`
|
77
|
+
- state & key validating in `application(application, handleOpenURL:url)`
|
39
78
|
|
40
79
|
## Contributions
|
41
80
|
|
data/lib/motion-wechat.rb
CHANGED
@@ -2,6 +2,8 @@ unless defined?(Motion::Project::Config)
|
|
2
2
|
raise "This file must be required within a RubyMotion project Rakefile."
|
3
3
|
end
|
4
4
|
|
5
|
+
require 'afmotion'
|
6
|
+
require 'bubble-wrap/core'
|
5
7
|
require_relative 'motion-wechat/config'
|
6
8
|
|
7
9
|
Motion::Project::App.setup do |app|
|
@@ -11,4 +13,9 @@ Motion::Project::App.setup do |app|
|
|
11
13
|
|
12
14
|
app.vendor_project 'vendor/SDKExport', :static
|
13
15
|
|
16
|
+
app.pods ||= Motion::Project::CocoaPods.new(app)
|
17
|
+
app.pods do
|
18
|
+
pod 'AFNetworking'
|
19
|
+
end
|
20
|
+
|
14
21
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module MotionWechat
|
2
|
+
class AccessToken
|
3
|
+
attr_reader :client, :token, :expires_in, :openid, :params
|
4
|
+
attr_accessor :options, :refresh_token
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
# Initializes an AccessToken from a Hash
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
# MotionWechat::AccessToken.from_hash @client, {}
|
12
|
+
#
|
13
|
+
# Arguments:
|
14
|
+
# client: (MotionWechat::Client)
|
15
|
+
# hash: (Hash)
|
16
|
+
#
|
17
|
+
def from_hash(client, hash)
|
18
|
+
new(client, hash.delete('access_token') || hash.delete(:access_token), hash)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
# Initalize an AccessToken
|
24
|
+
#
|
25
|
+
# Example:
|
26
|
+
# MotionWechat::AccessToken.new @client, 'token', {}
|
27
|
+
#
|
28
|
+
# Arguments:
|
29
|
+
# client: (MotionWechat::Client)
|
30
|
+
# token: (String)
|
31
|
+
# hash: (Hash)
|
32
|
+
#
|
33
|
+
def initialize(client, token, opts = {})
|
34
|
+
@client = client
|
35
|
+
@token = token.to_s
|
36
|
+
[:refresh_token, :expires_in, :openid].each do |arg|
|
37
|
+
instance_variable_set("@#{arg}", opts.delete(arg) || opts.delete(arg.to_s))
|
38
|
+
end
|
39
|
+
@expires_in ||= opts.delete('expires')
|
40
|
+
@expires_at ||= Time.now.to_i + @expires_in.to_i
|
41
|
+
@params = opts
|
42
|
+
end
|
43
|
+
|
44
|
+
# Get information using access token
|
45
|
+
#
|
46
|
+
# Example:
|
47
|
+
# @token.get "/sns/userinfo", { |res| ... }
|
48
|
+
#
|
49
|
+
# Arguments:
|
50
|
+
# path: (String)
|
51
|
+
# opts: (hash)
|
52
|
+
#
|
53
|
+
def get(path, opts = {}, &block)
|
54
|
+
@client.get path, opts.merge({access_token: @token}), &block
|
55
|
+
end
|
56
|
+
|
57
|
+
# Get user information
|
58
|
+
#
|
59
|
+
# Example:
|
60
|
+
# @token.get_user_info { |info| ... }
|
61
|
+
#
|
62
|
+
def get_user_info(&block)
|
63
|
+
get "/sns/userinfo", openid: @openid do |info|
|
64
|
+
block.call oauth2_wrapp(info)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# Wrap with OAuth2 structure
|
71
|
+
def oauth2_wrapp(info)
|
72
|
+
{
|
73
|
+
uid: @openid,
|
74
|
+
provider: "weixin",
|
75
|
+
info: {
|
76
|
+
image: info['headimgurl'],
|
77
|
+
nickname: info['nickname'],
|
78
|
+
name: info['nickname']
|
79
|
+
},
|
80
|
+
extra: info
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
data/lib/motion-wechat/api.rb
CHANGED
@@ -2,13 +2,80 @@ module MotionWechat
|
|
2
2
|
module API
|
3
3
|
|
4
4
|
InvalidMediaObject = Class.new StandardError
|
5
|
+
InvalidClientError = Class.new ArgumentError
|
6
|
+
|
5
7
|
def wx; WXApi; end
|
6
8
|
|
7
|
-
#
|
9
|
+
# Initialize weixin API using key and secret
|
10
|
+
#
|
11
|
+
# Example:
|
12
|
+
# MtionWechat::API.new 'key', 'secret'
|
13
|
+
#
|
14
|
+
# Arguments:
|
15
|
+
# key: (String)
|
16
|
+
# secret: (String)
|
17
|
+
# options: (Hash)
|
18
|
+
#
|
8
19
|
def initialize(key, secret, options={})
|
9
20
|
@key = key
|
10
21
|
@secret = secret
|
11
|
-
|
22
|
+
end
|
23
|
+
|
24
|
+
# Register weixin app, usually put in `app_delegate.rb`
|
25
|
+
#
|
26
|
+
# Example:
|
27
|
+
# MotionWechat::API.instance.registerApp
|
28
|
+
#
|
29
|
+
def registerApp
|
30
|
+
WXApi.registerApp @key
|
31
|
+
end
|
32
|
+
|
33
|
+
# Register client
|
34
|
+
#
|
35
|
+
# Example:
|
36
|
+
# MotionWechat::API.instance.registerClient "code"
|
37
|
+
#
|
38
|
+
# Arguments:
|
39
|
+
# code: (String)
|
40
|
+
#
|
41
|
+
def registerClient(code)
|
42
|
+
@client ||= MotionWechat::Client.new @key, @secret, code
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get user information
|
46
|
+
#
|
47
|
+
# Example:
|
48
|
+
# MotionWechat::API.instance.get_user_info { |info| ... }
|
49
|
+
#
|
50
|
+
def get_user_info(&block)
|
51
|
+
raise InvalidClientError if @client.nil?
|
52
|
+
if @token.nil?
|
53
|
+
@client.get_token do |token|
|
54
|
+
@token = token
|
55
|
+
@token.get_user_info { |info| block.call info }
|
56
|
+
end
|
57
|
+
else
|
58
|
+
@token.get_user_info { |info| block.call info }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Sends authorization request
|
63
|
+
#
|
64
|
+
# Example:
|
65
|
+
# MotionWechat::API.instance.authorize
|
66
|
+
#
|
67
|
+
# Arguments:
|
68
|
+
# opts: (Hash), state: "myapp"
|
69
|
+
#
|
70
|
+
def authorize(opts={})
|
71
|
+
options = {
|
72
|
+
scope: "snsapi_userinfo",
|
73
|
+
state: "motion-wechat-app"
|
74
|
+
}.merge(opts)
|
75
|
+
req = SendAuthReq.alloc.init
|
76
|
+
req.scope = options[:scope]
|
77
|
+
req.state = options[:state]
|
78
|
+
WXApi.sendReq(req)
|
12
79
|
end
|
13
80
|
|
14
81
|
# Returns singleton instance of MotionWechat
|
@@ -20,6 +87,11 @@ module MotionWechat
|
|
20
87
|
@instance ||= new config["key"], config["secret"]
|
21
88
|
end
|
22
89
|
|
90
|
+
# Returns info_plist_key of MotionWechat
|
91
|
+
#
|
92
|
+
# Example:
|
93
|
+
# MotionWechat::API.config
|
94
|
+
#
|
23
95
|
def self.config
|
24
96
|
NSBundle.mainBundle.objectForInfoDictionaryKey MotionWechat::Config.info_plist_key
|
25
97
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module MotionWechat
|
2
|
+
class Client
|
3
|
+
attr_reader :id, :secret, :site
|
4
|
+
attr_accessor :options
|
5
|
+
|
6
|
+
# Instantiate a new OAuth 2.0 client using the Client ID
|
7
|
+
# and Client Secret registered to your application.
|
8
|
+
#
|
9
|
+
# Example:
|
10
|
+
# MtionWechat::Client.new 'key', 'secret', 'code', {}
|
11
|
+
#
|
12
|
+
# Arguments:
|
13
|
+
# key: (String)
|
14
|
+
# secret: (String)
|
15
|
+
# code: (String)
|
16
|
+
# options: (Hash)
|
17
|
+
#
|
18
|
+
def initialize(client_id, client_secret, code, options = {})
|
19
|
+
opts = options.dup
|
20
|
+
@id = client_id
|
21
|
+
@secret = client_secret
|
22
|
+
@code = code
|
23
|
+
@site = opts[:site] || "https://api.weixin.qq.com"
|
24
|
+
@options = {
|
25
|
+
token_url: '/sns/oauth2/access_token'
|
26
|
+
}.merge(opts)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns token url to get access token
|
30
|
+
#
|
31
|
+
# Example:
|
32
|
+
# @client.token_url
|
33
|
+
#
|
34
|
+
def token_url
|
35
|
+
@site + @options[:token_url]
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns token url to get access token
|
39
|
+
#
|
40
|
+
# Example:
|
41
|
+
# @client.get_token do |token|
|
42
|
+
# p token
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
def get_token(&block)
|
46
|
+
params = "appid=#{@id}&secret=#{@secret}&code=#{@code}&grant_type=authorization_code"
|
47
|
+
AFMotion::HTTP.get(token_url + "?" + params) do |res|
|
48
|
+
hash = to_hash res.body.to_s
|
49
|
+
token = AccessToken.from_hash self, hash
|
50
|
+
block.call token
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Request information
|
55
|
+
#
|
56
|
+
# Example:
|
57
|
+
# @client.get '/sns/userinfo', openid: "openid" do |info|
|
58
|
+
# p info
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
def get(path, opts = {}, &block)
|
62
|
+
AFMotion::HTTP.get(@site + path, opts) do |res|
|
63
|
+
hash = to_hash res.body.to_s
|
64
|
+
block.call hash
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def to_hash(string)
|
71
|
+
BW::JSON.parse string.dataUsingEncoding(NSString.defaultCStringEncoding)
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
data/lib/motion-wechat/config.rb
CHANGED
@@ -2,9 +2,8 @@ module MotionWechat
|
|
2
2
|
module Config
|
3
3
|
extend self
|
4
4
|
|
5
|
-
def info_plist_key
|
6
|
-
|
7
|
-
end
|
5
|
+
def info_plist_key; "WechatConfig"; end
|
6
|
+
def key; @key; end
|
8
7
|
|
9
8
|
# Setup wechat information to rubymotion app, i.e. key, secret...
|
10
9
|
#
|
@@ -20,13 +19,11 @@ module MotionWechat
|
|
20
19
|
# Wechat key: (String)
|
21
20
|
# Wechat secret: (String)
|
22
21
|
# other options: (Hash)
|
23
|
-
def setup(app, key, secret
|
24
|
-
|
25
|
-
|
26
|
-
secret: secret
|
27
|
-
}.merge(opts)
|
22
|
+
def setup(app, key, secret)
|
23
|
+
@key = key
|
24
|
+
@secret = secret
|
28
25
|
|
29
|
-
app.info_plist[info_plist_key] =
|
26
|
+
app.info_plist[info_plist_key] = { key: @key, secret: @secret }
|
30
27
|
|
31
28
|
bundle_url_types = [
|
32
29
|
{ 'CFBundleURLName' => "weixin",
|
@@ -34,8 +31,8 @@ module MotionWechat
|
|
34
31
|
]
|
35
32
|
|
36
33
|
app.info_plist['CFBundleURLTypes'] ||= []
|
37
|
-
app.info_plist['CFBundleURLTypes']
|
38
|
-
|
34
|
+
app.info_plist['CFBundleURLTypes'] += bundle_url_types
|
35
|
+
|
39
36
|
end
|
40
37
|
|
41
38
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
describe MotionWechat::AccessToken do
|
2
|
+
extend WebStub::SpecHelpers
|
3
|
+
|
4
|
+
before do
|
5
|
+
disable_network_access!
|
6
|
+
hash = {
|
7
|
+
access_token: "access_token",
|
8
|
+
expires_in:7200,
|
9
|
+
refresh_token:"refresh_token",
|
10
|
+
openid:"openid",
|
11
|
+
scope:"snsapi_userinfo"
|
12
|
+
}
|
13
|
+
@client = MotionWechat::Client.new "appid", "appsecret", "code"
|
14
|
+
@token = MotionWechat::AccessToken.from_hash @client, hash
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should get client, token and expires" do
|
18
|
+
@token.client.should.be.kind_of MotionWechat::Client
|
19
|
+
@token.token.should == "access_token"
|
20
|
+
@token.expires_in.should == 7200
|
21
|
+
@token.openid.should == "openid"
|
22
|
+
end
|
23
|
+
|
24
|
+
context "get info" do
|
25
|
+
|
26
|
+
before do
|
27
|
+
@res = File.read NSBundle.mainBundle.resourcePath.stringByAppendingPathComponent("user.json")
|
28
|
+
@url = "https://api.weixin.qq.com/sns/userinfo?access_token=access_token&openid=openid"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "gets user info using get" do
|
32
|
+
stub_request(:get, @url).
|
33
|
+
to_return(json: @res)
|
34
|
+
@res = nil
|
35
|
+
|
36
|
+
@token.get("/sns/userinfo", openid: "openid") do |info|
|
37
|
+
@info = info
|
38
|
+
resume
|
39
|
+
end
|
40
|
+
|
41
|
+
wait_max 1.0 do
|
42
|
+
@info.should.be.kind_of Hash
|
43
|
+
@info["nickname"].should == "monkey"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "gets user info using get" do
|
48
|
+
stub_request(:get, @url).
|
49
|
+
to_return(json: @res)
|
50
|
+
@res = nil
|
51
|
+
|
52
|
+
@token.get_user_info do |info|
|
53
|
+
@info = info
|
54
|
+
resume
|
55
|
+
end
|
56
|
+
|
57
|
+
wait_max 1.0 do
|
58
|
+
@info.should.be.kind_of Hash
|
59
|
+
@info[:uid].should == "openid"
|
60
|
+
@info[:provider].should == "weixin"
|
61
|
+
@info[:info][:image].should == "http://wx.qlogo.cn/mmopen/0"
|
62
|
+
@info[:info][:nickname].should == "monkey"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
end
|
@@ -4,7 +4,7 @@ describe MotionWechat::API do
|
|
4
4
|
WXApi.stub!(:registerApp) do |key|
|
5
5
|
key.should == "app_key"
|
6
6
|
end
|
7
|
-
MotionWechat::API.instance
|
7
|
+
MotionWechat::API.instance.registerApp
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should return WXApi as wx" do
|
@@ -15,6 +15,14 @@ describe MotionWechat::API do
|
|
15
15
|
|
16
16
|
before { @mv = MotionWechat::API.instance }
|
17
17
|
|
18
|
+
it "sends auth message" do
|
19
|
+
WXApi.stub!(:sendReq) do |req|
|
20
|
+
req.should.be.kind_of(SendAuthReq)
|
21
|
+
end
|
22
|
+
|
23
|
+
@mv.authorize
|
24
|
+
end
|
25
|
+
|
18
26
|
it 'sends web page url' do
|
19
27
|
WXApi.stub!(:sendReq) do |req|
|
20
28
|
req.should.be.kind_of(SendMessageToWXReq)
|
@@ -23,7 +31,7 @@ describe MotionWechat::API do
|
|
23
31
|
req.message.mediaObject.webpageUrl.should == "http://www.motion-wechat.com"
|
24
32
|
end
|
25
33
|
|
26
|
-
|
34
|
+
@mv.send_webpage "http://www.motion-wechat.com", \
|
27
35
|
title: "title", description: "description"
|
28
36
|
end
|
29
37
|
|
@@ -33,7 +41,7 @@ describe MotionWechat::API do
|
|
33
41
|
req.message.mediaObject.videoUrl.should == "http://www.youtube.com/1"
|
34
42
|
end
|
35
43
|
|
36
|
-
|
44
|
+
@mv.send_video "http://www.youtube.com/1", \
|
37
45
|
title: "title", description: "description"
|
38
46
|
end
|
39
47
|
|
@@ -43,7 +51,7 @@ describe MotionWechat::API do
|
|
43
51
|
req.message.mediaObject.musicUrl.should == "http://www.pandora.com/1"
|
44
52
|
end
|
45
53
|
|
46
|
-
|
54
|
+
@mv.send_music "http://www.pandora.com/1", \
|
47
55
|
title: "title", description: "description"
|
48
56
|
end
|
49
57
|
|
@@ -52,7 +60,7 @@ describe MotionWechat::API do
|
|
52
60
|
req.message.mediaObject.should.be.kind_of(WXImageObject)
|
53
61
|
end
|
54
62
|
|
55
|
-
|
63
|
+
@mv.send_image NSData.dataWithContentsOfFile("dummy"), \
|
56
64
|
title: "title", description: "description"
|
57
65
|
end
|
58
66
|
|
@@ -62,7 +70,7 @@ describe MotionWechat::API do
|
|
62
70
|
req.text.should == "hello"
|
63
71
|
end
|
64
72
|
|
65
|
-
|
73
|
+
@mv.send_text "hello"
|
66
74
|
end
|
67
75
|
|
68
76
|
describe "Scene type" do
|
@@ -73,7 +81,7 @@ describe MotionWechat::API do
|
|
73
81
|
req.scene.should == WXSceneSession
|
74
82
|
end
|
75
83
|
|
76
|
-
|
84
|
+
@mv.send_webpage "http://www.motion-wechat.com", \
|
77
85
|
title: "title", description: "description"
|
78
86
|
end
|
79
87
|
|
@@ -83,7 +91,7 @@ describe MotionWechat::API do
|
|
83
91
|
req.scene.should == WXSceneTimeline
|
84
92
|
end
|
85
93
|
|
86
|
-
|
94
|
+
@mv.send_webpage "http://www.motion-wechat.com", \
|
87
95
|
title: "title", description: "description", scene: WXSceneTimeline
|
88
96
|
end
|
89
97
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
describe MotionWechat::Client do
|
2
|
+
extend WebStub::SpecHelpers
|
3
|
+
|
4
|
+
before do
|
5
|
+
disable_network_access!
|
6
|
+
@client = MotionWechat::Client.new "appid", "appsecret", "code"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should get id, secret and site" do
|
10
|
+
@client.id.should == "appid"
|
11
|
+
@client.secret.should == "appsecret"
|
12
|
+
@client.site == "https://api.weixin.qq.com"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should get token url" do
|
16
|
+
@client.token_url.should == "https://api.weixin.qq.com/sns/oauth2/access_token"
|
17
|
+
end
|
18
|
+
|
19
|
+
context "access token" do
|
20
|
+
|
21
|
+
before do
|
22
|
+
@res = File.read NSBundle.mainBundle.resourcePath.stringByAppendingPathComponent("token.json")
|
23
|
+
@url = "https://api.weixin.qq.com/sns/oauth2/access_token" + \
|
24
|
+
"?appid=appid&secret=appsecret&code=code&grant_type=authorization_code"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "gets token" do
|
28
|
+
stub_request(:get, @url).
|
29
|
+
to_return(json: @res)
|
30
|
+
@res = nil
|
31
|
+
|
32
|
+
@client.get_token do |token|
|
33
|
+
@token = token
|
34
|
+
resume
|
35
|
+
end
|
36
|
+
|
37
|
+
wait_max 1.0 do
|
38
|
+
@token.should.be.kind_of MotionWechat::AccessToken
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
context "get info" do
|
45
|
+
|
46
|
+
before do
|
47
|
+
@res = File.read NSBundle.mainBundle.resourcePath.stringByAppendingPathComponent("user.json")
|
48
|
+
@url = "https://api.weixin.qq.com/sns/user_info?access_token=token&openid=openid"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "gets user info" do
|
52
|
+
stub_request(:get, @url).
|
53
|
+
to_return(json: @res)
|
54
|
+
@res = nil
|
55
|
+
|
56
|
+
@client.get("/sns/user_info", access_token: "token", openid: "openid") do |info|
|
57
|
+
@info = info
|
58
|
+
resume
|
59
|
+
end
|
60
|
+
|
61
|
+
wait_max 1.0 do
|
62
|
+
@info.should.be.kind_of Hash
|
63
|
+
@info["nickname"].should == "monkey"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
end
|
metadata
CHANGED
@@ -1,27 +1,59 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-wechat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Qi He
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
12
|
-
dependencies:
|
11
|
+
date: 2014-09-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: afmotion
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.3.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.3.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bubble-wrap
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.7.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.7.0
|
13
41
|
description: Rubymotion gem to easily use WeChatSDK
|
14
42
|
email: qhe@heyook.com
|
15
43
|
executables: []
|
16
44
|
extensions: []
|
17
45
|
extra_rdoc_files: []
|
18
46
|
files:
|
47
|
+
- lib/motion-wechat/access_token.rb
|
19
48
|
- lib/motion-wechat/api.rb
|
49
|
+
- lib/motion-wechat/client.rb
|
20
50
|
- lib/motion-wechat/config.rb
|
21
51
|
- lib/motion-wechat/version.rb
|
22
52
|
- lib/motion-wechat.rb
|
23
53
|
- README.md
|
54
|
+
- spec/motion-wechat/access_token_spec.rb
|
24
55
|
- spec/motion-wechat/api_spec.rb
|
56
|
+
- spec/motion-wechat/client_spec.rb
|
25
57
|
- spec/motion-wechat/config_spec.rb
|
26
58
|
homepage: http://github.com/he9qi/motion-wechat
|
27
59
|
licenses:
|
@@ -48,5 +80,7 @@ signing_key:
|
|
48
80
|
specification_version: 4
|
49
81
|
summary: Rubymotion wrapper for WeChatSDK
|
50
82
|
test_files:
|
83
|
+
- spec/motion-wechat/access_token_spec.rb
|
51
84
|
- spec/motion-wechat/api_spec.rb
|
85
|
+
- spec/motion-wechat/client_spec.rb
|
52
86
|
- spec/motion-wechat/config_spec.rb
|