2013年6月份開始,就陸陸續續的研究了一下微信公眾賬號的使用,整理了一篇《關於微信公眾平台的調研說明》的文檔。文檔從微信公眾賬號的注冊、設置,到微信公眾賬號平台管理的各個部分,都進行了介紹(微信升級之后,現在微信公眾賬號平台的界面可能和文檔中有所不同,但基本上通過這個文檔,也知道怎么去使用)。2013年11月份,對微信公眾賬號進行認證,另外得到了9個開放的接口,現將9個接口應用過程進行小結一下,文檔中的內容大部分來自於官方資料,另外加上了一些我個人應用過程中的一些理解,如有不正確的地方,歡迎大家指出。
1.語音識別
用戶給您的微信公眾賬號發送語音消息,微信服務器會先對語音消息進行識別,然后將識別出的文本內容和語音發送給您的微信公眾賬號的后台服務器。
發送方不帶語音識別功能的XML如下所示:
<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如下所示:
<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字段,該字段的內容是語音識別出的文本內容。
【參數說明】:
|
【注】:語音識別功能可以在我的服務頁面的高級接口欄目,通過開關來控制開啟和關閉。如下圖所示:
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).上傳的多媒體文件有格式和大小限制,如下:
- 圖片(image): 128K,支持JPG格式
- 語音(voice):256K,播放長度不超過60s,支持AMR格式
- 視頻(video):1MB,支持MP4格式
- 縮略圖(thumb):64KB,支持JPG格式
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"}