diff --git a/src/main/java/com/jfinal/weixin/api/APIConfig.java b/src/main/java/com/jfinal/weixin/api/APIConfig.java index 8b79c51e4941225482e56fdd165839f4bd927958..17631bcaef125ed67203afaf0681f4ecbaa51f60 100644 --- a/src/main/java/com/jfinal/weixin/api/APIConfig.java +++ b/src/main/java/com/jfinal/weixin/api/APIConfig.java @@ -84,4 +84,17 @@ public class APIConfig { public final static String WX__USER_OAUTH_AUTHORIZE_REFRESH = apiProp.get("user.oauth.refresh_token"); public final static String WX__USER_OAUTH_USERINFO = apiProp.get("user.oauth.userinfo"); + /** + * ====================================================== + * ==================== 用户标签管理 ================== + * ====================================================== + */ + public final static String WX__USER_TAGS_CREATE = apiProp.get("user.tags.create"); + public final static String WX__USER_TAGS_GET = apiProp.get("user.tags.get"); + public final static String WX__USER_TAGS_EDIT = apiProp.get("user.tags.edit"); + public final static String WX__USER_TAGS_DELETE = apiProp.get("user.tags.delete"); + public final static String WX__USER_TAGS_FANS_GET = apiProp.get("user.tags.fans.get"); + public final static String WX__USER_TAGS_TAGGING_BATCH = apiProp.get("user.tags.taging.batch"); + public final static String WX__USER_TAGS_UNTAGGING_BATCH = apiProp.get("user.tags.untaging.batch"); + public final static String WX__USER_TAGS_USER_GET = apiProp.get("user.tags.user.get"); } diff --git a/src/main/java/com/jfinal/weixin/api/UserTagApi.java b/src/main/java/com/jfinal/weixin/api/UserTagApi.java new file mode 100644 index 0000000000000000000000000000000000000000..7f5b1bb3eee64e80072c4f1fad4b5294787bf34f --- /dev/null +++ b/src/main/java/com/jfinal/weixin/api/UserTagApi.java @@ -0,0 +1,162 @@ +package com.jfinal.weixin.api; + +import com.alibaba.fastjson.JSON; +import com.jfinal.utils.http.HttpUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 用户标签管理的相关接口, + * 实现对公众号的标签进行创建、查询、修改、删除等操作, + * 也可以对用户进行打标签、取消标签等操作。 + * + * Created by shitiangao on 16/5/19. + */ +public enum UserTagApi { + ice; + + /** + * 创建标签 + * @param accessToken + * @param tagName + * @return + */ + public ApiResult createTag(String accessToken, String tagName) { + String url = APIConfig.WX__USER_TAGS_CREATE; + url = url.replace("ACCESS_TOKEN", accessToken); + + Map> postData = new HashMap<>(); + Map tagData = new HashMap<>(); + tagData.put("name", tagName); + + postData.put("tag", tagData); + + return ApiResult.create(HttpUtil.post(url, JSON.toJSONString(postData))); + } + + /** + * 编辑标签,通过 id 和 name + * @param accessToken + * @param tagId + * @param tagName + * @return + */ + public ApiResult editTag(String accessToken, Integer tagId, String tagName) { + String url = APIConfig.WX__USER_TAGS_EDIT; + url = url.replace("ACCESS_TOKEN", accessToken); + + Map> postData = new HashMap<>(); + Map tagData = new HashMap<>(); + tagData.put("name", tagName); + tagData.put("id", tagId); + + postData.put("tag", tagData); + + return ApiResult.create(HttpUtil.post(url, JSON.toJSONString(postData))); + } + + /** + * 获取公众号已创建的标签 + * @param accessToken + * @return + */ + public ApiResult getTags(String accessToken) { + String url = APIConfig.WX__USER_TAGS_GET; + url = url.replace("ACCESS_TOKEN", accessToken); + + return ApiResult.create(HttpUtil.post(url)); + } + + /** + * 删除标签 + * 注意:当某个标签下的粉丝超过10w时,后台不可直接删除标签 + * 要删除需先进行取消标签的操作,直到粉丝数不超过10w后,才可直接删除该标签。 + * @param accessToken + * @param tagId + * @return + */ + public ApiResult deleteTag(String accessToken, Integer tagId) { + String url = APIConfig.WX__USER_TAGS_DELETE; + url = url.replace("ACCESS_TOKEN", accessToken); + + Map> postData = new HashMap<>(); + Map tagData = new HashMap<>(); + tagData.put("id", tagId); + + postData.put("tag", tagData); + + return ApiResult.create(HttpUtil.post(url, JSON.toJSONString(postData))); + } + + /** + * 得到某个标签下的粉丝列表 + * @param accessToken + * @param tagId + * @param nextOpenid + * @return + */ + public ApiResult getFansList(String accessToken, Integer tagId, String nextOpenid) { + String url = APIConfig.WX__USER_TAGS_FANS_GET; + url = url.replace("ACCESS_TOKEN", accessToken); + + Map postData = new HashMap<>(); + postData.put("tagid", tagId); + postData.put("next_openid", nextOpenid == null ? "" : nextOpenid); + + return ApiResult.create(HttpUtil.post(url, JSON.toJSONString(postData))); + } + /** + * 批量给用户打标签 + * @param accessToken + * @param tagId + * @param openIdList + * @return + */ + public ApiResult taggingBatch(String accessToken, int tagId, List openIdList) { + String url = APIConfig.WX__USER_TAGS_TAGGING_BATCH; + url = url.replace("ACCESS_TOKEN", accessToken); + + Map postDataMap = new HashMap<>(); + postDataMap.put("openid_list", openIdList); + postDataMap.put("tagid", tagId); + + return ApiResult.create(HttpUtil.post(url, JSON.toJSONString(postDataMap))); + } + + /** + * 批量为取消用户的标签 + * @param accessToken + * @param tagId + * @param openIdList + * @return + */ + public ApiResult untaggingBatch(String accessToken, int tagId, List openIdList) { + String url = APIConfig.WX__USER_TAGS_UNTAGGING_BATCH; + url = url.replace("ACCESS_TOKEN", accessToken); + + Map postDataMap = new HashMap<>(); + postDataMap.put("openid_list", openIdList); + postDataMap.put("tagid", tagId); + + return ApiResult.create(HttpUtil.post(url, JSON.toJSONString(postDataMap))); + } + + /** + * 获取用户的标签列表 + * @param accessToken + * @param openId + * @return + */ + public ApiResult getTagidListOfUser(String accessToken, String openId) { + String url = APIConfig.WX__USER_TAGS_USER_GET; + url = url.replace("ACCESS_TOKEN", accessToken); + + Map postDataMap = new HashMap<>(); + postDataMap.put("openid", openId); + + return ApiResult.create(HttpUtil.post(url, JSON.toJSONString(postDataMap))); + } + +} diff --git a/src/main/java/com/jfinal/weixin/api/model/menu/MenuMatchrule.java b/src/main/java/com/jfinal/weixin/api/model/menu/MenuMatchrule.java index 0405422982b92906162435e19d7e19c1c5bc521e..d458267316cbdb8a1b66ccca647d2cdc0022d74c 100644 --- a/src/main/java/com/jfinal/weixin/api/model/menu/MenuMatchrule.java +++ b/src/main/java/com/jfinal/weixin/api/model/menu/MenuMatchrule.java @@ -18,7 +18,7 @@ public class MenuMatchrule implements Serializable { /** * 用户分组id,可通过用户分组管理接口获取 */ - private String group_id; + private String tag_id; /** * 性别:男(1)女(2),不填则不做匹配 @@ -44,4 +44,14 @@ public class MenuMatchrule implements Serializable { * 城市信息,是用户在微信中设置的地区,具体请参考地区信息表 */ private String city; + /** + * 1、简体中文 "zh_CN" 2、繁体中文TW "zh_TW" + * 3、繁体中文HK "zh_HK" 4、英文 "en" 5、印尼 "id" + * 6、马来 "ms" 7、西班牙 "es" 8、韩国 "ko" + * 9、意大利 "it" 10、日本 "ja" 11、波兰 "pl" + * 12、葡萄牙 "pt" 13、俄国 "ru" 14、泰文 "th" + * 15、越南 "vi" 16、阿拉伯语 "ar" 17、北印度 "hi" + * 18、希伯来 "he" 19、土耳其 "tr" 20、德语 "de" 21、法语 "fr" + */ + private String language; } diff --git a/src/main/resources/error_code.properties b/src/main/resources/error_code.properties index 3893b4035d9ef681f9161f2d8139021f6a0d83a9..0bc5b16fcdc77757f142e1883c5ea73af37d456c 100644 --- a/src/main/resources/error_code.properties +++ b/src/main/resources/error_code.properties @@ -1,142 +1,149 @@ -#微信公众平台全局返回码说明(中文) +#\u5FAE\u4FE1\u516C\u4F17\u5E73\u53F0\u5168\u5C40\u8FD4\u56DE\u7801\u8BF4\u660E(\u4E2D\u6587) # -#author:凡梦星尘(elkan1788@gmail.com) -# 高轩雾褪(977903096@qq.com) +#author:\u51E1\u68A6\u661F\u5C18(elkan1788@gmail.com) +# \u9AD8\u8F69\u96FE\u892A(977903096@qq.com) -#系统类型 --1=系统繁忙,此时请开发者稍候再试. -0=请求成功. +#\u7CFB\u7EDF\u7C7B\u578B +-1=\u7CFB\u7EDF\u7E41\u5FD9,\u6B64\u65F6\u8BF7\u5F00\u53D1\u8005\u7A0D\u5019\u518D\u8BD5. +0=\u8BF7\u6C42\u6210\u529F. -#消息类型 -40001=获取access_token时AppSecret错误,或者access_token无效.\ -请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口. -40002=不合法的凭证类型. -40003=不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,\ -或是否是其他公众号的OpenID. -40004=不合法的媒体文件类型. -40005=不合法的文件类型. -40006=不合法的文件大小. -40007=不合法的媒体文件id. -40008=不合法的消息类型. -40009=不合法的图片文件大小. -40010=不合法的语音文件大小. -40011=不合法的视频文件大小. -40012=不合法的缩略图文件大小. -40013=不合法的AppID,请开发者检查AppID的正确性,避免异常字符,注意大小写. -40014=不合法的access_token,请开发者认真比对access_token的有效性\ -(如是否过期),或查看是否正在为恰当的公众号调用接口. -40015=不合法的菜单类型. -40016=不合法的按钮个数. -40017=不合法的按钮个数. -40018=不合法的按钮名字长度. -40019=不合法的按钮KEY长度. -40020=不合法的按钮URL长度. -40021=不合法的菜单版本号. -40022=不合法的子菜单级数. -40023=不合法的子菜单按钮个数. -40024=不合法的子菜单按钮类型. -40025=不合法的子菜单按钮名字长度. -40026=不合法的子菜单按钮KEY长度. -40027=不合法的子菜单按钮URL长度. -40028=不合法的自定义菜单使用用户. -40029=不合法的oauth_code. -40030=不合法的refresh_token. -40031=不合法的openid列表. -40032=不合法的openid列表长度. -40033=不合法的请求字符,不能包含\\uxxxx格式的字符. -40035=不合法的参数. -40038=不合法的请求格式. -40039=不合法的URL长度. -40050=不合法的分组id. -40051=分组名字不合法. -40117=分组名字不合法. -40118=media_id大小不合法. -40119=button类型错误. -40120=button类型错误. -40121=不合法的media_id类型. -40132=微信号不合法. -40137=不支持的图片格式. -41001=缺少access_token参数. -41002=缺少appid参数. -41003=缺少refresh_token参数. -41004=缺少secret参数. -41005=缺少多媒体文件数据. -41006=缺少media_id参数. -41007=缺少子菜单数据. -41008=缺少oauthcode. -41009=缺少openid. -42001=access_token超时,请检查access_token的有效期,请参考基础支持-获取\ -access_token中,对access_token的详细机制说明. -42002=refresh_token超时. -42003=oauth_code超时. -43001=需要GET请求. -43002=需要POST请求. -43003=需要HTTPS请求. -43004=需要接收者关注. -43005=需要好友关系. -44001=多媒体文件为空. -44002=POST的数据包为空. -44003=图文消息内容为空. -44004=文本消息内容为空. -45001=多媒体文件大小超过限制. -45002=消息内容超过限制. -45003=标题字段超过限制. -45004=描述字段超过限制. -45005=链接字段超过限制. -45006=图片链接字段超过限制. -45007=语音播放时间超过限制. -45008=图文消息超过限制. -45009=接口调用超过限制. -45010=创建菜单个数超过限制. -45011=API调用频率太快受限制. -45015=回复时间超过限制. -45016=系统分组,不允许修改. -45017=分组名字过长. -45018=分组数量超过上限. -46001=不存在媒体数据. -46002=不存在的菜单版本. -46003=不存在的菜单数据. -46004=不存在的用户. -47001=解析JSON/XML内容错误. -48001=api功能未授权,请确认公众号已获得该接口,可以在\ -公众平台官网-开发者中心页中查看接口权限. -50001=用户未授权该api. -50002=用户受限,可能是违规后接口被封禁. -61451=参数错误. -61452=无效客服账号. -61453=客服帐号已存在. -61454=客服帐号名长度超过限制(仅允许10个英文字符,\ -不包括@及@后的公众号的微信号). -61455=客服帐号名包含非法字符(仅允许英文+数字). -61456=客服帐号个数超过限制(10个客服账号). -61457=无效头像文件类型. -61450=系统错误. -61500=日期格式错误. -61501=日期范围错误. -9001001=POST数据参数不合法. -9001002=远端服务不可用. -9001003=Ticket不合法. -9001004=获取摇周边用户信息失败. -9001005=获取商户信息失败. -9001006=获取OpenID失败. -9001007=上传文件缺失. -9001008=上传素材的文件类型不合法. -9001009=上传素材的文件尺寸不合法. -9001010=上传失败. -9001020=帐号不合法. -9001021=已有设备激活率低于50%,不能新增设备. -9001022=设备申请数不合法,必须为大于0的数字. -9001023=已存在审核中的设备ID申请. -9001024=一次查询设备ID数量不能超过50. -9001025=设备ID不合法. -9001026=页面ID不合法. -9001027=页面参数不合法. -9001028=一次删除页面ID数量不能超过10. -9001029=页面已应用在设备中,请先解除应用关系再删除. -9001030=一次查询页面ID数量不能超过50. -9001031=时间区间不合法. -9001032=保存设备与页面的绑定关系参数错误. -9001033=门店ID不合法. -9001034=设备备注信息过长. -9001035=设备申请参数不合法. -9001036=查询起始值begin不合法. +#\u6D88\u606F\u7C7B\u578B +40001=\u83B7\u53D6access_token\u65F6AppSecret\u9519\u8BEF,\u6216\u8005access_token\u65E0\u6548.\ +\u8BF7\u5F00\u53D1\u8005\u8BA4\u771F\u6BD4\u5BF9AppSecret\u7684\u6B63\u786E\u6027,\u6216\u67E5\u770B\u662F\u5426\u6B63\u5728\u4E3A\u6070\u5F53\u7684\u516C\u4F17\u53F7\u8C03\u7528\u63A5\u53E3. +40002=\u4E0D\u5408\u6CD5\u7684\u51ED\u8BC1\u7C7B\u578B. +40003=\u4E0D\u5408\u6CD5\u7684OpenID,\u8BF7\u5F00\u53D1\u8005\u786E\u8BA4OpenID\uFF08\u8BE5\u7528\u6237\uFF09\u662F\u5426\u5DF2\u5173\u6CE8\u516C\u4F17\u53F7,\ +\u6216\u662F\u5426\u662F\u5176\u4ED6\u516C\u4F17\u53F7\u7684OpenID. +40004=\u4E0D\u5408\u6CD5\u7684\u5A92\u4F53\u6587\u4EF6\u7C7B\u578B. +40005=\u4E0D\u5408\u6CD5\u7684\u6587\u4EF6\u7C7B\u578B. +40006=\u4E0D\u5408\u6CD5\u7684\u6587\u4EF6\u5927\u5C0F. +40007=\u4E0D\u5408\u6CD5\u7684\u5A92\u4F53\u6587\u4EF6id. +40008=\u4E0D\u5408\u6CD5\u7684\u6D88\u606F\u7C7B\u578B. +40009=\u4E0D\u5408\u6CD5\u7684\u56FE\u7247\u6587\u4EF6\u5927\u5C0F. +40010=\u4E0D\u5408\u6CD5\u7684\u8BED\u97F3\u6587\u4EF6\u5927\u5C0F. +40011=\u4E0D\u5408\u6CD5\u7684\u89C6\u9891\u6587\u4EF6\u5927\u5C0F. +40012=\u4E0D\u5408\u6CD5\u7684\u7F29\u7565\u56FE\u6587\u4EF6\u5927\u5C0F. +40013=\u4E0D\u5408\u6CD5\u7684AppID,\u8BF7\u5F00\u53D1\u8005\u68C0\u67E5AppID\u7684\u6B63\u786E\u6027,\u907F\u514D\u5F02\u5E38\u5B57\u7B26,\u6CE8\u610F\u5927\u5C0F\u5199. +40014=\u4E0D\u5408\u6CD5\u7684access_token,\u8BF7\u5F00\u53D1\u8005\u8BA4\u771F\u6BD4\u5BF9access_token\u7684\u6709\u6548\u6027\ +\uFF08\u5982\u662F\u5426\u8FC7\u671F\uFF09,\u6216\u67E5\u770B\u662F\u5426\u6B63\u5728\u4E3A\u6070\u5F53\u7684\u516C\u4F17\u53F7\u8C03\u7528\u63A5\u53E3. +40015=\u4E0D\u5408\u6CD5\u7684\u83DC\u5355\u7C7B\u578B. +40016=\u4E0D\u5408\u6CD5\u7684\u6309\u94AE\u4E2A\u6570. +40017=\u4E0D\u5408\u6CD5\u7684\u6309\u94AE\u4E2A\u6570. +40018=\u4E0D\u5408\u6CD5\u7684\u6309\u94AE\u540D\u5B57\u957F\u5EA6. +40019=\u4E0D\u5408\u6CD5\u7684\u6309\u94AEKEY\u957F\u5EA6. +40020=\u4E0D\u5408\u6CD5\u7684\u6309\u94AEURL\u957F\u5EA6. +40021=\u4E0D\u5408\u6CD5\u7684\u83DC\u5355\u7248\u672C\u53F7. +40022=\u4E0D\u5408\u6CD5\u7684\u5B50\u83DC\u5355\u7EA7\u6570. +40023=\u4E0D\u5408\u6CD5\u7684\u5B50\u83DC\u5355\u6309\u94AE\u4E2A\u6570. +40024=\u4E0D\u5408\u6CD5\u7684\u5B50\u83DC\u5355\u6309\u94AE\u7C7B\u578B. +40025=\u4E0D\u5408\u6CD5\u7684\u5B50\u83DC\u5355\u6309\u94AE\u540D\u5B57\u957F\u5EA6. +40026=\u4E0D\u5408\u6CD5\u7684\u5B50\u83DC\u5355\u6309\u94AEKEY\u957F\u5EA6. +40027=\u4E0D\u5408\u6CD5\u7684\u5B50\u83DC\u5355\u6309\u94AEURL\u957F\u5EA6. +40028=\u4E0D\u5408\u6CD5\u7684\u81EA\u5B9A\u4E49\u83DC\u5355\u4F7F\u7528\u7528\u6237. +40029=\u4E0D\u5408\u6CD5\u7684oauth_code. +40030=\u4E0D\u5408\u6CD5\u7684refresh_token. +40031=\u4E0D\u5408\u6CD5\u7684openid\u5217\u8868. +40032=\u4E0D\u5408\u6CD5\u7684openid\u5217\u8868\u957F\u5EA6. +40033=\u4E0D\u5408\u6CD5\u7684\u8BF7\u6C42\u5B57\u7B26,\u4E0D\u80FD\u5305\u542B\\uxxxx\u683C\u5F0F\u7684\u5B57\u7B26. +40035=\u4E0D\u5408\u6CD5\u7684\u53C2\u6570. +40038=\u4E0D\u5408\u6CD5\u7684\u8BF7\u6C42\u683C\u5F0F. +40039=\u4E0D\u5408\u6CD5\u7684URL\u957F\u5EA6. +40050=\u4E0D\u5408\u6CD5\u7684\u5206\u7EC4id. +40051=\u5206\u7EC4\u540D\u5B57\u4E0D\u5408\u6CD5. +40117=\u5206\u7EC4\u540D\u5B57\u4E0D\u5408\u6CD5. +40118=media_id\u5927\u5C0F\u4E0D\u5408\u6CD5. +40119=button\u7C7B\u578B\u9519\u8BEF. +40120=button\u7C7B\u578B\u9519\u8BEF. +40121=\u4E0D\u5408\u6CD5\u7684media_id\u7C7B\u578B. +40132=\u5FAE\u4FE1\u53F7\u4E0D\u5408\u6CD5. +40137=\u4E0D\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F. +41001=\u7F3A\u5C11access_token\u53C2\u6570. +41002=\u7F3A\u5C11appid\u53C2\u6570. +41003=\u7F3A\u5C11refresh_token\u53C2\u6570. +41004=\u7F3A\u5C11secret\u53C2\u6570. +41005=\u7F3A\u5C11\u591A\u5A92\u4F53\u6587\u4EF6\u6570\u636E. +41006=\u7F3A\u5C11media_id\u53C2\u6570. +41007=\u7F3A\u5C11\u5B50\u83DC\u5355\u6570\u636E. +41008=\u7F3A\u5C11oauthcode. +41009=\u7F3A\u5C11openid. +42001=access_token\u8D85\u65F6,\u8BF7\u68C0\u67E5access_token\u7684\u6709\u6548\u671F,\u8BF7\u53C2\u8003\u57FA\u7840\u652F\u6301-\u83B7\u53D6\ +access_token\u4E2D,\u5BF9access_token\u7684\u8BE6\u7EC6\u673A\u5236\u8BF4\u660E. +42002=refresh_token\u8D85\u65F6. +42003=oauth_code\u8D85\u65F6. +43001=\u9700\u8981GET\u8BF7\u6C42. +43002=\u9700\u8981POST\u8BF7\u6C42. +43003=\u9700\u8981HTTPS\u8BF7\u6C42. +43004=\u9700\u8981\u63A5\u6536\u8005\u5173\u6CE8. +43005=\u9700\u8981\u597D\u53CB\u5173\u7CFB. +44001=\u591A\u5A92\u4F53\u6587\u4EF6\u4E3A\u7A7A. +44002=POST\u7684\u6570\u636E\u5305\u4E3A\u7A7A. +44003=\u56FE\u6587\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A. +44004=\u6587\u672C\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A. +45001=\u591A\u5A92\u4F53\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236. +45002=\u6D88\u606F\u5185\u5BB9\u8D85\u8FC7\u9650\u5236. +45003=\u6807\u9898\u5B57\u6BB5\u8D85\u8FC7\u9650\u5236. +45004=\u63CF\u8FF0\u5B57\u6BB5\u8D85\u8FC7\u9650\u5236. +45005=\u94FE\u63A5\u5B57\u6BB5\u8D85\u8FC7\u9650\u5236. +45006=\u56FE\u7247\u94FE\u63A5\u5B57\u6BB5\u8D85\u8FC7\u9650\u5236. +45007=\u8BED\u97F3\u64AD\u653E\u65F6\u95F4\u8D85\u8FC7\u9650\u5236. +45008=\u56FE\u6587\u6D88\u606F\u8D85\u8FC7\u9650\u5236. +45009=\u63A5\u53E3\u8C03\u7528\u8D85\u8FC7\u9650\u5236. +45010=\u521B\u5EFA\u83DC\u5355\u4E2A\u6570\u8D85\u8FC7\u9650\u5236. +45011=API\u8C03\u7528\u9891\u7387\u592A\u5FEB\u53D7\u9650\u5236. +45015=\u56DE\u590D\u65F6\u95F4\u8D85\u8FC7\u9650\u5236. +45016=\u7CFB\u7EDF\u5206\u7EC4,\u4E0D\u5141\u8BB8\u4FEE\u6539. +45017=\u5206\u7EC4\u540D\u5B57\u8FC7\u957F. +45018=\u5206\u7EC4\u6570\u91CF\u8D85\u8FC7\u4E0A\u9650. +45056=\u521B\u5EFA\u7684\u6807\u7B7E\u6570\u8FC7\u591A\uFF0C\u8BF7\u6CE8\u610F\u4E0D\u80FD\u8D85\u8FC7100\u4E2A +45057=\u8BE5\u6807\u7B7E\u4E0B\u7C89\u4E1D\u6570\u8D85\u8FC710w\uFF0C\u4E0D\u5141\u8BB8\u76F4\u63A5\u5220\u9664 +45058=\u4E0D\u80FD\u4FEE\u65390/1/2\u8FD9\u4E09\u4E2A\u7CFB\u7EDF\u9ED8\u8BA4\u4FDD\u7559\u7684\u6807\u7B7E +45059=\u6709\u7C89\u4E1D\u8EAB\u4E0A\u7684\u6807\u7B7E\u6570\u5DF2\u7ECF\u8D85\u8FC7\u9650\u5236 +45157=\u6807\u7B7E\u540D\u975E\u6CD5\uFF0C\u8BF7\u6CE8\u610F\u4E0D\u80FD\u548C\u5176\u4ED6\u6807\u7B7E\u91CD\u540D +45158=\u6807\u7B7E\u540D\u957F\u5EA6\u8D85\u8FC730\u4E2A\u5B57\u8282 +45159=\u975E\u6CD5\u7684tag_id +46001=\u4E0D\u5B58\u5728\u5A92\u4F53\u6570\u636E. +46002=\u4E0D\u5B58\u5728\u7684\u83DC\u5355\u7248\u672C. +46003=\u4E0D\u5B58\u5728\u7684\u83DC\u5355\u6570\u636E. +46004=\u4E0D\u5B58\u5728\u7684\u7528\u6237. +47001=\u89E3\u6790JSON/XML\u5185\u5BB9\u9519\u8BEF. +48001=api\u529F\u80FD\u672A\u6388\u6743,\u8BF7\u786E\u8BA4\u516C\u4F17\u53F7\u5DF2\u83B7\u5F97\u8BE5\u63A5\u53E3,\u53EF\u4EE5\u5728\ +\u516C\u4F17\u5E73\u53F0\u5B98\u7F51-\u5F00\u53D1\u8005\u4E2D\u5FC3\u9875\u4E2D\u67E5\u770B\u63A5\u53E3\u6743\u9650. +50001=\u7528\u6237\u672A\u6388\u6743\u8BE5api. +50002=\u7528\u6237\u53D7\u9650,\u53EF\u80FD\u662F\u8FDD\u89C4\u540E\u63A5\u53E3\u88AB\u5C01\u7981. +61451=\u53C2\u6570\u9519\u8BEF. +61452=\u65E0\u6548\u5BA2\u670D\u8D26\u53F7. +61453=\u5BA2\u670D\u5E10\u53F7\u5DF2\u5B58\u5728. +61454=\u5BA2\u670D\u5E10\u53F7\u540D\u957F\u5EA6\u8D85\u8FC7\u9650\u5236(\u4EC5\u5141\u8BB810\u4E2A\u82F1\u6587\u5B57\u7B26,\ +\u4E0D\u5305\u62EC@\u53CA@\u540E\u7684\u516C\u4F17\u53F7\u7684\u5FAE\u4FE1\u53F7). +61455=\u5BA2\u670D\u5E10\u53F7\u540D\u5305\u542B\u975E\u6CD5\u5B57\u7B26(\u4EC5\u5141\u8BB8\u82F1\u6587+\u6570\u5B57). +61456=\u5BA2\u670D\u5E10\u53F7\u4E2A\u6570\u8D85\u8FC7\u9650\u5236(10\u4E2A\u5BA2\u670D\u8D26\u53F7). +61457=\u65E0\u6548\u5934\u50CF\u6587\u4EF6\u7C7B\u578B. +61450=\u7CFB\u7EDF\u9519\u8BEF. +61500=\u65E5\u671F\u683C\u5F0F\u9519\u8BEF. +61501=\u65E5\u671F\u8303\u56F4\u9519\u8BEF. +9001001=POST\u6570\u636E\u53C2\u6570\u4E0D\u5408\u6CD5. +9001002=\u8FDC\u7AEF\u670D\u52A1\u4E0D\u53EF\u7528. +9001003=Ticket\u4E0D\u5408\u6CD5. +9001004=\u83B7\u53D6\u6447\u5468\u8FB9\u7528\u6237\u4FE1\u606F\u5931\u8D25. +9001005=\u83B7\u53D6\u5546\u6237\u4FE1\u606F\u5931\u8D25. +9001006=\u83B7\u53D6OpenID\u5931\u8D25. +9001007=\u4E0A\u4F20\u6587\u4EF6\u7F3A\u5931. +9001008=\u4E0A\u4F20\u7D20\u6750\u7684\u6587\u4EF6\u7C7B\u578B\u4E0D\u5408\u6CD5. +9001009=\u4E0A\u4F20\u7D20\u6750\u7684\u6587\u4EF6\u5C3A\u5BF8\u4E0D\u5408\u6CD5. +9001010=\u4E0A\u4F20\u5931\u8D25. +9001020=\u5E10\u53F7\u4E0D\u5408\u6CD5. +9001021=\u5DF2\u6709\u8BBE\u5907\u6FC0\u6D3B\u7387\u4F4E\u4E8E50%,\u4E0D\u80FD\u65B0\u589E\u8BBE\u5907. +9001022=\u8BBE\u5907\u7533\u8BF7\u6570\u4E0D\u5408\u6CD5,\u5FC5\u987B\u4E3A\u5927\u4E8E0\u7684\u6570\u5B57. +9001023=\u5DF2\u5B58\u5728\u5BA1\u6838\u4E2D\u7684\u8BBE\u5907ID\u7533\u8BF7. +9001024=\u4E00\u6B21\u67E5\u8BE2\u8BBE\u5907ID\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC750. +9001025=\u8BBE\u5907ID\u4E0D\u5408\u6CD5. +9001026=\u9875\u9762ID\u4E0D\u5408\u6CD5. +9001027=\u9875\u9762\u53C2\u6570\u4E0D\u5408\u6CD5. +9001028=\u4E00\u6B21\u5220\u9664\u9875\u9762ID\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC710. +9001029=\u9875\u9762\u5DF2\u5E94\u7528\u5728\u8BBE\u5907\u4E2D,\u8BF7\u5148\u89E3\u9664\u5E94\u7528\u5173\u7CFB\u518D\u5220\u9664. +9001030=\u4E00\u6B21\u67E5\u8BE2\u9875\u9762ID\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC750. +9001031=\u65F6\u95F4\u533A\u95F4\u4E0D\u5408\u6CD5. +9001032=\u4FDD\u5B58\u8BBE\u5907\u4E0E\u9875\u9762\u7684\u7ED1\u5B9A\u5173\u7CFB\u53C2\u6570\u9519\u8BEF. +9001033=\u95E8\u5E97ID\u4E0D\u5408\u6CD5. +9001034=\u8BBE\u5907\u5907\u6CE8\u4FE1\u606F\u8FC7\u957F. +9001035=\u8BBE\u5907\u7533\u8BF7\u53C2\u6570\u4E0D\u5408\u6CD5. +9001036=\u67E5\u8BE2\u8D77\u59CB\u503Cbegin\u4E0D\u5408\u6CD5. diff --git a/src/main/resources/wechat_api.properties b/src/main/resources/wechat_api.properties index 4a3cdf8a072c502f64398a08efc14b03ce17214d..45257cf651472f451d6372290d9c4eb816cc85cd 100644 --- a/src/main/resources/wechat_api.properties +++ b/src/main/resources/wechat_api.properties @@ -64,5 +64,22 @@ user.oauth.access_token = https://api.weixin.qq.com/sns/oauth2/access_token?appi ## \u5237\u65B0access_token\uFF08\u5982\u679C\u9700\u8981\uFF09 user.oauth.refresh_token = https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN ## \u62C9\u53D6\u7528\u6237\u4FE1\u606F(\u9700scope\u4E3A snsapi_userinfo) -user.oauth.userinfo = https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN +user.oauth.userinfo = https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN### ======================== \u6388\u6743\u83B7\u53D6\u7528\u6237\u4FE1\u606F ========================= +### ======================== \u7528\u6237\u6807\u7B7E\u7BA1\u7406 ========================= +## \u521B\u5EFA\u7528\u6237\u6807\u7B7E +user.tags.create = https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u5DF2\u7ECF\u521B\u5EFA\u7684\u6807\u7B7E +user.tags.get = https://api.weixin.qq.com/cgi-bin/tags/get?access_token=ACCESS_TOKEN +## \u7F16\u8F91\u6807\u7B7E +user.tags.edit = https://api.weixin.qq.com/cgi-bin/tags/update?access_token=ACCESS_TOKEN +## \u5220\u9664\u6807\u7B7E +user.tags.delete = https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u6807\u7B7E\u7C89\u4E1D\u5217\u8868 +user.tags.fans.get = https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token=ACCESS_TOKEN +## \u6279\u91CF\u4E3A\u7528\u6237\u6253\u6807\u7B7E +user.tags.taging.batch = https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=ACCESS_TOKEN +## \u6279\u91CF\u4E3A\u7528\u6237\u53D6\u6D88\u6807\u7B7E +user.tags.untaging.batch = https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u7528\u6237\u8EAB\u4E0A\u7684\u6807\u7B7E\u5217\u8868 +user.tags.user.get = https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=ACCESS_TOKEN \ No newline at end of file diff --git a/src/test/java/com/jfinal/weixin/api/UserTagApiTest.java b/src/test/java/com/jfinal/weixin/api/UserTagApiTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d5c8994b9b863450c84668503ecfba3fd785ae23 --- /dev/null +++ b/src/test/java/com/jfinal/weixin/api/UserTagApiTest.java @@ -0,0 +1,84 @@ +package com.jfinal.weixin.api; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + + * Created by shitiangao on 16/5/19. + */ +public class UserTagApiTest { + + private String appId = ""; + private String appSecret = ""; + String token = ""; + + //测试时得到一个 accessToken,不然频繁调用微信系统报系统繁忙 + static { +// System.out.println(AccessTokenApi.ice.getAccessToken(appId, appSecret).getAccess_token()); + } + @Test + public void testCreateTag() throws Exception { + ApiResult res = UserTagApi.ice.createTag(token, "吃吃吃"); + System.out.println(res.getJson()); + ApiResult res2 = UserTagApi.ice.createTag(token, "玩玩玩"); + System.out.println(res2.getJson()); + } + + @Test + public void testGetTags() throws Exception { +// System.out.println(AccessTokenApi.ice.getAccessToken(appId, appSecret).getAccess_token()); + ApiResult res = UserTagApi.ice.getTags(token); + System.out.println(res.getJson()); + } + + @Test + public void testEditTag() throws Exception { + ApiResult res = UserTagApi.ice.editTag(token, 101, "神经猫"); + System.out.println(res.getJson()); + } + + @Test + public void testDeleteTag() throws Exception { + ApiResult res = UserTagApi.ice.deleteTag(token, 100); + System.out.println(res.getJson()); + } + + @Test + public void testTaggingBatch() throws Exception { +// //获得关注列表 +// ApiResult res = UserApi.ice.getFollowerList(token, ""); +// System.out.println(res.getJson()); + + List list = new ArrayList<>(); + list.add("o6b7rwgqiafQbHH5qSslJobCNr5E"); + list.add("o6b7rwjzwhHH1vjLz3_4qKHeUGRc"); + + ApiResult res = UserTagApi.ice.taggingBatch(token, 2, list); + System.out.println(res.getJson()); + } + + @Test + public void testUntaggingBatch() throws Exception { + List list = new ArrayList<>(); + list.add("o6b7rwgqiafQbHH5qSslJobCNr5E"); + list.add("o6b7rwjzwhHH1vjLz3_4qKHeUGRc"); + + ApiResult res = UserTagApi.ice.untaggingBatch(token, 2, list); + System.out.println(res.getJson()); + } + + @Test + public void testGetTagidListOfUser() throws Exception { + ApiResult res = UserTagApi.ice.getTagidListOfUser(token, "o6b7rwgqiafQbHH5qSslJobCNr5E"); + System.out.println(res.getJson()); + } + + @Test + public void testGetFansList() throws Exception { + ApiResult res = UserTagApi.ice.getFansList(token, 102, ""); + System.out.println(res.getJson()); + } +} \ No newline at end of file diff --git a/src/test/resources/wechat_api.properties b/src/test/resources/wechat_api.properties index 4ecbb668d9d7392483aa29c44c4f967fb82014e2..45257cf651472f451d6372290d9c4eb816cc85cd 100644 --- a/src/test/resources/wechat_api.properties +++ b/src/test/resources/wechat_api.properties @@ -1,23 +1,28 @@ ## \u8FDE\u63A5WeChat\u516C\u4F17\u5E73\u53F0\u6240\u9700\u8981\u7684\u914D\u7F6E ### ======================== \u83B7\u53D6\u63A5\u53E3\u8C03\u7528\u51ED\u8BC1 ========================= - ## \u83B7\u53D6access_token\u7684\u63A5\u53E3\u5730\u5740\uFF08GET\uFF09 \u9650200\uFF08\u6B21/\u5929\uFF09 -access_token_url = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET - +access_token = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET ## \u83B7\u53D6\u5FAE\u4FE1\u670D\u52A1\u5668IP\u5730\u5740 callbackip = https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN -### ======================== \u81EA\u5B9A\u4E49\u83DC\u5355\u7BA1\u7406 ========================= - +### ======================== \u9ED8\u8BA4\u81EA\u5B9A\u4E49\u83DC\u5355\u7BA1\u7406 ========================= ## \u81EA\u5B9A\u4E49\u83DC\u5355\u521B\u5EFA\uFF08POST\uFF09 \u9650100\uFF08\u6B21/\u5929\uFF09 -menu_create_url = https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN - +menu.create = https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN ## \u67E5\u8BE2\u81EA\u5B9A\u4E49\u83DC\u5355 -menu_get_url = https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN - +menu.get = https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN ## \u81EA\u5B9A\u4E49\u83DC\u5355\u5220\u9664 -menu_delete_url = https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN +menu.delete = https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u81EA\u5B9A\u4E49\u83DC\u5355\u914D\u7F6E +menu.get_current_self_menu_info = https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN + +### ======================== \u4E2A\u6027\u5316\u81EA\u5B9A\u4E49\u83DC\u5355\u7BA1\u7406 ========================= +## \u521B\u5EFA\u4E2A\u6027\u5316\u81EA\u5B9A\u4E49\u83DC\u5355 +menu.create_conditional = https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=ACCESS_TOKEN +## \u5220\u9664\u4E2A\u6027\u5316\u81EA\u5B9A\u4E49\u83DC\u5355 +menu.delete_conditional = https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token=ACCESS_TOKEN +## \u6D4B\u8BD5\u4E2A\u6027\u5316\u81EA\u5B9A\u4E49\u83DC\u5355\u5339\u914D\u7ED3\u679C +menu.trymatch_conditional = https://api.weixin.qq.com/cgi-bin/menu/trymatch?access_token=ACCESS_TOKEN ### ======================== \u53D1\u9001\u6D88\u606F ========================= @@ -25,3 +30,56 @@ menu_delete_url = https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACC custom_message_send_url = https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN +### ======================== \u7528\u6237\u5206\u7EC4\u7BA1\u7406 ========================= +## \u521B\u5EFA\u5206\u7EC4 +user.group_create = https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN +## \u67E5\u8BE2\u6240\u6709\u5206\u7EC4 +user.group_get_all = https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN +## \u67E5\u8BE2\u7528\u6237\u6240\u5728\u5206\u7EC4 +user.group_get_id = https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=ACCESS_TOKEN +## \u4FEE\u6539\u5206\u7EC4\u540D +user.group_update = https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN +## \u79FB\u52A8\u7528\u6237\u5206\u7EC4 +user.group_move = https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=ACCESS_TOKEN +## \u6279\u91CF\u79FB\u52A8\u7528\u6237\u5206\u7EC4 +user.group_move_batch = https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate?access_token=ACCESS_TOKEN +## \u5220\u9664\u5206\u7EC4 +user.group.delete = https://api.weixin.qq.com/cgi-bin/groups/delete?access_token=ACCESS_TOKEN + +### ======================== \u7528\u6237\u7BA1\u7406 ========================= +## \u8BBE\u7F6E\u7528\u6237\u5907\u6CE8\u540D\u79F0 +user.updateremark = https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u7528\u6237\u57FA\u672C\u4FE1\u606F(UnionID\u673A\u5236) +user.get_info = https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN +## \u6279\u91CF\u83B7\u53D6\u7528\u6237\u4FE1\u606F +user.get_info_batch = https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN +## \u6279\u91CF\u62C9\u53D6\u7528\u6237OPENID +user.get_openid_list = https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID + +### ======================== \u6388\u6743\u83B7\u53D6\u7528\u6237\u4FE1\u606F ========================= +## \u6388\u6743\u8FDE\u63A5\u5C01\u88C5 +user.oauth.url = https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect +## \u901A\u8FC7code\u6362\u53D6\u7F51\u9875\u6388\u6743access_token +user.oauth.access_token = https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code +## \u5237\u65B0access_token\uFF08\u5982\u679C\u9700\u8981\uFF09 +user.oauth.refresh_token = https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN +## \u62C9\u53D6\u7528\u6237\u4FE1\u606F(\u9700scope\u4E3A snsapi_userinfo) +user.oauth.userinfo = https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN### ======================== \u6388\u6743\u83B7\u53D6\u7528\u6237\u4FE1\u606F ========================= + +### ======================== \u7528\u6237\u6807\u7B7E\u7BA1\u7406 ========================= +## \u521B\u5EFA\u7528\u6237\u6807\u7B7E +user.tags.create = https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u5DF2\u7ECF\u521B\u5EFA\u7684\u6807\u7B7E +user.tags.get = https://api.weixin.qq.com/cgi-bin/tags/get?access_token=ACCESS_TOKEN +## \u7F16\u8F91\u6807\u7B7E +user.tags.edit = https://api.weixin.qq.com/cgi-bin/tags/update?access_token=ACCESS_TOKEN +## \u5220\u9664\u6807\u7B7E +user.tags.delete = https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u6807\u7B7E\u7C89\u4E1D\u5217\u8868 +user.tags.fans.get = https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token=ACCESS_TOKEN +## \u6279\u91CF\u4E3A\u7528\u6237\u6253\u6807\u7B7E +user.tags.taging.batch = https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=ACCESS_TOKEN +## \u6279\u91CF\u4E3A\u7528\u6237\u53D6\u6D88\u6807\u7B7E +user.tags.untaging.batch = https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token=ACCESS_TOKEN +## \u83B7\u53D6\u7528\u6237\u8EAB\u4E0A\u7684\u6807\u7B7E\u5217\u8868 +user.tags.user.get = https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=ACCESS_TOKEN \ No newline at end of file