调整TokenCreator设计&公众号新增批量移动、删除用户组接口
This commit is contained in:
@@ -769,6 +769,74 @@
|
||||
<code>60114</code>
|
||||
<text>性别不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60115</code>
|
||||
<text>已关注成员微信不能修改</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60116</code>
|
||||
<text>扩展属性已存在</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60118</code>
|
||||
<text>成员无有效邀请字段(微信,邮箱,手机号)</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60119</code>
|
||||
<text>成员已关注</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60120</code>
|
||||
<text>成员已禁用</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60121</code>
|
||||
<text>找不到该成员</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60122</code>
|
||||
<text>邮箱已被外部管理员使用</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60123</code>
|
||||
<text>无效的部门id</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60124</code>
|
||||
<text>无效的父部门id</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60125</code>
|
||||
<text>部门名字长度超过限制</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60126</code>
|
||||
<text>创建部门失败</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60127</code>
|
||||
<text>缺少部门id</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>60128</code>
|
||||
<text>字段不合法,可能存在主键冲突或者格式错误</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>80001</code>
|
||||
<text>可信域名没有IPC备案,后续将不能在该域名下正常使用jssdk</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>82001</code>
|
||||
<text>发送消息或者邀请的参数全部为空或者全部不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>82002</code>
|
||||
<text>不合法的PartyID列表长度</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>82003</code>
|
||||
<text>不合法的TagID列表长度</text>
|
||||
</error>
|
||||
<!-- 语义理解API错误 -->
|
||||
<error>
|
||||
<code>7000000</code>
|
||||
@@ -907,4 +975,112 @@
|
||||
<desc>ORDERNOTEXIST</desc>
|
||||
<text>订单不存在</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001001</code>
|
||||
<text>POST数据参数不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001002</code>
|
||||
<text>远端服务不可用</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001003</code>
|
||||
<text>Ticket不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001004</code>
|
||||
<text>获取摇周边用户信息失败</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001005</code>
|
||||
<text>获取商户信息失败</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001006</code>
|
||||
<text>获取OpenID失败</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001007</code>
|
||||
<text>上传文件缺失</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001008</code>
|
||||
<text>上传素材的文件类型不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001009</code>
|
||||
<text>上传素材的文件尺寸不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001010</code>
|
||||
<text>上传失败</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001020</code>
|
||||
<text>帐号不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001021</code>
|
||||
<text>已有设备激活率低于50%,不能新增设备</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001022</code>
|
||||
<text>设备申请数不合法,必须为大于0的数字</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001023</code>
|
||||
<text>已存在审核中的设备ID申请</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001024</code>
|
||||
<text>一次查询设备ID数量不能超过50</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001025</code>
|
||||
<text>设备ID不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001026</code>
|
||||
<text>页面ID不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001027</code>
|
||||
<text>页面参数不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001028</code>
|
||||
<text>一次删除页面ID数量不能超过10</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001029</code>
|
||||
<text>页面已应用在设备中,请先解除应用关系再删除</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001030</code>
|
||||
<text>一次查询页面ID数量不能超过50</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001031</code>
|
||||
<text>时间区间不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001032</code>
|
||||
<text>保存设备与页面的绑定关系参数错误</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001033</code>
|
||||
<text>门店ID不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001034</code>
|
||||
<text>设备备注信息过长</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001035</code>
|
||||
<text>设备申请参数不合法</text>
|
||||
</error>
|
||||
<error>
|
||||
<code>9001036</code>
|
||||
<text>查询起始值begin不合法</text>
|
||||
</error>
|
||||
</errors>
|
||||
@@ -4,6 +4,7 @@ import java.nio.charset.Charset;
|
||||
|
||||
/**
|
||||
* 常量类
|
||||
*
|
||||
* @className Consts
|
||||
* @author jy
|
||||
* @date 2014年12月3日
|
||||
@@ -37,9 +38,13 @@ public final class Consts {
|
||||
*/
|
||||
public static final String QY_ASSESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
|
||||
/**
|
||||
* jssdk获取token的url
|
||||
* 公众平台jssdk获取token的url
|
||||
*/
|
||||
public static final String JS_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi";
|
||||
public static final String MP_JS_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi";
|
||||
/**
|
||||
* 企业号jssdk获取token的url
|
||||
*/
|
||||
public static final String QY_JS_TICKET_URL = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=%s";
|
||||
/**
|
||||
* 商户平台下统一订单生成的url
|
||||
*/
|
||||
|
||||
@@ -19,7 +19,7 @@ import com.thoughtworks.xstream.XStream;
|
||||
* @date 2015年1月9日
|
||||
* @since JDK 1.7
|
||||
* @see com.foxinmy.weixin4j.token.TokenCreator
|
||||
* @see com.foxinmy.weixin4j.token.WeixinTokenCreator
|
||||
* @see com.foxinmy.weixin4j.mp.token.WeixinTokenCreator
|
||||
*/
|
||||
public class FileTokenHolder implements TokenHolder {
|
||||
private final XStream xstream;
|
||||
|
||||
@@ -2,9 +2,5 @@
|
||||
|
||||
TokenHolder.java token持有者接口<br>
|
||||
FileTokenHolder.java 基于文件保存的TokenHolder实现<br>
|
||||
RedisTokenHolder.java 基于redis保存的TokenHolder实现(推荐)
|
||||
|
||||
|
||||
TokenCreator.java token创建者接口<br>
|
||||
WeixinTokenCreator.java 微信公众平台及企业号access_token的获取<br>
|
||||
WeixinJSTicketCreator.java 微信js接口的jsapi_ticket的获取
|
||||
RedisTokenHolder.java 基于redis保存的TokenHolder实现(推荐)<br>
|
||||
TokenCreator.java token创建者接口
|
||||
|
||||
@@ -18,7 +18,7 @@ import com.foxinmy.weixin4j.model.Token;
|
||||
* @date 2015年1月9日
|
||||
* @since JDK 1.7
|
||||
* @see com.foxinmy.weixin4j.token.TokenCreator
|
||||
* @see com.foxinmy.weixin4j.token.WeixinTokenCreator
|
||||
* @see com.foxinmy.weixin4j.mp.token.WeixinTokenCreator
|
||||
*/
|
||||
public class RedisTokenHolder implements TokenHolder {
|
||||
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
package com.foxinmy.weixin4j.token;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.http.HttpRequest;
|
||||
import com.foxinmy.weixin4j.http.Response;
|
||||
import com.foxinmy.weixin4j.model.Consts;
|
||||
import com.foxinmy.weixin4j.model.Token;
|
||||
|
||||
/**
|
||||
* 微信JSTICKET创建者
|
||||
*
|
||||
* @className WeixinJSTicketCreator
|
||||
* @author jy
|
||||
* @date 2015年1月10日
|
||||
* @since JDK 1.7
|
||||
* @see <a
|
||||
* href="http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95">JS
|
||||
* TICKET</a>
|
||||
*/
|
||||
public class WeixinJSTicketCreator implements TokenCreator {
|
||||
|
||||
private final String appid;
|
||||
private final TokenHolder weixinTokenHolder;
|
||||
private final HttpRequest request;
|
||||
|
||||
/**
|
||||
* <font color="red">公众平台的access_token</font>
|
||||
*
|
||||
* @param weixinTokenHolder
|
||||
*/
|
||||
public WeixinJSTicketCreator(String appid, TokenHolder weixinTokenHolder) {
|
||||
this.appid = appid;
|
||||
this.weixinTokenHolder = weixinTokenHolder;
|
||||
this.request = new HttpRequest();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCacheKey() {
|
||||
return String.format("%s_jskey", appid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Token createToken() throws WeixinException {
|
||||
Response response = request.get(String.format(Consts.JS_TICKET_URL,
|
||||
weixinTokenHolder.getToken().getAccessToken()));
|
||||
JSONObject result = response.getAsJson();
|
||||
Token token = new Token(result.getString("ticket"));
|
||||
token.setExpiresIn(result.getIntValue("expires_in"));
|
||||
token.setTime(System.currentTimeMillis());
|
||||
return token;
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
package com.foxinmy.weixin4j.token;
|
||||
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.http.HttpRequest;
|
||||
import com.foxinmy.weixin4j.http.Response;
|
||||
import com.foxinmy.weixin4j.model.Consts;
|
||||
import com.foxinmy.weixin4j.model.Token;
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
import com.foxinmy.weixin4j.type.AccountType;
|
||||
import com.foxinmy.weixin4j.util.ConfigUtil;
|
||||
|
||||
/**
|
||||
* 微信TOKEN创建者
|
||||
*
|
||||
* @className WeixinTokenCreator
|
||||
* @author jy
|
||||
* @date 2015年1月10日
|
||||
* @since JDK 1.7
|
||||
* @see <a
|
||||
* href="http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html">微信公众平台获取token说明</a>
|
||||
* @see <a
|
||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E5%8A%A8%E8%B0%83%E7%94%A8">微信企业号获取token说明</a>
|
||||
* @see com.foxinmy.weixin4j.model.Token
|
||||
*/
|
||||
public class WeixinTokenCreator implements TokenCreator {
|
||||
|
||||
private final HttpRequest request;
|
||||
private final String id;
|
||||
private final String secret;
|
||||
private final AccountType accountType;
|
||||
|
||||
public WeixinTokenCreator(AccountType accountType) {
|
||||
WeixinAccount weixinAccount = ConfigUtil.getWeixinAccount(accountType
|
||||
.getClazz());
|
||||
this.id = weixinAccount.getId();
|
||||
this.secret = weixinAccount.getSecret();
|
||||
this.accountType = accountType;
|
||||
this.request = new HttpRequest();
|
||||
}
|
||||
|
||||
public WeixinTokenCreator(String id, String secret, AccountType accountType) {
|
||||
this.id = id;
|
||||
this.secret = secret;
|
||||
this.accountType = accountType;
|
||||
this.request = new HttpRequest();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCacheKey() {
|
||||
return String.format("%s_%s", accountType.name(), id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Token createToken() throws WeixinException {
|
||||
String tokenUrl = String.format(Consts.MP_ASSESS_TOKEN_URL, id, secret);
|
||||
if (accountType == AccountType.QY) {
|
||||
tokenUrl = String.format(Consts.QY_ASSESS_TOKEN_URL, id, secret);
|
||||
}
|
||||
Response response = request.get(tokenUrl);
|
||||
Token token = response.getAsObject(new TypeReference<Token>() {
|
||||
});
|
||||
token.setTime(System.currentTimeMillis());
|
||||
return token;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,5 @@
|
||||
package com.foxinmy.weixin4j.type;
|
||||
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
import com.foxinmy.weixin4j.model.WeixinMpAccount;
|
||||
import com.foxinmy.weixin4j.model.WeixinQyAccount;
|
||||
|
||||
/**
|
||||
* 账号类型
|
||||
@@ -14,14 +11,12 @@ import com.foxinmy.weixin4j.model.WeixinQyAccount;
|
||||
* @see
|
||||
*/
|
||||
public enum AccountType {
|
||||
MP(WeixinMpAccount.class), QY(WeixinQyAccount.class);
|
||||
private Class<? extends WeixinAccount> clazz;
|
||||
|
||||
AccountType(Class<? extends WeixinAccount> clazz) {
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
public Class<? extends WeixinAccount> getClazz() {
|
||||
return clazz;
|
||||
}
|
||||
/**
|
||||
* 公众号
|
||||
*/
|
||||
MP,
|
||||
/**
|
||||
* 企业号
|
||||
*/
|
||||
QY;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user