2013年6月份開始,就陸陸續續的研究了一下微信公衆帳號的使用,整理了一篇《關於微信公衆平臺的調研說明》的文檔。文檔從微信公衆帳號的註冊、設置,到微信公衆帳號平臺管理的各個部分,都進行了介紹(微信升級以後,如今微信公衆帳號平臺的界面可能和文檔中有所不一樣,但基本上經過這個文檔,也知道怎麼去使用)。2013年11月份,對微信公衆帳號進行認證,另外獲得了9個開放的接口,現將9個接口應用過程進行小結一下,文檔中的內容大部分來自於官方資料,另外加上了一些我我的應用過程當中的一些理解,若有不正確的地方,歡迎你們指出。 javascript
1.語音識別
用戶給您的微信公衆帳號發送語音消息,微信服務器會先對語音消息進行識別,而後將識別出的文本內容和語音發送給您的微信公衆帳號的後臺服務器。
發送方不帶語音識別功能的XML以下所示:html
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[Format]]></Format> <MsgId>1234567890123456</MsgId> </xml>
發送方帶語音識別功能的XML以下所示:java
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[Format]]></Format> <Recognition><![CDATA[騰訊微信團隊]]></Recognition> <MsgId>1234567890123456</MsgId> </xml>
從上面能夠看出,微信服務器在推送的語音消息XML數據包中,增長了一個Recongnition字段,該字段的內容是語音識別出的文本內容。
【參數說明】:
git
|
【注】:語音識別功能能夠在個人服務頁面的高級接口欄目,經過開關來控制開啓和關閉。以下圖所示:
2.客服接口
當用戶主動發消息給您的微信公衆號的時候(包括髮送信息、點擊自定義菜單、關注等),微信服務器將會把消息數據推送給開發者,開發者在一段時間內(目前爲24小時)能夠調用客服消息接口,經過POST一個JSON數據包來發送消息(現支持文本、圖片、圖文、語音、視頻、音樂)給普通用戶,在24小時內不限制發送次數。此接口主要用於客服等有人工消息處理環節的功能,方便開發者爲用戶提供更加優質的服務。
與之相對應的是非認證帳號的「發送被動響應消息」接口,「發送被動響應消息」接口有一個缺陷就是:微信服務器在五秒內收不到響應會斷掉鏈接。也就是說,微信服務器只保持5秒的鏈接,若是五秒沒有回覆消息,那麼發起該會話請求的用戶就會收不到回覆了。
3.OAuth2.0網頁受權
若是用戶在微信中(Web微信除外)訪問公衆號的第三方網頁,公衆號開發者能夠經過此接口獲取當前用戶基本信息(包括暱稱、性別、城市、國家)。利用用戶信息,能夠實現體驗優化、用戶來源統計、賬號綁定、用戶身份鑑權等功能。【注意】:「獲取用戶基本信息接口(後續介紹)是在用戶和公衆號產生消息交互時,才能根據用戶OpenID獲取用戶基本信息,而網頁受權的方式獲取用戶基本信息,則無需消息交互,只是用戶進入到公衆號的網頁,就可彈出請求用戶受權的界面,用戶受權後,就可得到其基本信息(此過程甚至不須要用戶已經關注公衆號。)」
【注意】:在微信公衆號請求用戶網頁受權以前,開發者須要先到公衆平臺網站的個人服務頁中配置受權回調域名。請注意,這裏填寫的域名不要加http://,以下所示(這裏填寫的是演示地址):
具體而言,網頁受權流程分爲四步:
第一步:用戶贊成受權,獲取code。參考連接形式:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx909310a8acfdc259&redirect_uri=http%3A%2F%2Fwww.baidu.com&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect (注意:appid應該輸入您的微信公衆帳號的appid,該連接不能夠在瀏覽器中打開。實際使用的時候,須要把redirect_uri修改成您要跳轉的地址,目前我寫的是http://www.baidu.com,修改的時候,一樣要修改上面圖片所示設置的受權回調頁面域名)。在微信中打開這個受權連接,會進入到以下圖所示頁面:
單擊取消或容許按鈕,都會進入到上面設置的回調頁面。若是用戶贊成受權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。若用戶禁止受權,則重定向後不會帶上code參數,僅會帶上state參數redirect_uri?state=STATE
【code說明 】:
code做爲換取access_token的票據,每次用戶受權帶上的code將不同,code只能使用一次,5分鐘未被使用自動過時。
【參數說明】:
|
第二步:經過code換取網頁受權access_token。獲取code後,請求如下連接獲取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
【注意】:這裏經過code換取的網頁受權access_token,與基礎支持中的access_token不一樣。若是網頁受權的做用域爲snsapi_base,則本步驟中獲取到網頁受權access_token的同時,也獲取到了openid,snsapi_base式的網頁受權流程即到此爲止。
【參數說明】:
|
【返回說明】:
正確時返回的JSON數據包以下:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
【參數說明】:
|
錯誤時微信會返回JSON數據包以下(示例爲Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
第三步:刷新access_token(若是須要)。因爲access_token擁有較短的有效期,當access_token超時後,可使用refresh_token進行刷新,refresh_token擁有較長的有效期(7天、30天、60天、90天),當refresh_token失效的後,須要用戶從新受權。
獲取第二步的refresh_token後,請求如下連接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
【參數說明】:
|
【返回說明】:
正確時返回的JSON數據包以下:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
【參數說明】:
|
錯誤時微信會返回JSON數據包以下(示例爲Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
第四步:拉取用戶信息(需scope爲 snsapi_userinfo)。若是網頁受權做用域爲snsapi_userinfo,則此時開發者能夠經過access_token和openid拉取用戶信息了。
【請求方法】:
http:GET(請使用https協議)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
【參數說明】:
|
【返回說明】:
正確時返回的JSON數據包以下:
{ "openid":" OPENID", " nickname": NICKNAME, "sex":"1", "province":"PROVINCE" "city":"CITY", "country":"COUNTRY", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ] }
【參數說明】:
|
錯誤時微信會返回JSON數據包以下(示例爲openid無效):
{"errcode":40003,"errmsg":" invalid openid "}
4. 生成帶參數二維碼
使用該接口能夠得到多個帶不一樣場景值的二維碼,用戶掃描後,公衆號能夠接收到事件推送(說的簡單點,意思就是能夠經過這個接口,產生一個二維碼,而後用戶能夠經過掃描這個二維碼,進入到公衆帳號信息頁面(未關注公衆帳號的用戶)或公衆帳號的會話頁面(關注了公衆帳號的用戶))。
目前有2種類型的二維碼,分別是臨時二維碼和永久二維碼,前者有過時時間,最大爲1800秒,但可以生成較多數量,後者無過時時間,數量較少(目前參數只支持1--1000)。兩種二維碼分別適用於賬號綁定、用戶來源統計等場景。
用戶掃描帶場景值二維碼時,可能推送如下兩種事件:
獲取帶參數的二維碼的過程包括兩步,首先建立二維碼ticket,而後憑藉ticket到指定URL換取二維碼。
第一步:建立二維碼ticket。
【請求說明】:
http請求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST數據格式:json POST數據例子:{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
【參數說明】:
|
【返回說明】:
正確的Json返回結果:
{"ticket":"gQG28DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL0FuWC1DNmZuVEhvMVp4NDNMRnNRAAIEesLvUQMECAcAAA==","expire_seconds":1800}
【參數說明】:
|
錯誤的Json返回示例:
{"errcode":40013,"errmsg":"invalid appid"}
第二步:經過ticket換取二維碼。
【請求說明】: HTTP GET請求(請使用https協議) https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
【返回說明】:
ticket正確狀況下,http 返回碼是200,是一張圖片,能夠直接展現或者下載。以下圖所示:
錯誤狀況下(如ticket非法)返回HTTP錯誤碼404。
5. 獲取用戶地理位置
【注意】:要使用獲取用戶地理位置功能,首先要在個人服務----高級接口中,開啓獲取用戶地理位置按鈕,單擊按鈕,會彈出以下所示頁面:
能夠根據須要自行選擇獲取地理位置的模式。
開通了上報地理位置接口的公衆號,用戶在關注後進入公衆號會話時,會彈框讓用戶確認是否容許公衆號使用其地理位置(以下圖左所示)。彈框只在關注後出現一次,用戶之後能夠在公衆號詳情頁面進行操做(以下圖右所示)。
用戶贊成上報地理位置後,每次進入公衆號會話時,都會在進入時上報地理位置,或在進入會話後每5秒上報一次地理位置,上報地理位置以推送XML數據包到開發者填寫的URL來實現。
推送XML數據包示例:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[LOCATION]]></Event> <Latitude>23.137466</Latitude> <Longitude>113.352425</Longitude> <Precision>119.385040</Precision> </xml>
【參數說明】:
|
6. 獲取用戶基本信息
在關注者與公衆號產生消息交互後,公衆號可得到關注者的OpenID(加密後的微信號,每一個用戶對每一個公衆號的OpenID是惟一的。對於不一樣公衆號,同一用戶的openid不一樣)。公衆號可經過本接口來根據OpenID獲取用戶基本信息,包括暱稱、頭像、性別、所在城市、語言和關注時間。
【接口調用請求說明】:
http請求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID
【參數說明】:
|
【返回說明】:
正常狀況下,微信會返回下述JSON數據包給公衆號:
{ "subscribe": 1, "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", "nickname": "Band", "sex": 1, "language": "zh_CN", "city": "廣州", "province": "廣東", "country": "中國", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", "subscribe_time": 1382694957 }
【參數說明】:
|
錯誤時微信會返回錯誤碼等信息,JSON數據包示例以下(該示例爲AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
7. 獲取關注者列表
公衆號可經過本接口來獲取賬號的關注者列表,關注者列表由一串OpenID(加密後的微信號,每一個用戶對每一個公衆號的OpenID是惟一的)組成。一次拉取調用最多拉取10000個關注者的OpenID,能夠經過屢次拉取的方式來知足需求。
【接口調用請求說明】:
http請求方式: GET(請使用https協議) https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
【參數說明】:
|
【返回說明】:
正確時返回JSON數據包:
{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
【參數說明】:
|
錯誤時返回JSON數據包(示例爲無效AppID錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
【附】:當公衆號關注者數量超過10000時,可經過填寫next_openid的值,從而屢次拉取列表的方式來知足需求。
具體而言,就是在調用接口時,將上一次調用獲得的返回中的next_openid值,做爲下一次調用中的next_openid值。
8. 用戶分組接口
開發者可使用接口,對公衆平臺的分組進行查詢、建立、修改操做,也可使用接口在須要時移動用戶到某個分組。
8.1查詢分組
【接口調用請求說明】:
http請求方式: GET(請使用https協議) https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN
【參數說明】:
|
【返回說明】:
正常時的返回JSON數據包示例:
{
"groups": [
{
"id": 0,
"name": "未分組",
"count": 72596
},
{
"id": 1,
"name": "黑名單",
"count": 36
}
]
}
【參數說明】:
|
8.2建立分組
一個公衆帳號,最多支持建立500個分組。
【 接口調用請求說明】:
http請求方式: POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN POST數據格式:json POST數據例子:{"group":{"name":"test"}}
【參數說明】:
|
【返回說明】:
正常時的返回JSON數據包示例:
{ "group": { "id": 107, "name": "test" } }
【參數說明】:
|
錯誤時的JSON數據包示例(該示例爲AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
8.3修改分組名
【接口調用請求說明】:
http請求方式: POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN POST數據格式:json POST數據例子:{"group":{"id":108,"name":"test2_modify2"}}
【參數說明】:
|
【返回說明】:
正常時的返回JSON數據包示例:
{"errcode": 0, "errmsg": "ok"}
錯誤時的JSON數據包示例(該示例爲AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
8.4移動用戶分組
【接口調用請求說明】:
http請求方式: POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=ACCESS_TOKEN POST數據格式:json POST數據例子:{"openid":"oDF3iYx0ro3_7jD4HFRDfrjdCM58","to_groupid":108}
【參數說明】:
|
【返回說明 】:
正常時的返回JSON數據包示例:
{"errcode": 0, "errmsg": "ok"}
錯誤時的JSON數據包示例(該示例爲AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
9. 上傳下載多媒體文件
公衆號在使用接口時,對多媒體文件、多媒體消息的獲取和調用等操做,是經過media_id來進行的。經過本接口,公衆號能夠上傳或下載多媒體文件。
【注意】:每一個多媒體文件(media_id)會在上傳、用戶發送到微信服務器3天后自動刪除,以節省服務器資源。
9.1上傳多媒體文件
公衆號可調用本接口來上傳圖片、語音、視頻等文件到微信服務器,上傳後服務器會返回對應的media_id,公衆號此後可根據該media_id來獲取多媒體。請注意,media_id是可複用的,調用該接口需http協議。
【接口調用請求說明】:
http請求方式: POST/FORM http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE 調用示例(使用curl命令,用FORM表單方式上傳一個多媒體文件): curl -F media=@test.jpg "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
【參數說明】:
|
【返回說明】:
正確狀況下的返回JSON數據包結果以下:
{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
【參數說明】:
|
錯誤狀況下的返回JSON數據包示例以下(示例爲無效媒體類型錯誤):
{"errcode":40004,"errmsg":"invalid media type"}
【注意事項】
1).上傳的多媒體文件有格式和大小限制,以下:
2).媒體文件在後臺保存時間爲3天,即3天后media_id失效。
9.2下載多媒體文件
公衆號可調用本接口來獲取多媒體文件。請注意,調用該接口需http協議。
【接口調用請求說明】:
http請求方式: GET http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID 請求示例(示例爲經過curl命令獲取多媒體文件) curl -I -G "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
【參數說明】:
|
【返回說明】:
正確狀況下的返回HTTP頭以下:
HTTP/1.1 200 OK Connection: close Content-Type: image/jpeg Content-disposition: attachment; filename="MEDIA_ID.jpg" Date: Sun, 06 Jan 2013 10:20:18 GMT Cache-Control: no-cache, must-revalidate Content-Length: 339721 curl -G "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
錯誤狀況下的返回JSON數據包示例以下(示例爲無效媒體ID錯誤):
{"errcode":40007,"errmsg":"invalid media_id"}