Contents
  1. 1. 微信企业号
  2. 2. 企业号授权(AccessToken)
    1. 2.1. 请求说明
    2. 2.2. 参数说明
    3. 2.3. 权限说明
    4. 2.4. 返回说明
  3. 3. 发送消息
    1. 3.1. 请求说明
  4. 4. 发送图片
    1. 4.1. 上传临时素材
      1. 4.1.1. 请求说明
      2. 4.1.2. 参数说明
      3. 4.1.3. 返回说明
      4. 4.1.4. 上传的媒体文件限制
  5. 5. 发送图片给公众号

微信企业号

企业号是微信为企业客户提供的移动应用入口,只有企业通讯录的成员才能关注企业号,分级管理员、保密消息等各种特性确保企业内部信息的安全。
企业可自行在企业号中可配置多个服务号,可以连接不同的企业应用系统,只有授权的企业成员才能使用相应的服务号。

以上来自腾讯faq,想了解更多请度娘。
然后我们有了个企业号后,就能使用微信提供的api进行操作了,最经典的是发送消息。

企业号授权(AccessToken)

首先我们要经过授权,就是说要获得这个企业号的操作权限,通过获取AccessToken体现。
AccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。
AccessToken需要用CorpID和Secret来换取,不同的Secret会返回不同的AccessToken。

请求说明

Https请求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect

参数说明

参数 必须 说明
corpid 企业Id
corpsecret 管理组的凭证密钥

权限说明

每个secret代表了对应用、通讯录的不同权限;不同的管理组拥有不同的secret。

返回说明

a)正确的Json返回结果:

1
2
3
4
{
"access_token": "accesstoken000001",
"expires_in": 7200
}
参数 说明
access_token 获取到的凭证。长度为64至512个字节
expires_in 凭证的有效时间(秒)

b)错误的Json返回示例:

1
2
3
4
{
"errcode": 43003,
"errmsg": "require https"
}

结合以上信息,我们可以很容易使用python写出代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# coding: utf-8
import requests
class WeixinMsg(object):
def __init__(self, corpid, corpsecret):
self.__corpsecret = corpsecret
self.__corpid = corpid
self.__token = self.__getToken()
def __getToken(self):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(self.__corpid, self.__corpsecret)
r = requests.get(gettoken_url)
if r.status_code == 200:
return r.json()["access_token"]
else:
return r.status_code

发送消息

也是经典的场景,通过构造特定的json数据格式传送到微信api来实现
首先传递给企业号api的json格式是这个:

