diff --git a/CHANGE.md b/CHANGE.md index 2776d2c7..bcb2c085 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -220,4 +220,10 @@ + **weixin4j-qy**: 新增[BatchApi](./weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java)批量异步执行任务接口 - + **weixin4j-qy**: DepartApi命名为[PartyApi](./weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java) \ No newline at end of file + + **weixin4j-qy**: DepartApi命名为[PartyApi](./weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java) + +* 2015-04-04 + + + **weixin4j-qy**: [MediaApi](./weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java)新增批量上传成员和部门接口 + + released 1.3 \ No newline at end of file diff --git a/README.md b/README.md index 8208d04a..4829be39 100644 --- a/README.md +++ b/README.md @@ -71,11 +71,9 @@ netty的代码没有放到maven中心仓库,也没什么意义,因为最终需 接下来 ------ -* 公众号服务应用 +* 公众号第三方服务应用 -* 企业号第三方应用 - -* 企业号登陆授权 +* 企业号第三方应用 & 企业号登陆授权 * 微信小店 diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java index 15eeb642..3befeb51 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java @@ -42,7 +42,7 @@ public abstract class BaseApi { protected abstract ResourceBundle getWeixinBundle(); protected String getRequestUri(String key) { - String url = getWeixinBundle().getString(key); + String url = getConfigValue(key); Pattern p = Pattern.compile("(\\{[^\\}]*\\})"); Matcher m = p.matcher(url); StringBuffer sb = new StringBuffer(); @@ -55,4 +55,8 @@ public abstract class BaseApi { m.appendTail(sb); return sb.toString(); } + + protected String getConfigValue(String key) { + return getWeixinBundle().getString(key); + } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java index 9a8f3cfb..0de66c86 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java @@ -196,32 +196,22 @@ public class HttpRequest { EntityUtils.consume(httpEntity); Header contentType = httpResponse .getFirstHeader(HttpHeaders.CONTENT_TYPE); + Header disposition = httpResponse + .getFirstHeader("Content-disposition"); System.err.println(response.getAsString()); - // error with html + // json if (contentType.getValue().contains( - ContentType.TEXT_HTML.getMimeType())) { - // response.setText(new String(data, "gbk")); - try { - checkJson(response); - return response; - } catch (JSONException e) { - ; - } - try { - checkXml(response); - return response; - } catch (CannotResolveClassException ex) { - ; - } - throw new WeixinException(response.getAsString()); - } else if (contentType.getValue().contains( - ContentType.APPLICATION_JSON.getMimeType())) { + ContentType.APPLICATION_JSON.getMimeType()) + || (disposition != null && disposition.getValue().indexOf( + ".json") > 0)) { checkJson(response); } else if (contentType.getValue().contains( ContentType.TEXT_XML.getMimeType())) { checkXml(response); } else if (contentType.getValue().contains( - ContentType.TEXT_PLAIN.getMimeType())) { + ContentType.TEXT_PLAIN.getMimeType()) + || contentType.getValue().contains( + ContentType.TEXT_HTML.getMimeType())) { try { checkJson(response); return response; diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java index 7f68afb7..8b0fa42b 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java @@ -19,6 +19,7 @@ import com.foxinmy.weixin4j.mp.payment.v3.MPPaymentResult; import com.foxinmy.weixin4j.mp.payment.v3.Redpacket; import com.foxinmy.weixin4j.mp.payment.v3.RedpacketSendResult; import com.foxinmy.weixin4j.util.RandomUtil; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 现金API @@ -135,7 +136,11 @@ public class CashApi extends MpApi { } } } - return response.getAsObject(new TypeReference() { - }); + String text = response.getAsString() + .replaceFirst("", "") + .replaceFirst("", "") + .replaceFirst("", "") + .replaceFirst("", ""); + return XmlStream.get(text, MPPaymentResult.class); } } diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/resources/logback.xml b/weixin4j-mp/weixin4j-mp-server/src/main/resources/logback.xml index 415a24c8..a4bb3401 100644 --- a/weixin4j-mp/weixin4j-mp-server/src/main/resources/logback.xml +++ b/weixin4j-mp/weixin4j-mp-server/src/main/resources/logback.xml @@ -26,7 +26,7 @@ - /tmp/weixin/log/weixin.mp.%d{yyyy-MM-dd}.log + /tmp/weixin/log/mp/weixin.mp.%d{yyyy-MM-dd}.log 30 diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md index 487a228b..1b4edc6f 100644 --- a/weixin4j-qy/README.md +++ b/weixin4j-qy/README.md @@ -130,3 +130,7 @@ weixin4j-qy + **weixin4j-qy-api**: 新增[BatchApi](./weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java)批量异步执行任务接口 + **weixin4j-qy-api**: DepartApi命名为[PartyApi](./weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java) + +* 2015-04-04 + + + **weixin4j-qy-api**: [MediaApi](./weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java)新增批量上传成员和部门接口 diff --git a/weixin4j-qy/weixin4j-qy-api/README.md b/weixin4j-qy/weixin4j-qy-api/README.md index 267d7d50..49b87b85 100644 --- a/weixin4j-qy/weixin4j-qy-api/README.md +++ b/weixin4j-qy/weixin4j-qy-api/README.md @@ -99,3 +99,7 @@ weixin.properties说明 + 新增[BatchApi](./src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java)批量异步执行任务接口 + DepartApi命名为[PartyApi](./src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java) + +* 2015-04-04 + + + [MediaApi](./src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java)新增批量上传成员和部门接口 \ No newline at end of file diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java index b01bf957..45c55e1b 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java @@ -1,15 +1,23 @@ package com.foxinmy.weixin4j.qy; +import java.io.File; +import java.io.IOException; import java.util.List; +import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.JsonResult; +import com.foxinmy.weixin4j.model.Button; import com.foxinmy.weixin4j.qy.api.AgentApi; import com.foxinmy.weixin4j.qy.api.BatchApi; import com.foxinmy.weixin4j.qy.api.HelperApi; +import com.foxinmy.weixin4j.qy.api.MediaApi; +import com.foxinmy.weixin4j.qy.api.MenuApi; +import com.foxinmy.weixin4j.qy.api.NotifyApi; import com.foxinmy.weixin4j.qy.api.PartyApi; import com.foxinmy.weixin4j.qy.api.TagApi; import com.foxinmy.weixin4j.qy.api.UserApi; +import com.foxinmy.weixin4j.qy.message.NotifyMessage; import com.foxinmy.weixin4j.qy.model.AgentInfo; import com.foxinmy.weixin4j.qy.model.AgentSetter; import com.foxinmy.weixin4j.qy.model.BatchResult; @@ -24,6 +32,7 @@ import com.foxinmy.weixin4j.token.FileTokenHolder; import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.WeixinTokenCreator; import com.foxinmy.weixin4j.type.AccountType; +import com.foxinmy.weixin4j.type.MediaType; /** * 微信企业号接口实现 @@ -35,6 +44,9 @@ import com.foxinmy.weixin4j.type.AccountType; * @see api文档 */ public class WeixinProxy { + private final MediaApi mediaApi; + private final MenuApi menuApi; + private final NotifyApi notifyApi; private final PartyApi partyApi; private final UserApi userApi; private final TagApi tagApi; @@ -72,6 +84,186 @@ public class WeixinProxy { this.helperApi = new HelperApi(tokenHolder); this.agentApi = new AgentApi(tokenHolder); this.batchApi = new BatchApi(tokenHolder); + this.notifyApi = new NotifyApi(tokenHolder); + this.menuApi = new MenuApi(tokenHolder); + this.mediaApi = new MediaApi(tokenHolder); + } + + /** + * 发送消息(需要管理员对应用有使用权限,对收件人touser、toparty、totag有查看权限,否则本次调用失败) + *

+ * 1) 发送人员列表存在错误的userid:执行发送,开发者需注意返回结果说明
+ * 2)发送人员不在通讯录权限范围内:不执行发送任务,返回首个出错的userid
+ * 3)发送人员不在应用可见范围内:不执行发送任务,返回首个出错的userid
+ *

