qy_weixin 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 +20 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +69 -0
- data/Rakefile +3 -0
- data/lib/qy_weixin/client.rb +24 -0
- data/lib/qy_weixin/connection.rb +5 -0
- data/lib/qy_weixin/connections/base.rb +58 -0
- data/lib/qy_weixin/connections/department.rb +18 -0
- data/lib/qy_weixin/connections/message.rb +18 -0
- data/lib/qy_weixin/connections/qrcode.rb +19 -0
- data/lib/qy_weixin/connections/template.rb +18 -0
- data/lib/qy_weixin/connections/user.rb +34 -0
- data/lib/qy_weixin/models/configuration.rb +9 -0
- data/lib/qy_weixin/version.rb +5 -0
- data/lib/qy_weixin.rb +21 -0
- data/qy_weixin.gemspec +19 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2a1f3474151475c43e48b1cd326df18f4a3b3a014fe92aa4f57ef534fa202ee3
|
4
|
+
data.tar.gz: b05a390d877323dbebc75daaf75c6c5d9f05ea9602cb47ee931fe14395466a20
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ae2932cf630a12888af91e60851305b0d1e77515df4c6eb8425c1e862b0a81bf30de93aeb3101217332c5e71dde5c8fbadbdef6ae2e1a70926341f8122c9ce87
|
7
|
+
data.tar.gz: 6ccdc9490a20879e84e8ad85ce11b162aee03266c1c6569aeaa6ee6073b1b5edec60238e0c07d45b882a8df486158bebf0e604efd80c30574f73af32a3b518e1
|
data/.gitignore
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
*.rdb
|
2
|
+
*.swp
|
3
|
+
Gemfile.lock
|
4
|
+
*.gem
|
5
|
+
/tmp/
|
6
|
+
/.idea
|
7
|
+
/.yardoc
|
8
|
+
/.bundle
|
9
|
+
/coverage/*
|
10
|
+
/doc/
|
11
|
+
/examples/sentinel/sentinel.conf
|
12
|
+
/nohup.out
|
13
|
+
/pkg/*
|
14
|
+
/rdsrv
|
15
|
+
/redis/*
|
16
|
+
/test/db
|
17
|
+
/test/test.conf
|
18
|
+
appendonly.aof
|
19
|
+
temp-rewriteaof-*.aof
|
20
|
+
.history
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 TODO: Write your name
|
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,69 @@
|
|
1
|
+
# qy_weixin
|
2
|
+
Shop middleware for QyWeixin
|
3
|
+
|
4
|
+
https://rubygems.org/gems/qy_weixin
|
5
|
+
|
6
|
+
[](http://badge.fury.io/rb/qy_weixin)
|
7
|
+
|
8
|
+
**有问题请及时提issue**
|
9
|
+
|
10
|
+
https://github.com/luojie92/qy_weixin/issues
|
11
|
+
|
12
|
+
## Getting started
|
13
|
+
|
14
|
+
Add this line to your application's Gemfile:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'qy_weixin'
|
18
|
+
```
|
19
|
+
|
20
|
+
You can connect to QyWexinClient by instantiating the Redis class:
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
QyWexinClient = YolQyWeixin::Client.new(
|
24
|
+
corpid : qy_weixin_config["corpid"],
|
25
|
+
secret : qy_weixin_config["secret"],
|
26
|
+
redis : RedisClient
|
27
|
+
)
|
28
|
+
```
|
29
|
+
configuration:
|
30
|
+
|
31
|
+
`corpid`:[https://developer.work.weixin.qq.com/document/path/90665#corpid](https://developer.work.weixin.qq.com/document/path/90665#corpid)
|
32
|
+
|
33
|
+
`secret`:[https://developer.work.weixin.qq.com/document/path/90665#secret](https://developer.work.weixin.qq.com/document/path/90665#secret)
|
34
|
+
|
35
|
+
****RedisClient为redis实例,如果没有配置可传nil,建议使用redis,考虑到access_token获取次数限制;****
|
36
|
+
|
37
|
+
## Support methods
|
38
|
+
|
39
|
+
get access_token:
|
40
|
+
```ruby
|
41
|
+
QyWexinClient.get_access_token
|
42
|
+
|
43
|
+
# => "IFYJSh2oZ4MdWCZsuV-GF_zt...vXbfmgOkkM4ZkJLCb19MuLY5pMFKj4_w"
|
44
|
+
```
|
45
|
+
|
46
|
+
get user_id:
|
47
|
+
```ruby
|
48
|
+
QyWexinClient.get_user_id(code)
|
49
|
+
|
50
|
+
# => { "errcode": 0, "errmsg": "ok", "UserId":"USERID"}
|
51
|
+
```
|
52
|
+
**params:**
|
53
|
+
|
54
|
+
`code`:https://developer.work.weixin.qq.com/document/path/91019
|
55
|
+
|
56
|
+
|
57
|
+
get user_info:
|
58
|
+
```ruby
|
59
|
+
QyWexinClient.get_user_info(userid)
|
60
|
+
|
61
|
+
# => {"errcode"=>0, "errmsg"=>"ok", "userid"=>"333", "name"=>"罗xx", "department"=>[233], "position"=>"系统开发工程师", "mobile"=>"185xxxx0248", "gender"=>"1", "email"=>"", "avatar"=>"", "status"=>1, "isleader"=>0, "extattr"=>{}}
|
62
|
+
```
|
63
|
+
|
64
|
+
---
|
65
|
+
|
66
|
+
## 支持
|
67
|
+
|
68
|
+
如果你觉得我的gem对你有帮助,可以动动小手右上角点个`starred`:star::star::star:,:star:感谢你的关注:star:
|
69
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'monitor'
|
4
|
+
require 'redis'
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
module QyWeixin
|
8
|
+
# Client
|
9
|
+
class Client
|
10
|
+
include Connection::Base
|
11
|
+
include Connection::Qrcode
|
12
|
+
include Connection::Template
|
13
|
+
include Connection::User
|
14
|
+
include Connection::Department
|
15
|
+
include Connection::Message
|
16
|
+
attr_accessor :corpid, :secret, :redis
|
17
|
+
|
18
|
+
def initialize(options = {})
|
19
|
+
@corpid = options[:corpid] || QyWeixin.configuration.corpid
|
20
|
+
@secret = options[:secret] || QyWeixin.configuration.secret
|
21
|
+
@redis = options[:redis] || QyWeixin.configuration.redis
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QyWeixin
|
4
|
+
module Connection
|
5
|
+
# Base
|
6
|
+
module Base
|
7
|
+
def http_post(url, params)
|
8
|
+
uri = URI(url)
|
9
|
+
req = Net::HTTP.new(uri.host, uri.port)
|
10
|
+
req.use_ssl = true
|
11
|
+
res = req.post("#{uri.path}?#{uri.query}", params.to_json)
|
12
|
+
handle_res(res)
|
13
|
+
end
|
14
|
+
|
15
|
+
def http_get(url)
|
16
|
+
uri = URI(url)
|
17
|
+
req = Net::HTTP.new(uri.host, uri.port)
|
18
|
+
req.use_ssl = true
|
19
|
+
res = req.get("#{uri.path}?#{uri.query}")
|
20
|
+
handle_res(res)
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_access_token
|
24
|
+
if redis.nil?
|
25
|
+
access_token_res = get_token(corpid, secret)
|
26
|
+
access_token = access_token_res['access_token']
|
27
|
+
else
|
28
|
+
access_token = redis.get('qywx_access_token')
|
29
|
+
if access_token.nil?
|
30
|
+
access_token_res = get_token(corpid, secret)
|
31
|
+
access_token = access_token_res['access_token']
|
32
|
+
raise StandardError, "QyWeixin access token authorize false, corpid: #{corpid}" if access_token.nil?
|
33
|
+
|
34
|
+
redis.set('qywx_access_token', access_token)
|
35
|
+
redis.expire('qywx_access_token', 7200)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
access_token
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def get_token(app_id, app_secret)
|
44
|
+
http_get(token_url(app_id, app_secret))
|
45
|
+
end
|
46
|
+
|
47
|
+
def token_url(corpid, secret)
|
48
|
+
"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=#{corpid}&corpsecret=#{secret}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def handle_res(res)
|
52
|
+
return JSON.parse(res.body) if res.code == '200'
|
53
|
+
|
54
|
+
{ code: res.code }.to_json
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QyWeixin
|
4
|
+
module Connection
|
5
|
+
# Department
|
6
|
+
module Department
|
7
|
+
def department_list(department_id = 0)
|
8
|
+
http_get(department_list_url(department_id))
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def department_list_url(department_id)
|
14
|
+
"https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=#{get_access_token}&id=#{department_id}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QyWeixin
|
4
|
+
module Connection
|
5
|
+
# Message
|
6
|
+
module Message
|
7
|
+
def send_message(body)
|
8
|
+
http_post(send_url, body)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def send_url
|
14
|
+
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=#{get_access_token}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QyWeixin
|
4
|
+
module Connection
|
5
|
+
# Qrcode
|
6
|
+
module Qrcode
|
7
|
+
def get_limited_qr(scene_id)
|
8
|
+
post_params = { 'expire_seconds': 3600, 'action_name': 'QR_SCENE', 'action_info': { 'scene': { 'scene_id': scene_id } } }
|
9
|
+
http_post(qrcode_create_url, post_params)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def qrcode_create_url
|
15
|
+
"https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=#{get_access_token}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QyWeixin
|
4
|
+
module Connection
|
5
|
+
# Template
|
6
|
+
module Template
|
7
|
+
def send_template_message(template_params)
|
8
|
+
http_post(message_template_url, template_params)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def message_template_url
|
14
|
+
"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=#{get_access_token}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QyWeixin
|
4
|
+
module Connection
|
5
|
+
# User
|
6
|
+
module User
|
7
|
+
def get_users_by_department(department_id, fetch_child = 0)
|
8
|
+
http_get(get_users_by_department_url(department_id, fetch_child))
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_user_id(code)
|
12
|
+
http_get(user_id_url(code))
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_user_info(open_id)
|
16
|
+
http_get(user_info_url(open_id))
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def get_users_by_department_url(department_id, fetch_child)
|
22
|
+
"https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=#{get_access_token}&department_id=#{department_id}&fetch_child=#{fetch_child}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def user_id_url(code)
|
26
|
+
"https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=#{get_access_token}&code=#{code}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def user_info_url(open_id)
|
30
|
+
"https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=#{get_access_token}&userid=#{open_id}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/qy_weixin.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'qy_weixin/version'
|
4
|
+
require 'qy_weixin/models/configuration'
|
5
|
+
require 'qy_weixin/connection'
|
6
|
+
require 'qy_weixin/client'
|
7
|
+
|
8
|
+
# QyWeixin
|
9
|
+
module QyWeixin
|
10
|
+
class << self
|
11
|
+
attr_writer :configuration
|
12
|
+
|
13
|
+
def configure
|
14
|
+
yield(configuration)
|
15
|
+
end
|
16
|
+
|
17
|
+
def configuration
|
18
|
+
@configuration ||= Configuration.new
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/qy_weixin.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require './lib/qy_weixin/version'
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = 'qy_weixin'
|
6
|
+
spec.version = QyWeixin::VERSION
|
7
|
+
spec.homepage = 'https://github.com/luojie92/qy_weixin'
|
8
|
+
spec.authors = ['luojie92']
|
9
|
+
spec.email = ['444530861@qq.com']
|
10
|
+
spec.summary = 'Shop middleware for QyWeixin.'
|
11
|
+
spec.description = ''
|
12
|
+
spec.license = 'MIT'
|
13
|
+
spec.files = `git ls-files -z`.split("\x0")
|
14
|
+
# spec.files = Dir['CHANGELOG.md', 'LICENSE', 'README.md', 'lib/**/*'']
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ['lib']
|
18
|
+
spec.required_ruby_version = '>= 2.4.0'
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: qy_weixin
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- luojie92
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-04-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: ''
|
14
|
+
email:
|
15
|
+
- 444530861@qq.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".gitignore"
|
21
|
+
- Gemfile
|
22
|
+
- LICENSE.txt
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- lib/qy_weixin.rb
|
26
|
+
- lib/qy_weixin/client.rb
|
27
|
+
- lib/qy_weixin/connection.rb
|
28
|
+
- lib/qy_weixin/connections/base.rb
|
29
|
+
- lib/qy_weixin/connections/department.rb
|
30
|
+
- lib/qy_weixin/connections/message.rb
|
31
|
+
- lib/qy_weixin/connections/qrcode.rb
|
32
|
+
- lib/qy_weixin/connections/template.rb
|
33
|
+
- lib/qy_weixin/connections/user.rb
|
34
|
+
- lib/qy_weixin/models/configuration.rb
|
35
|
+
- lib/qy_weixin/version.rb
|
36
|
+
- qy_weixin.gemspec
|
37
|
+
homepage: https://github.com/luojie92/qy_weixin
|
38
|
+
licenses:
|
39
|
+
- MIT
|
40
|
+
metadata: {}
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 2.4.0
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 2.7.9
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: Shop middleware for QyWeixin.
|
61
|
+
test_files: []
|