本篇於2017-5-11日更新,微信官方把用戶分組管理稱為標簽,標簽的分類如下,和分組一樣,0,1,2是微信的默認標簽ID,不可更改和刪除
主要功能如下:新建標簽(新建分組),刪除標簽(刪除分組),編輯標簽(編輯分組),同步官方數據(新增),不管是新增,編輯,刪除和同步,都需要先調用微信接口操作成功后,再更新或保存到本地,如果你想偷懶本地數據不想頻繁操作也可以,新建或編輯和刪除后,點擊再同步一次數據,也是一樣的。
完整效果圖如下:
本項目所用框架基於:layUI,官網:https://www.layui.com/
用戶標簽管理
開發者可以使用用戶標簽管理的相關接口,實現對公眾號的標簽進行創建、查詢、修改、刪除等操作,也可以對用戶進行打標簽、取消標簽等操作。
標簽管理
1. 創建標簽
一個公眾號,最多可以創建100個標簽。
接口調用請求說明
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN POST數據格式:JSON POST數據例子: { "tag" : { "name" : "廣東"//標簽名 } } |
參數說明
參數 | 說明 |
access_token | 調用接口憑據 |
name | 標簽名(30個字符以內) |
返回說明(正常時返回的json數據包示例)
{ "tag":{ "id":134,//標簽id "name":"廣東" } } |
返回參數說明
參數 | 說明 |
id | 標簽id,由微信分配 |
name | 標簽名,UTF8編碼 |
錯誤碼說明
錯誤碼 | 說明 |
-1 | 系統繁忙 |
45157 | 標簽名非法,請注意不能和其他標簽重名 |
45158 | 標簽名長度超過30個字節 |
45056 | 創建的標簽數過多,請注意不能超過100個 |
2. 獲取公眾號已創建的標簽
接口調用請求說明
http請求方式:GET(請使用https協議) https://api.weixin.qq.com/cgi-bin/tags/get?access_token=ACCESS_TOKEN |
返回說明
{ "tags":[{ "id":1, "name":"每天一罐可樂星人", "count":0 //此標簽下粉絲數 },{ "id":2, "name":"星標組", "count":0 },{ "id":127, "name":"廣東", "count":5 } ] } |
3. 編輯標簽
接口調用請求說明
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/tags/update?access_token=ACCESS_TOKEN POST數據格式:JSON POST數據例子: { "tag" : { "id" : 134, "name" : "廣東人" } } |
返回說明
{ "errcode":0, "errmsg":"ok" } |
錯誤碼說明
錯誤碼 | 說明 |
-1 | 系統繁忙 |
45157 | 標簽名非法,請注意不能和其他標簽重名 |
45158 | 標簽名長度超過30個字節 |
45058 | 不能修改0/1/2這三個系統默認保留的標簽 |
4. 刪除標簽
請注意,當某個標簽下的粉絲超過10w時,后台不可直接刪除標簽。此時,開發者可以對該標簽下的openid列表,先進行取消標簽的操作,直到粉絲數不超過10w后,才可直接刪除該標簽。
接口調用請求說明
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=ACCESS_TOKEN POST數據格式:JSON POST數據例子: { "tag":{ "id" : 134 } } |
返回說明
{ "errcode":0, "errmsg":"ok" } |
錯誤碼說明
錯誤碼 | 說明 |
-1 | 系統繁忙 |
45058 | 不能修改0/1/2這三個系統默認保留的標簽 |
45057 | 該標簽下粉絲數超過10w,不允許直接刪除 |
5. 獲取標簽下粉絲列表
接口調用請求說明
http請求方式:GET(請使用https協議) https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token=ACCESS_TOKEN POST數據格式:JSON POST數據例子: { "tagid" : 134, "next_openid":""//第一個拉取的OPENID,不填默認從頭開始拉取 } |
返回說明(正常時返回的json包示例)
{ "count":2,//這次獲取的粉絲數量 "data":{//粉絲列表 "openid":[ "ocYxcuAEy30bX0NXmGn4ypqx3tI0", "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" ] }, "next_openid":"ocYxcuBt0mRugKZ7tGAHPnUaOW7Y"//拉取列表最后一個用戶的openid } |
錯誤碼說明
錯誤碼 | 說明 |
-1 | 系統繁忙 |
40003 | 傳入非法的openid |
45159 | 非法的tag_id |
用戶管理
標簽功能目前支持公眾號為用戶打上最多20個標簽。
1. 批量為用戶打標簽
接口調用請求說明
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=ACCESS_TOKEN POST數據格式:JSON POST數據例子: { "openid_list" : [//粉絲列表 "ocYxcuAEy30bX0NXmGn4ypqx3tI0", "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" ], "tagid" : 134 } |
返回說明(正常時返回的json包示例)
{ "errcode":0, "errmsg":"ok" } |
錯誤碼說明
錯誤碼 | 說明 |
-1 | 系統繁忙 |
40032 | 每次傳入的openid列表個數不能超過50個 |
45159 | 非法的標簽 |
45059 | 有粉絲身上的標簽數已經超過限制,即超過20個 |
40003 | 傳入非法的openid |
49003 | 傳入的openid不屬於此AppID |
2. 批量為用戶取消標簽
接口調用請求說明
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token=ACCESS_TOKEN POST數據格式:JSON POST數據例子: { "openid_list" : [//粉絲列表 "ocYxcuAEy30bX0NXmGn4ypqx3tI0", "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" ], "tagid" : 134 } |
返回說明(正常時返回的json包示例)
{ "errcode":0, "errmsg":"ok" } |
錯誤碼說明
錯誤碼 | 說明 |
-1 | 系統繁忙 |
40032 | 每次傳入的openid列表個數不能超過50個 |
45159 | 非法的標簽 |
40003 | 傳入非法的openid |
49003 | 傳入的openid不屬於此AppID |
3. 獲取用戶身上的標簽列表
接口調用請求說明
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=ACCESS_TOKEN POST數據格式:JSON POST數據例子: { "openid" : "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" } |
返回說明(正常情況下返回的json示例)
{ "tagid_list":[//被置上的標簽列表 134, 2 ] } |
錯誤碼說明
錯誤碼 | 說明 |
-1 | 系統繁忙 |
40003 | 傳入非法的openid |
49003 | 傳入的openid不屬於此AppID |
一、同步官網數據的實現思路:
1.新建實體類,用於保存標簽的每個屬性,例如:labelID(標簽ID),labelName(標簽名),fansNumber(粉絲數)
2.從微信服務器獲取已創建好的標簽列表,保存到本地,保存前先刪除原有本地已保存的標簽數據
3.本地頁面加載數據時,是從本地數據庫加載的,不和微信打交道,只有點擊了同步數據按鈕,從重復的從微信服務器獲取已創建好的標簽列表,保存到本地,保存前先刪除原有本地已保存的標簽數據
我的實體類是這樣:
/// <summary> /// 微信用戶標簽組實體類 /// </summary> public class WeChat_UserLabelGroupInfo { /// <summary> /// 編號,自增列 /// </summary> public int Id { get; set; } /// <summary> /// 微信標簽ID /// </summary> public string labelId { get; set; } /// <summary> /// 微信標簽名 /// </summary> public string lableName { get; set; } /// <summary> /// 微信標簽名下的粉絲數 /// </summary> public string fansNumber { get; set; } }
二、新增標簽、編輯標簽。這兩個功能是重用一個頁面完成的,實現思路如下:
1.新增:非空驗證(必做),查找本地數據庫中是否存在相同的標簽名,如果沒有就發送新的數據到微信服務器
2.獲取到微信的返回碼之后,如果正常將新的數據進行本地化存儲
3.編輯:和新增一樣,頁面加載的時候獲取labelId是否為null
protected void Page_Load(object sender, EventArgs e) { if(!Page.IsPostBack) { if (Request.QueryString["labelId"] != null) { WeChat_UserLabelGroupService wugs = new WeChat_UserLabelGroupService(); WeChat_UserLabelGroupInfo wulgInfo = wugs.GetWeChat_UserLabelGroupInfoByLabelId(Request.QueryString["labelId"].ToString().Trim()); if(wulgInfo!=null) { this.txt_LabelName.Value = wulgInfo.lableName.ToString(); } } } }
保存代碼如下:
if (Request.QueryString["labelId"] != null) { //執行更新標簽 string posturl = "https://api.weixin.qq.com/cgi-bin/tags/update?access_token=" + Access_tokento; //POST數據格式:JSON string postData = "{\"tag\":{\"id\":\"" + Request.QueryString["labelId"].ToString().Trim() + "\",\"name\":\"" + this.txt_LabelName.Value.ToString().Trim() + "\"}}"; res = wxs.GetPage(posturl, postData); //使用前需要引用Newtonsoft.json.dll文件 JObject jsonObj = JObject.Parse(res); if (jsonObj["errcode"].ToString().Equals("0") && jsonObj["errmsg"].ToString().Equals("ok")) { int num = wugs.UpdateWeChat_UserLabelGroupInfoByLableId(Request.QueryString["labelId"].ToString(), this.txt_LabelName.Value.ToString().Trim()); if (num > 0) { logHelper.CreateXml(SessionUserInfo.UserName.ToString(), "編輯了"+Request.QueryString["labelId"].ToString()+"標簽組名."); ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('編輯成功!');", true); return; } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('編輯失敗!');", true); return; } } } else { //執行新增標簽 string posturl = "https://api.weixin.qq.com/cgi-bin/tags/create?access_token=" + Access_tokento; //string postData = "{\"group\":{\"name\":\""+this.txtgroupsName.Value.ToString().Trim()+"\"}}"; string postData = "{\"tag\":{\"name\":\"" + this.txt_LabelName.Value.ToString().Trim() + "\"}}"; res = wxs.GetPage(posturl, postData); //使用前需要引用Newtonsoft.json.dll文件 JObject jsonObj = JObject.Parse(res); if (jsonObj.ToString().Contains("id") && jsonObj.ToString().Contains("name")) { WeChat_UserLabelGroupInfo wulgInfo2 = new WeChat_UserLabelGroupInfo(); wulgInfo2.labelId = jsonObj["tag"]["id"].ToString(); wulgInfo2.lableName = jsonObj["tag"]["name"].ToString(); wulgInfo2.fansNumber = "0"; int num = wugs.AddWeChat_UserLabelGroupInfo(wulgInfo2); if (num > 0) { logHelper.CreateXml(SessionUserInfo.UserName.ToString(), "新建了一個標簽組."); ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('創建成功!');", true); } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('創建失敗!');", true); return; } } }
刪除標簽:
if (lbId.Text.ToString().Equals("0") || lbId.Text.ToString().Equals("1") || lbId.Text.ToString().Equals("2")) { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('系統默認標簽!無法刪除!');", true); return; }