+ * + * @param notify + * 客服消息对象 + * @return + * 如果对应用或收件人、部门、标签任何一个无权限,则本次发送失败;如果收件人、部门或标签不存在,发送仍然执行,但返回无效的部分
+ * { "errcode": 0, "errmsg": "ok", "invaliduser": "UserID1", + * "invalidparty":"PartyID1", "invalidtag":"TagID1" } + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.NotifyApi + * @see 发送接口说明 + * @see 发送格式说明 + * @see com.foxinmy.weixin4j.msg.model.Text + * @see com.foxinmy.weixin4j.msg.model.Image + * @see com.foxinmy.weixin4j.msg.model.Voice + * @see com.foxinmy.weixin4j.msg.model.Video + * @see com.foxinmy.weixin4j.msg.model.File + * @see com.foxinmy.weixin4j.msg.model.News + * @see com.foxinmy.weixin4j.msg.model.MpNews + * @see com.foxinmy.weixin4j.qy.message.NotifyMessage + */ + public JSONObject sendNotify(NotifyMessage notify) throws WeixinException { + return notifyApi.sendNotify(notify); + } + + /** + * 自定义菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) + * + * @param btnList + * 菜单列表 + * @param agentid + * 应用ID + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MenuApi + * @see 创建自定义菜单 + * @see com.foxinmy.weixin4j.model.Button + */ + public JsonResult createMenu(List