1
2
3
4
5
6
7
8
9
10
11
{
"touser": "UserID1|UserID2|UserID3",
"toparty": " PartyID1 | PartyID2 ",
"totag": " TagID1 | TagID2 ",
"msgtype": "text",
"agentid": 1,
"text": {
"content": "Holiday Request For Pony(http://xxxxx)"
},
"safe":0
}
参数 必须 说明
touser 成员ID列表(消息接收者,多个接收者用‘
toparty 部门ID列表,多个接收者用‘
totag 标签ID列表,多个接收者用‘
msgtype 消息类型,此时固定为:text (支持消息型应用跟主页型应用)
agentid 企业应用的id,整型。可在应用的设置页面查看
content 消息内容,最长不超过2048个字节,注意:主页型应用推送的文本消息在微信端最多只显示20个字(包含中英文)
safe 表示是否是保密消息,0表示否,1表示是,默认0

其他消息类型可以看api文档

请求说明

Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN

消息型应用支持文本、图片、语音、视频、文件、图文等消息类型。主页型应用只支持文本消息类型,且文本长度不超过20个字。

代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# coding: utf-8
import requests
class WeixinMsg(object):
def __init__(self, corpid, corpsecret):
self.__corpsecret = corpsecret
self.__corpid = corpid
self.__token = self.__getToken()
def __getToken(self):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(self.__corpid, self.__corpsecret)
r = requests.get(gettoken_url)
if r.status_code == 200:
return r.json()["access_token"]
else:
return r.status_code
def send(self, user, content):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s'% self.__token
send_values = '''{
"touser": "%s",
"msgtype":"text",
"agentid": 1,
"text":{
"content": "%s"
},
"safe": 0
}''' % (user, content)
r = requests.post(send_url, data=send_values, headers = {"Content-Type": "application/json; charset=utf-8"})
return r.json()["errcode"]

发送图片

发送图片比发送文本消息复杂一点,首先需要把图片上传到微信,微信把这个叫素材,素材不单指图片,还有语音、视频、普通文件。素材分临时素材和永久素材,临时素材保存3天。

上传临时素材

请求说明

Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

参数说明

参数 必须 说明
access_token 调用接口凭证
type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
media form-data中媒体文件标识,有filename、filelength、content-type等信息

返回说明

1
2
3
4
5
{
"type": "image",
"media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0",
"created_at": "1380000000"
}
参数 说明
type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
media_id 媒体文件上传后获取的唯一标识。最大长度为256字节
created_at 媒体文件上传时间戳

上传的媒体文件限制

  • 所有文件size必须大于5个字节
  • 图片(image):2MB,支持JPG,PNG格式
  • 语音(voice):2MB,播放长度不超过60s,支持AMR格式
  • 视频(video):10MB,支持MP4格式
  • 普通文件(file):20MB

代码示例如下:
使用requests的post方法,可以方便的上传,headers会自动设置成form-data。Mfile是我们要上传图片的路径,必须可读,这样上传后我们就得到了media_id。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# coding: utf-8
import requests
from os.path import sep, getsize
class WeixinMedia(object):
WEIXIN_TOKEN = ''

def __init__(self, Weixin):
self.__Weixin = Weixin
self.refershWXToken()
def refershWXToken(self):
global WEIXIN_TOKEN
WEIXIN_TOKEN = self.__Weixin.token

def upload(self):
pass
def get(self):
pass
class WeixinTmpMedia(WeixinMedia):
def __init__(self, Weixin):
super(WeixinTmpMedia, self).__init__(Weixin)
def uploadImage(self, Mfile):
# 图片(image):2MB,支持JPG,PNG格式
upurl = 'https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}&type=image'.format(WEIXIN_TOKEN)
f = open(Mfile, 'rb')
suf = f.name.split('.')[-1].lower()
if suf <> 'jpg' and suf <> 'png':
return 'Not a image file!'
elif getsize(Mfile) > 2097152L:
return 'Image file too large!'
else:
files = {'file': (f.name.split(sep)[-1], f)}
r = requests.post(upurl, files=files)
f.close()
if 'media_id' in r.json():
return r.json()['media_id']
else:
return 'errcode: {}, errmsg: {}'.format(r.json()['errcode'], r.json()['errmsg'])

发送图片给公众号

我们改造一下之前的代码,把消息抽象出来,消息可以是文本和图片,他们共同点是token和send方法,传入的weixin类带有token:

1
2
3
4
5
6
7
8
9
10
11
# coding: utf-8
class WeixinMsg(object):
WEIXIN_TOKEN = ''
def __init__(self, Weixin):
self.__Weixin = Weixin
self.refershWXToken()
def refershWXToken(self):
global WEIXIN_TOKEN
WEIXIN_TOKEN = self.__Weixin.token
def send(self):
pass

发送图片代码继承上面的消息类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class WeixinImg(WeixinMsg):
def __init__(self, Weixin):
super(WeixinImg, self).__init__(Weixin)
def send(self, user, mediaID):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}'
send_values = '''{
"touser": "%s",
"msgtype":"image",
"agentid": 1,
"image":{
"media_id": "%s"
},
"safe": 0
}''' % (user, mediaID)
r = requests.post(send_url.format(WEIXIN_TOKEN), data=send_values, headers = {"Content-Type": "application/json; charset=utf-8"})
return r.json()["errcode"]

这样就能发生图片给关注公众号的人了。

Contents
  1. 1. 微信企业号
  2. 2. 企业号授权(AccessToken)
    1. 2.1. 请求说明
    2. 2.2. 参数说明
    3. 2.3. 权限说明
    4. 2.4. 返回说明
  3. 3. 发送消息
    1. 3.1. 请求说明
  4. 4. 发送图片
    1. 4.1. 上传临时素材
      1. 4.1.1. 请求说明
      2. 4.1.2. 参数说明
      3. 4.1.3. 返回说明
      4. 4.1.4. 上传的媒体文件限制
  5. 5. 发送图片给公众号