调整TokenCreator设计&公众号新增批量移动、删除用户组接口
This commit is contained in:
parent
066546997f
commit
f102032379
13
CHANGE.md
13
CHANGE.md
@ -230,4 +230,15 @@
|
|||||||
|
|
||||||
* 2015-04-09
|
* 2015-04-09
|
||||||
|
|
||||||
+ **weixin4j-qy**: [AgentApi](./weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java)新增获取应用列表概况接口
|
+ **weixin4j-qy**: [AgentApi](./weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java)新增获取应用列表概况接口
|
||||||
|
|
||||||
|
* 2015-04-13
|
||||||
|
|
||||||
|
+ **weixin4j-base**: <font color="red">删除WeixinTokenCreator与WeixinJSTicketCreator类</font>
|
||||||
|
|
||||||
|
+ **weixin4j-mp**: 新增WeixinTokenCreator与WeixinJSTicketCreator类
|
||||||
|
|
||||||
|
+ **weixin4j-mp**: 新增用户分组批量移动、删除组别接口
|
||||||
|
|
||||||
|
+ **weixin4j-qy**: 新增WeixinTokenCreator与WeixinJSTicketCreator类
|
||||||
|
|
||||||
@ -55,4 +55,8 @@ weixin4j-base
|
|||||||
|
|
||||||
* 2015-04-01
|
* 2015-04-01
|
||||||
|
|
||||||
+ 新增异步消息事件[BatchjobresultMessage](./src/main/java/com/foxinmy/weixin4j/msg/event/BatchjobresultMessage.java)
|
+ 新增异步消息事件[BatchjobresultMessage](./src/main/java/com/foxinmy/weixin4j/msg/event/BatchjobresultMessage.java)
|
||||||
|
|
||||||
|
* 2015-04-13
|
||||||
|
|
||||||
|
+ 删除WeixinTokenCreator与WeixinJSTicketCreator类
|
||||||
@ -769,6 +769,74 @@
|
|||||||
<code>60114</code>
|
<code>60114</code>
|
||||||
<text>性别不合法</text>
|
<text>性别不合法</text>
|
||||||
</error>
|
</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错误 -->
|
<!-- 语义理解API错误 -->
|
||||||
<error>
|
<error>
|
||||||
<code>7000000</code>
|
<code>7000000</code>
|
||||||
@ -907,4 +975,112 @@
|
|||||||
<desc>ORDERNOTEXIST</desc>
|
<desc>ORDERNOTEXIST</desc>
|
||||||
<text>订单不存在</text>
|
<text>订单不存在</text>
|
||||||
</error>
|
</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>
|
</errors>
|
||||||
@ -4,6 +4,7 @@ import java.nio.charset.Charset;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 常量类
|
* 常量类
|
||||||
|
*
|
||||||
* @className Consts
|
* @className Consts
|
||||||
* @author jy
|
* @author jy
|
||||||
* @date 2014年12月3日
|
* @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";
|
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
|
* 商户平台下统一订单生成的url
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import com.thoughtworks.xstream.XStream;
|
|||||||
* @date 2015年1月9日
|
* @date 2015年1月9日
|
||||||
* @since JDK 1.7
|
* @since JDK 1.7
|
||||||
* @see com.foxinmy.weixin4j.token.TokenCreator
|
* @see com.foxinmy.weixin4j.token.TokenCreator
|
||||||
* @see com.foxinmy.weixin4j.token.WeixinTokenCreator
|
* @see com.foxinmy.weixin4j.mp.token.WeixinTokenCreator
|
||||||
*/
|
*/
|
||||||
public class FileTokenHolder implements TokenHolder {
|
public class FileTokenHolder implements TokenHolder {
|
||||||
private final XStream xstream;
|
private final XStream xstream;
|
||||||
|
|||||||
@ -2,9 +2,5 @@
|
|||||||
|
|
||||||
TokenHolder.java token持有者接口<br>
|
TokenHolder.java token持有者接口<br>
|
||||||
FileTokenHolder.java 基于文件保存的TokenHolder实现<br>
|
FileTokenHolder.java 基于文件保存的TokenHolder实现<br>
|
||||||
RedisTokenHolder.java 基于redis保存的TokenHolder实现(推荐)
|
RedisTokenHolder.java 基于redis保存的TokenHolder实现(推荐)<br>
|
||||||
|
TokenCreator.java token创建者接口
|
||||||
|
|
||||||
TokenCreator.java token创建者接口<br>
|
|
||||||
WeixinTokenCreator.java 微信公众平台及企业号access_token的获取<br>
|
|
||||||
WeixinJSTicketCreator.java 微信js接口的jsapi_ticket的获取
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import com.foxinmy.weixin4j.model.Token;
|
|||||||
* @date 2015年1月9日
|
* @date 2015年1月9日
|
||||||
* @since JDK 1.7
|
* @since JDK 1.7
|
||||||
* @see com.foxinmy.weixin4j.token.TokenCreator
|
* @see com.foxinmy.weixin4j.token.TokenCreator
|
||||||
* @see com.foxinmy.weixin4j.token.WeixinTokenCreator
|
* @see com.foxinmy.weixin4j.mp.token.WeixinTokenCreator
|
||||||
*/
|
*/
|
||||||
public class RedisTokenHolder implements TokenHolder {
|
public class RedisTokenHolder implements TokenHolder {
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,5 @@
|
|||||||
package com.foxinmy.weixin4j.type;
|
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
|
* @see
|
||||||
*/
|
*/
|
||||||
public enum AccountType {
|
public enum AccountType {
|
||||||
MP(WeixinMpAccount.class), QY(WeixinQyAccount.class);
|
/**
|
||||||
private Class<? extends WeixinAccount> clazz;
|
* 公众号
|
||||||
|
*/
|
||||||
AccountType(Class<? extends WeixinAccount> clazz) {
|
MP,
|
||||||
this.clazz = clazz;
|
/**
|
||||||
}
|
* 企业号
|
||||||
|
*/
|
||||||
public Class<? extends WeixinAccount> getClazz() {
|
QY;
|
||||||
return clazz;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -210,4 +210,10 @@ weixin4j-mp
|
|||||||
|
|
||||||
* 2015-04-01
|
* 2015-04-01
|
||||||
|
|
||||||
+ **weixin4j-mp-api**: 新增[CashApi](./weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java)发红包、企业付款接口
|
+ **weixin4j-mp-api**: 新增[CashApi](./weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java)发红包、企业付款接口
|
||||||
|
|
||||||
|
* 2015-04-13
|
||||||
|
|
||||||
|
+ **weixin4j-mp-api**: 新增WeixinTokenCreator与WeixinJSTicketCreator类
|
||||||
|
|
||||||
|
+ **weixin4j-mp-api**: 新增用户分组批量移动、删除组别接口
|
||||||
@ -185,4 +185,10 @@ weixin.properties说明
|
|||||||
|
|
||||||
* 2015-04-01
|
* 2015-04-01
|
||||||
|
|
||||||
+ 新增[CashApi](./src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java)发红包、企业付款接口
|
+ 新增[CashApi](./src/main/java/com/foxinmy/weixin4j/mp/api/CashApi.java)发红包、企业付款接口
|
||||||
|
|
||||||
|
* 2015-04-13
|
||||||
|
|
||||||
|
+ 新增WeixinTokenCreator与WeixinJSTicketCreator类
|
||||||
|
|
||||||
|
+ 新增用户分组批量移动、删除组别接口
|
||||||
@ -20,6 +20,7 @@ import com.foxinmy.weixin4j.mp.payment.v3.MPPayment;
|
|||||||
import com.foxinmy.weixin4j.mp.payment.v3.MPPaymentResult;
|
import com.foxinmy.weixin4j.mp.payment.v3.MPPaymentResult;
|
||||||
import com.foxinmy.weixin4j.mp.payment.v3.Redpacket;
|
import com.foxinmy.weixin4j.mp.payment.v3.Redpacket;
|
||||||
import com.foxinmy.weixin4j.mp.payment.v3.RedpacketSendResult;
|
import com.foxinmy.weixin4j.mp.payment.v3.RedpacketSendResult;
|
||||||
|
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
|
||||||
import com.foxinmy.weixin4j.mp.type.BillType;
|
import com.foxinmy.weixin4j.mp.type.BillType;
|
||||||
import com.foxinmy.weixin4j.mp.type.CurrencyType;
|
import com.foxinmy.weixin4j.mp.type.CurrencyType;
|
||||||
import com.foxinmy.weixin4j.mp.type.IdQuery;
|
import com.foxinmy.weixin4j.mp.type.IdQuery;
|
||||||
@ -27,8 +28,6 @@ import com.foxinmy.weixin4j.mp.type.IdType;
|
|||||||
import com.foxinmy.weixin4j.mp.type.RefundType;
|
import com.foxinmy.weixin4j.mp.type.RefundType;
|
||||||
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.WeixinTokenCreator;
|
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
|
||||||
import com.foxinmy.weixin4j.util.ConfigUtil;
|
import com.foxinmy.weixin4j.util.ConfigUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,7 +51,7 @@ public class WeixinPayProxy {
|
|||||||
|
|
||||||
public WeixinPayProxy() {
|
public WeixinPayProxy() {
|
||||||
this(ConfigUtil.getWeixinMpAccount(), new FileTokenHolder(
|
this(ConfigUtil.getWeixinMpAccount(), new FileTokenHolder(
|
||||||
new WeixinTokenCreator(AccountType.MP)));
|
new WeixinTokenCreator()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -32,6 +32,7 @@ import com.foxinmy.weixin4j.mp.model.QRParameter;
|
|||||||
import com.foxinmy.weixin4j.mp.model.SemQuery;
|
import com.foxinmy.weixin4j.mp.model.SemQuery;
|
||||||
import com.foxinmy.weixin4j.mp.model.SemResult;
|
import com.foxinmy.weixin4j.mp.model.SemResult;
|
||||||
import com.foxinmy.weixin4j.mp.model.User;
|
import com.foxinmy.weixin4j.mp.model.User;
|
||||||
|
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
|
||||||
import com.foxinmy.weixin4j.mp.type.DatacubeType;
|
import com.foxinmy.weixin4j.mp.type.DatacubeType;
|
||||||
import com.foxinmy.weixin4j.mp.type.IndustryType;
|
import com.foxinmy.weixin4j.mp.type.IndustryType;
|
||||||
import com.foxinmy.weixin4j.mp.type.Lang;
|
import com.foxinmy.weixin4j.mp.type.Lang;
|
||||||
@ -40,8 +41,6 @@ import com.foxinmy.weixin4j.msg.model.MpArticle;
|
|||||||
import com.foxinmy.weixin4j.msg.model.Video;
|
import com.foxinmy.weixin4j.msg.model.Video;
|
||||||
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.WeixinTokenCreator;
|
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
|
||||||
import com.foxinmy.weixin4j.type.MediaType;
|
import com.foxinmy.weixin4j.type.MediaType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,7 +70,7 @@ public class WeixinProxy {
|
|||||||
* 默认采用文件存放Token信息
|
* 默认采用文件存放Token信息
|
||||||
*/
|
*/
|
||||||
public WeixinProxy() {
|
public WeixinProxy() {
|
||||||
this(new FileTokenHolder(new WeixinTokenCreator(AccountType.MP)));
|
this(new FileTokenHolder(new WeixinTokenCreator()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -80,8 +79,7 @@ public class WeixinProxy {
|
|||||||
* @param appsecret
|
* @param appsecret
|
||||||
*/
|
*/
|
||||||
public WeixinProxy(String appid, String appsecret) {
|
public WeixinProxy(String appid, String appsecret) {
|
||||||
this(new FileTokenHolder(new WeixinTokenCreator(appid, appsecret,
|
this(new FileTokenHolder(new WeixinTokenCreator(appid, appsecret)));
|
||||||
AccountType.MP)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -967,21 +965,54 @@ public class WeixinProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 移动分组
|
* 移动用户到分组
|
||||||
*
|
*
|
||||||
* @param openId
|
|
||||||
* 用户对应的ID
|
|
||||||
* @param groupId
|
* @param groupId
|
||||||
* 组ID
|
* 组ID
|
||||||
|
* @param openId
|
||||||
|
* 用户对应的ID
|
||||||
* @throws WeixinException
|
* @throws WeixinException
|
||||||
* @see <a
|
* @see <a
|
||||||
* href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">移动分组</a>
|
* href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">移动分组</a>
|
||||||
* @see com.foxinmy.weixin4j.mp.model.Group
|
* @see com.foxinmy.weixin4j.mp.model.Group
|
||||||
* @see com.foxinmy.weixin4j.mp.api.GroupApi
|
* @see com.foxinmy.weixin4j.mp.api.GroupApi
|
||||||
*/
|
*/
|
||||||
public JsonResult moveGroup(String openId, int groupId)
|
public JsonResult moveGroup(int groupId, String openId)
|
||||||
throws WeixinException {
|
throws WeixinException {
|
||||||
return groupApi.moveGroup(openId, groupId);
|
return groupApi.moveGroup(groupId, openId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量移动分组
|
||||||
|
*
|
||||||
|
* @param groupId
|
||||||
|
* 组ID
|
||||||
|
* @param openIds
|
||||||
|
* 用户ID列表(不能超过50个)
|
||||||
|
* @throws WeixinException
|
||||||
|
* @see <a
|
||||||
|
* href="http://mp.weixin.qq.com/wiki/0/56d992c605a97245eb7e617854b169fc.html#.E6.89.B9.E9.87.8F.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">批量移动分组</a>
|
||||||
|
* @see com.foxinmy.weixin4j.mp.model.Group
|
||||||
|
* @see com.foxinmy.weixin4j.mp.api.GroupApi
|
||||||
|
*/
|
||||||
|
public JsonResult moveGroup(int groupId, String... openIds)
|
||||||
|
throws WeixinException {
|
||||||
|
return groupApi.moveGroup(groupId, openIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除用户分组,所有该分组内的用户自动进入默认分组.
|
||||||
|
*
|
||||||
|
* @param groupId
|
||||||
|
* 组ID
|
||||||
|
* @throws WeixinException
|
||||||
|
* @see <a
|
||||||
|
* href="http://mp.weixin.qq.com/wiki/0/56d992c605a97245eb7e617854b169fc.html#.E5.88.A0.E9.99.A4.E5.88.86.E7.BB.84">删除用户分组</a>
|
||||||
|
* @see com.foxinmy.weixin4j.mp.model.Group
|
||||||
|
* @see com.foxinmy.weixin4j.mp.api.GroupApi
|
||||||
|
*/
|
||||||
|
public JsonResult deleteGroup(int groupId) throws WeixinException {
|
||||||
|
return groupApi.deleteGroup(groupId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.mp.api;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||||
import com.foxinmy.weixin4j.http.JsonResult;
|
import com.foxinmy.weixin4j.http.JsonResult;
|
||||||
import com.foxinmy.weixin4j.http.Response;
|
import com.foxinmy.weixin4j.http.Response;
|
||||||
@ -118,18 +119,18 @@ public class GroupApi extends MpApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 移动分组
|
* 移动用户到分组
|
||||||
*
|
*
|
||||||
* @param openId
|
|
||||||
* 用户对应的ID
|
|
||||||
* @param groupId
|
* @param groupId
|
||||||
* 组ID
|
* 组ID
|
||||||
|
* @param openId
|
||||||
|
* 用户对应的ID
|
||||||
* @throws WeixinException
|
* @throws WeixinException
|
||||||
* @see <a
|
* @see <a
|
||||||
* href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">移动分组</a>
|
* href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">移动分组</a>
|
||||||
* @see com.foxinmy.weixin4j.mp.model.Group
|
* @see com.foxinmy.weixin4j.mp.model.Group
|
||||||
*/
|
*/
|
||||||
public JsonResult moveGroup(String openId, int groupId)
|
public JsonResult moveGroup(int groupId, String openId)
|
||||||
throws WeixinException {
|
throws WeixinException {
|
||||||
String group_move_uri = getRequestUri("group_move_uri");
|
String group_move_uri = getRequestUri("group_move_uri");
|
||||||
Token token = tokenHolder.getToken();
|
Token token = tokenHolder.getToken();
|
||||||
@ -139,4 +140,50 @@ public class GroupApi extends MpApi {
|
|||||||
|
|
||||||
return response.getAsJsonResult();
|
return response.getAsJsonResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量移动分组
|
||||||
|
*
|
||||||
|
* @param groupId
|
||||||
|
* 组ID
|
||||||
|
* @param openIds
|
||||||
|
* 用户ID列表(不能超过50个)
|
||||||
|
* @throws WeixinException
|
||||||
|
* @see <a
|
||||||
|
* href="http://mp.weixin.qq.com/wiki/0/56d992c605a97245eb7e617854b169fc.html#.E6.89.B9.E9.87.8F.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">批量移动分组</a>
|
||||||
|
* @see com.foxinmy.weixin4j.mp.model.Group
|
||||||
|
*/
|
||||||
|
public JsonResult moveGroup(int groupId, String... openIds)
|
||||||
|
throws WeixinException {
|
||||||
|
String group_batchmove_uri = getRequestUri("group_batchmove_uri");
|
||||||
|
Token token = tokenHolder.getToken();
|
||||||
|
JSONObject obj = new JSONObject();
|
||||||
|
obj.put("to_groupid", groupId);
|
||||||
|
obj.put("openid_list", openIds);
|
||||||
|
Response response = request.post(
|
||||||
|
String.format(group_batchmove_uri, token.getAccessToken()),
|
||||||
|
obj.toJSONString());
|
||||||
|
|
||||||
|
return response.getAsJsonResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除用户分组,所有该分组内的用户自动进入默认分组.
|
||||||
|
*
|
||||||
|
* @param groupId
|
||||||
|
* 组ID
|
||||||
|
* @throws WeixinException
|
||||||
|
* @see <a
|
||||||
|
* href="http://mp.weixin.qq.com/wiki/0/56d992c605a97245eb7e617854b169fc.html#.E5.88.A0.E9.99.A4.E5.88.86.E7.BB.84">删除用户分组</a>
|
||||||
|
* @see com.foxinmy.weixin4j.mp.model.Group
|
||||||
|
*/
|
||||||
|
public JsonResult deleteGroup(int groupId) throws WeixinException {
|
||||||
|
String group_delete_uri = getRequestUri("group_delete_uri");
|
||||||
|
Token token = tokenHolder.getToken();
|
||||||
|
Response response = request.post(
|
||||||
|
String.format(group_delete_uri, token.getAccessToken()),
|
||||||
|
String.format("{\"group\":{\"id\":%d}}", groupId));
|
||||||
|
|
||||||
|
return response.getAsJsonResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,6 +45,10 @@ group_getid_uri={api_cgi_url}/groups/getid?access_token=%s
|
|||||||
group_modify_uri={api_cgi_url}/groups/update?access_token=%s
|
group_modify_uri={api_cgi_url}/groups/update?access_token=%s
|
||||||
# \u79fb\u52a8\u7528\u6237\u5206\u7ec4
|
# \u79fb\u52a8\u7528\u6237\u5206\u7ec4
|
||||||
group_move_uri={api_cgi_url}/groups/members/update?access_token=%s
|
group_move_uri={api_cgi_url}/groups/members/update?access_token=%s
|
||||||
|
# \u6279\u91cf\u79fb\u52a8\u7528\u6237\u5206\u7ec4
|
||||||
|
group_batchmove_uri={api_cgi_url}/groups/members/batchupdate?access_token=%s
|
||||||
|
# \u5220\u9664\u7528\u6237\u5206\u7ec4
|
||||||
|
group_delete_uri={api_cgi_url}/groups/delete?access_token=%s
|
||||||
# \u83b7\u53d6\u5173\u6ce8\u7740
|
# \u83b7\u53d6\u5173\u6ce8\u7740
|
||||||
following_uri={api_cgi_url}/user/get?access_token=%s&next_openid=%s
|
following_uri={api_cgi_url}/user/get?access_token=%s&next_openid=%s
|
||||||
# \u81ea\u5b9a\u4e49\u83dc\u5355
|
# \u81ea\u5b9a\u4e49\u83dc\u5355
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
package com.foxinmy.weixin4j.token;
|
package com.foxinmy.weixin4j.mp.token;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||||
@ -6,9 +6,11 @@ import com.foxinmy.weixin4j.http.HttpRequest;
|
|||||||
import com.foxinmy.weixin4j.http.Response;
|
import com.foxinmy.weixin4j.http.Response;
|
||||||
import com.foxinmy.weixin4j.model.Consts;
|
import com.foxinmy.weixin4j.model.Consts;
|
||||||
import com.foxinmy.weixin4j.model.Token;
|
import com.foxinmy.weixin4j.model.Token;
|
||||||
|
import com.foxinmy.weixin4j.token.TokenCreator;
|
||||||
|
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信JSTICKET创建者
|
* 微信公众平台JSTICKET创建者
|
||||||
*
|
*
|
||||||
* @className WeixinJSTicketCreator
|
* @className WeixinJSTicketCreator
|
||||||
* @author jy
|
* @author jy
|
||||||
@ -37,12 +39,12 @@ public class WeixinJSTicketCreator implements TokenCreator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getCacheKey() {
|
public String getCacheKey() {
|
||||||
return String.format("%s_jskey", appid);
|
return String.format("mp_jsticket_%s", appid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Token createToken() throws WeixinException {
|
public Token createToken() throws WeixinException {
|
||||||
Response response = request.get(String.format(Consts.JS_TICKET_URL,
|
Response response = request.get(String.format(Consts.MP_JS_TICKET_URL,
|
||||||
weixinTokenHolder.getToken().getAccessToken()));
|
weixinTokenHolder.getToken().getAccessToken()));
|
||||||
JSONObject result = response.getAsJson();
|
JSONObject result = response.getAsJson();
|
||||||
Token token = new Token(result.getString("ticket"));
|
Token token = new Token(result.getString("ticket"));
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.foxinmy.weixin4j.token;
|
package com.foxinmy.weixin4j.mp.token;
|
||||||
|
|
||||||
import com.alibaba.fastjson.TypeReference;
|
import com.alibaba.fastjson.TypeReference;
|
||||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||||
@ -6,12 +6,12 @@ import com.foxinmy.weixin4j.http.HttpRequest;
|
|||||||
import com.foxinmy.weixin4j.http.Response;
|
import com.foxinmy.weixin4j.http.Response;
|
||||||
import com.foxinmy.weixin4j.model.Consts;
|
import com.foxinmy.weixin4j.model.Consts;
|
||||||
import com.foxinmy.weixin4j.model.Token;
|
import com.foxinmy.weixin4j.model.Token;
|
||||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
import com.foxinmy.weixin4j.model.WeixinMpAccount;
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
import com.foxinmy.weixin4j.token.TokenCreator;
|
||||||
import com.foxinmy.weixin4j.util.ConfigUtil;
|
import com.foxinmy.weixin4j.util.ConfigUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信TOKEN创建者
|
* 微信公众平台TOKEN创建者
|
||||||
*
|
*
|
||||||
* @className WeixinTokenCreator
|
* @className WeixinTokenCreator
|
||||||
* @author jy
|
* @author jy
|
||||||
@ -19,44 +19,36 @@ import com.foxinmy.weixin4j.util.ConfigUtil;
|
|||||||
* @since JDK 1.7
|
* @since JDK 1.7
|
||||||
* @see <a
|
* @see <a
|
||||||
* href="http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html">微信公众平台获取token说明</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
|
* @see com.foxinmy.weixin4j.model.Token
|
||||||
*/
|
*/
|
||||||
public class WeixinTokenCreator implements TokenCreator {
|
public class WeixinTokenCreator implements TokenCreator {
|
||||||
|
|
||||||
private final HttpRequest request;
|
private final HttpRequest request;
|
||||||
private final String id;
|
private final String appid;
|
||||||
private final String secret;
|
private final String secret;
|
||||||
private final AccountType accountType;
|
|
||||||
|
|
||||||
public WeixinTokenCreator(AccountType accountType) {
|
public WeixinTokenCreator() {
|
||||||
WeixinAccount weixinAccount = ConfigUtil.getWeixinAccount(accountType
|
WeixinMpAccount weixinAccount = ConfigUtil.getWeixinMpAccount();
|
||||||
.getClazz());
|
this.appid = weixinAccount.getId();
|
||||||
this.id = weixinAccount.getId();
|
|
||||||
this.secret = weixinAccount.getSecret();
|
this.secret = weixinAccount.getSecret();
|
||||||
this.accountType = accountType;
|
|
||||||
this.request = new HttpRequest();
|
this.request = new HttpRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
public WeixinTokenCreator(String id, String secret, AccountType accountType) {
|
public WeixinTokenCreator(String appid, String secret) {
|
||||||
this.id = id;
|
this.appid = appid;
|
||||||
this.secret = secret;
|
this.secret = secret;
|
||||||
this.accountType = accountType;
|
|
||||||
this.request = new HttpRequest();
|
this.request = new HttpRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getCacheKey() {
|
public String getCacheKey() {
|
||||||
return String.format("%s_%s", accountType.name(), id);
|
return String.format("mp_token_%s", appid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Token createToken() throws WeixinException {
|
public Token createToken() throws WeixinException {
|
||||||
String tokenUrl = String.format(Consts.MP_ASSESS_TOKEN_URL, id, secret);
|
String tokenUrl = String.format(Consts.MP_ASSESS_TOKEN_URL, appid,
|
||||||
if (accountType == AccountType.QY) {
|
secret);
|
||||||
tokenUrl = String.format(Consts.QY_ASSESS_TOKEN_URL, id, secret);
|
|
||||||
}
|
|
||||||
Response response = request.get(tokenUrl);
|
Response response = request.get(tokenUrl);
|
||||||
Token token = response.getAsObject(new TypeReference<Token>() {
|
Token token = response.getAsObject(new TypeReference<Token>() {
|
||||||
});
|
});
|
||||||
@ -13,9 +13,8 @@ import com.foxinmy.weixin4j.mp.WeixinPayProxy;
|
|||||||
import com.foxinmy.weixin4j.mp.payment.coupon.CouponDetail;
|
import com.foxinmy.weixin4j.mp.payment.coupon.CouponDetail;
|
||||||
import com.foxinmy.weixin4j.mp.payment.coupon.CouponResult;
|
import com.foxinmy.weixin4j.mp.payment.coupon.CouponResult;
|
||||||
import com.foxinmy.weixin4j.mp.payment.coupon.CouponStock;
|
import com.foxinmy.weixin4j.mp.payment.coupon.CouponStock;
|
||||||
|
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
|
||||||
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.WeixinTokenCreator;
|
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
|
||||||
import com.foxinmy.weixin4j.util.DateUtil;
|
import com.foxinmy.weixin4j.util.DateUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,15 +30,12 @@ public class CouponTest {
|
|||||||
protected final static WeixinPayProxy WEIXINPAY;
|
protected final static WeixinPayProxy WEIXINPAY;
|
||||||
protected final static WeixinMpAccount ACCOUNT;
|
protected final static WeixinMpAccount ACCOUNT;
|
||||||
static {
|
static {
|
||||||
ACCOUNT = new WeixinMpAccount("公众号的id",
|
ACCOUNT = new WeixinMpAccount("公众号的id", "公众号的secret", "公众号的支付密钥",
|
||||||
"公众号的secret",
|
"商户平台的id");
|
||||||
"公众号的支付密钥", "商户平台的id");
|
|
||||||
WEIXINPAY = new WeixinPayProxy(ACCOUNT, new FileTokenHolder(
|
WEIXINPAY = new WeixinPayProxy(ACCOUNT, new FileTokenHolder(
|
||||||
new WeixinTokenCreator(ACCOUNT.getId(), ACCOUNT.getSecret(),
|
new WeixinTokenCreator(ACCOUNT.getId(), ACCOUNT.getSecret())));
|
||||||
AccountType.MP)));
|
|
||||||
}
|
}
|
||||||
protected final File caFile = new File(
|
protected final File caFile = new File("证书文件的路径(*.p12)");
|
||||||
"证书文件的路径(*.p12)");
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sendCoupon() throws WeixinException {
|
public void sendCoupon() throws WeixinException {
|
||||||
@ -55,7 +51,7 @@ public class CouponTest {
|
|||||||
CouponStock couponStock = WEIXINPAY.queryCouponStock("couponStockId");
|
CouponStock couponStock = WEIXINPAY.queryCouponStock("couponStockId");
|
||||||
System.err.println(couponStock);
|
System.err.println(couponStock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void queryCouponDetail() throws WeixinException {
|
public void queryCouponDetail() throws WeixinException {
|
||||||
CouponDetail couponDetail = WEIXINPAY.queryCouponDetail("couponId");
|
CouponDetail couponDetail = WEIXINPAY.queryCouponDetail("couponId");
|
||||||
|
|||||||
@ -56,8 +56,21 @@ public class GroupTest extends TokenTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void move() throws WeixinException {
|
public void move() throws WeixinException {
|
||||||
JsonResult result = groupApi.moveGroup("owGBft_vbBbOaQOmpEUE4xDLeRSU",
|
JsonResult result = groupApi.moveGroup(100,
|
||||||
100);
|
"owGBft_vbBbOaQOmpEUE4xDLeRSU");
|
||||||
|
Assert.assertEquals(0, result.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void batchMove() throws WeixinException {
|
||||||
|
JsonResult result = groupApi.moveGroup(100,
|
||||||
|
"owGBft_vbBbOaQOmpEUE4xDLeRSU");
|
||||||
|
Assert.assertEquals(0, result.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void delete() throws WeixinException {
|
||||||
|
JsonResult result = groupApi.deleteGroup(100);
|
||||||
Assert.assertEquals(0, result.getCode());
|
Assert.assertEquals(0, result.getCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,12 +17,11 @@ import com.foxinmy.weixin4j.mp.payment.v3.ApiResult;
|
|||||||
import com.foxinmy.weixin4j.mp.payment.v3.Order;
|
import com.foxinmy.weixin4j.mp.payment.v3.Order;
|
||||||
import com.foxinmy.weixin4j.mp.payment.v3.PayPackageV3;
|
import com.foxinmy.weixin4j.mp.payment.v3.PayPackageV3;
|
||||||
import com.foxinmy.weixin4j.mp.payment.v3.PrePay;
|
import com.foxinmy.weixin4j.mp.payment.v3.PrePay;
|
||||||
|
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
|
||||||
import com.foxinmy.weixin4j.mp.type.IdQuery;
|
import com.foxinmy.weixin4j.mp.type.IdQuery;
|
||||||
import com.foxinmy.weixin4j.mp.type.IdType;
|
import com.foxinmy.weixin4j.mp.type.IdType;
|
||||||
import com.foxinmy.weixin4j.mp.type.TradeType;
|
import com.foxinmy.weixin4j.mp.type.TradeType;
|
||||||
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.WeixinTokenCreator;
|
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
|
||||||
|
|
||||||
public class PayTest {
|
public class PayTest {
|
||||||
private final static WeixinPayProxy PAY2;
|
private final static WeixinPayProxy PAY2;
|
||||||
@ -30,20 +29,14 @@ public class PayTest {
|
|||||||
private final static WeixinMpAccount ACCOUNT2;
|
private final static WeixinMpAccount ACCOUNT2;
|
||||||
private final static WeixinMpAccount ACCOUNT3;
|
private final static WeixinMpAccount ACCOUNT3;
|
||||||
static {
|
static {
|
||||||
ACCOUNT2 = new WeixinMpAccount(
|
ACCOUNT2 = new WeixinMpAccount("请填入v2版本的appid", "请填入v2版本的appsecret",
|
||||||
"请填入v2版本的appid",
|
"请填入v2版本的paysignkey", "请填入v2版本的partnerId", "请填入v2版本的partnerKey");
|
||||||
"请填入v2版本的appsecret",
|
|
||||||
"请填入v2版本的paysignkey",
|
|
||||||
"请填入v2版本的partnerId", "请填入v2版本的partnerKey");
|
|
||||||
PAY2 = new WeixinPayProxy(ACCOUNT2, new FileTokenHolder(
|
PAY2 = new WeixinPayProxy(ACCOUNT2, new FileTokenHolder(
|
||||||
new WeixinTokenCreator(ACCOUNT2.getId(), ACCOUNT2.getSecret(),
|
new WeixinTokenCreator(ACCOUNT2.getId(), ACCOUNT2.getSecret())));
|
||||||
AccountType.MP)));
|
ACCOUNT3 = new WeixinMpAccount("请填入v3版本的appid", "请填入v3版本的appSecret",
|
||||||
ACCOUNT3 = new WeixinMpAccount("请填入v3版本的appid",
|
|
||||||
"请填入v3版本的appSecret",
|
|
||||||
"请填入v3版本的paysignkey", "请填入v3版本的mchid");
|
"请填入v3版本的paysignkey", "请填入v3版本的mchid");
|
||||||
PAY3 = new WeixinPayProxy(ACCOUNT3, new FileTokenHolder(
|
PAY3 = new WeixinPayProxy(ACCOUNT3, new FileTokenHolder(
|
||||||
new WeixinTokenCreator(ACCOUNT3.getId(), ACCOUNT3.getSecret(),
|
new WeixinTokenCreator(ACCOUNT3.getId(), ACCOUNT3.getSecret())));
|
||||||
AccountType.MP)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -53,8 +46,7 @@ public class PayTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void refundV2() throws WeixinException {
|
public void refundV2() throws WeixinException {
|
||||||
File caFile = new File(
|
File caFile = new File("签名文件,如12333.pfx");
|
||||||
"签名文件,如12333.pfx");
|
|
||||||
IdQuery idQuery = new IdQuery("D15020300005", IdType.TRADENO);
|
IdQuery idQuery = new IdQuery("D15020300005", IdType.TRADENO);
|
||||||
System.err.println(PAY2.refundV2(caFile, idQuery, "1422925555037", 16d,
|
System.err.println(PAY2.refundV2(caFile, idQuery, "1422925555037", 16d,
|
||||||
16d, "1221928801", "111111", null, null, null));
|
16d, "1221928801", "111111", null, null, null));
|
||||||
@ -91,8 +83,8 @@ public class PayTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void refundQueryV3() throws WeixinException {
|
public void refundQueryV3() throws WeixinException {
|
||||||
com.foxinmy.weixin4j.mp.payment.v3.RefundRecord record = PAY3.refundQueryV3(new IdQuery("TT_1427183696238",
|
com.foxinmy.weixin4j.mp.payment.v3.RefundRecord record = PAY3
|
||||||
IdType.TRADENO));
|
.refundQueryV3(new IdQuery("TT_1427183696238", IdType.TRADENO));
|
||||||
System.err.println(record);
|
System.err.println(record);
|
||||||
// 这里的验证签名需要把details循环拼接
|
// 这里的验证签名需要把details循环拼接
|
||||||
String sign = record.getSign();
|
String sign = record.getSign();
|
||||||
@ -117,12 +109,11 @@ public class PayTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void refundV3() throws WeixinException {
|
public void refundV3() throws WeixinException {
|
||||||
File caFile = new File(
|
File caFile = new File("签名文件如123.p12");
|
||||||
"签名文件如123.p12");
|
|
||||||
IdQuery idQuery = new IdQuery("TT_1427183696238", IdType.TRADENO);
|
IdQuery idQuery = new IdQuery("TT_1427183696238", IdType.TRADENO);
|
||||||
com.foxinmy.weixin4j.mp.payment.v3.RefundResult result = PAY3.refundV3(
|
com.foxinmy.weixin4j.mp.payment.v3.RefundResult result = PAY3.refundV3(
|
||||||
caFile, idQuery, "TT_R" + System.currentTimeMillis(), 0.01d, 0.01d,
|
caFile, idQuery, "TT_R" + System.currentTimeMillis(), 0.01d,
|
||||||
null, "10020674");
|
0.01d, null, "10020674");
|
||||||
System.err.println(result);
|
System.err.println(result);
|
||||||
String sign = result.getSign();
|
String sign = result.getSign();
|
||||||
result.setSign(null);
|
result.setSign(null);
|
||||||
|
|||||||
@ -1,14 +1,19 @@
|
|||||||
package com.foxinmy.weixin4j.mp.test;
|
package com.foxinmy.weixin4j.mp.test;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||||
|
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
|
||||||
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.WeixinTokenCreator;
|
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* token测试
|
* token测试
|
||||||
@ -24,11 +29,26 @@ public class TokenTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
tokenHolder = new FileTokenHolder(new WeixinTokenCreator(AccountType.MP));
|
tokenHolder = new FileTokenHolder(new WeixinTokenCreator());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws WeixinException {
|
public void test() throws WeixinException {
|
||||||
Assert.assertNotNull(tokenHolder.getToken());
|
Assert.assertNotNull(tokenHolder.getToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
String wikiUrl = "http://qydev.weixin.qq.com/wiki/index.php?title=%E5%85%A8%E5%B1%80%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E";
|
||||||
|
// wikiUrl =
|
||||||
|
// "http://mp.weixin.qq.com/wiki/17/fa4e1434e57290788bde25603fa2fcbd.html";
|
||||||
|
Document doc = Jsoup.parse(new URL(wikiUrl), 5000);
|
||||||
|
Elements errors = doc.getElementsByTag("tr");
|
||||||
|
String node = "<error><code>%s</code><text>%s</text></error>";
|
||||||
|
StringBuilder xml = new StringBuilder();
|
||||||
|
for (Element error : errors) {
|
||||||
|
xml.append(String.format(node, error.child(0).text(), error
|
||||||
|
.child(1).text()));
|
||||||
|
}
|
||||||
|
System.err.println(xml);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -138,3 +138,7 @@ weixin4j-qy
|
|||||||
* 2015-04-09
|
* 2015-04-09
|
||||||
|
|
||||||
+ **weixin4j-qy-api**: [AgentApi](./weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java)新增获取应用列表概况接口
|
+ **weixin4j-qy-api**: [AgentApi](./weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java)新增获取应用列表概况接口
|
||||||
|
|
||||||
|
* 2015-04-13
|
||||||
|
|
||||||
|
+ **weixin4j-qy-api**: 新增WeixinTokenCreator与WeixinJSTicketCreator类
|
||||||
|
|||||||
@ -106,4 +106,8 @@ weixin.properties说明
|
|||||||
|
|
||||||
* 2015-04-09
|
* 2015-04-09
|
||||||
|
|
||||||
+ [AgentApi](./src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java)新增获取应用列表概况接口
|
+ [AgentApi](./src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java)新增获取应用列表概况接口
|
||||||
|
|
||||||
|
* 2015-04-13
|
||||||
|
|
||||||
|
+ 新增WeixinTokenCreator与WeixinJSTicketCreator类
|
||||||
@ -27,12 +27,11 @@ import com.foxinmy.weixin4j.qy.model.IdParameter;
|
|||||||
import com.foxinmy.weixin4j.qy.model.Party;
|
import com.foxinmy.weixin4j.qy.model.Party;
|
||||||
import com.foxinmy.weixin4j.qy.model.Tag;
|
import com.foxinmy.weixin4j.qy.model.Tag;
|
||||||
import com.foxinmy.weixin4j.qy.model.User;
|
import com.foxinmy.weixin4j.qy.model.User;
|
||||||
|
import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
|
||||||
import com.foxinmy.weixin4j.qy.type.InviteType;
|
import com.foxinmy.weixin4j.qy.type.InviteType;
|
||||||
import com.foxinmy.weixin4j.qy.type.UserStatus;
|
import com.foxinmy.weixin4j.qy.type.UserStatus;
|
||||||
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.WeixinTokenCreator;
|
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
|
||||||
import com.foxinmy.weixin4j.type.MediaType;
|
import com.foxinmy.weixin4j.type.MediaType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,7 +58,7 @@ public class WeixinProxy {
|
|||||||
* 默认采用文件存放Token信息
|
* 默认采用文件存放Token信息
|
||||||
*/
|
*/
|
||||||
public WeixinProxy() {
|
public WeixinProxy() {
|
||||||
this(new FileTokenHolder(new WeixinTokenCreator(AccountType.QY)));
|
this(new FileTokenHolder(new WeixinTokenCreator()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,8 +68,7 @@ public class WeixinProxy {
|
|||||||
* @param corpsecret
|
* @param corpsecret
|
||||||
*/
|
*/
|
||||||
public WeixinProxy(String corpid, String corpsecret) {
|
public WeixinProxy(String corpid, String corpsecret) {
|
||||||
this(new FileTokenHolder(new WeixinTokenCreator(corpid, corpsecret,
|
this(new FileTokenHolder(new WeixinTokenCreator(corpid, corpsecret)));
|
||||||
AccountType.QY)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -75,7 +75,7 @@ public class BatchApi extends QyApi {
|
|||||||
* @param callback
|
* @param callback
|
||||||
* 接收任务执行结果的回调地址等信息
|
* 接收任务执行结果的回调地址等信息
|
||||||
* @return 异步任务id,最大长度为64字符
|
* @return 异步任务id,最大长度为64字符
|
||||||
* @see {@link com.foxinmy.weixin4j.qy.api.UserApi#batchUploadUsers(List)}
|
* @see {@link com.foxinmy.weixin4j.qy.api.MediaApi#batchUploadUsers(List)}
|
||||||
* @see com.foxinmy.weixin4j.qy.model.Callback
|
* @see com.foxinmy.weixin4j.qy.model.Callback
|
||||||
* @see <a
|
* @see <a
|
||||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.A2.9E.E9.87.8F.E6.9B.B4.E6.96.B0.E6.88.90.E5.91.98">批量更新成员</a>
|
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.A2.9E.E9.87.8F.E6.9B.B4.E6.96.B0.E6.88.90.E5.91.98">批量更新成员</a>
|
||||||
@ -113,7 +113,7 @@ public class BatchApi extends QyApi {
|
|||||||
* @param callback
|
* @param callback
|
||||||
* 接收任务执行结果的回调地址等信息
|
* 接收任务执行结果的回调地址等信息
|
||||||
* @return 异步任务id,最大长度为64字符
|
* @return 异步任务id,最大长度为64字符
|
||||||
* @see {@link com.foxinmy.weixin4j.qy.api.UserApi#batchUploadUsers(List)}
|
* @see {@link com.foxinmy.weixin4j.qy.api.MediaApi#batchUploadUsers(List)}
|
||||||
* @see com.foxinmy.weixin4j.qy.model.Callback
|
* @see com.foxinmy.weixin4j.qy.model.Callback
|
||||||
* @see <a
|
* @see <a
|
||||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E6.88.90.E5.91.98">批量覆盖成员</a>
|
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E6.88.90.E5.91.98">批量覆盖成员</a>
|
||||||
@ -138,6 +138,7 @@ public class BatchApi extends QyApi {
|
|||||||
* @param callback
|
* @param callback
|
||||||
* 接收任务执行结果的回调地址等信息
|
* 接收任务执行结果的回调地址等信息
|
||||||
* @return 异步任务id,最大长度为64字符
|
* @return 异步任务id,最大长度为64字符
|
||||||
|
* @see {@link com.foxinmy.weixin4j.qy.api.MediaApi#batchUploadParties(List)}
|
||||||
* @see com.foxinmy.weixin4j.qy.model.Callback
|
* @see com.foxinmy.weixin4j.qy.model.Callback
|
||||||
* @see <a
|
* @see <a
|
||||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E9.83.A8.E9.97.A8">批量覆盖部门</a>
|
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E9.83.A8.E9.97.A8">批量覆盖部门</a>
|
||||||
|
|||||||
@ -0,0 +1,55 @@
|
|||||||
|
package com.foxinmy.weixin4j.qy.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;
|
||||||
|
import com.foxinmy.weixin4j.token.TokenCreator;
|
||||||
|
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信企业号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("qy_jsticket_%s", appid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Token createToken() throws WeixinException {
|
||||||
|
Response response = request.get(String.format(Consts.QY_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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
package com.foxinmy.weixin4j.qy.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.WeixinQyAccount;
|
||||||
|
import com.foxinmy.weixin4j.token.TokenCreator;
|
||||||
|
import com.foxinmy.weixin4j.util.ConfigUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信企业号TOKEN创建者
|
||||||
|
*
|
||||||
|
* @className WeixinTokenCreator
|
||||||
|
* @author jy
|
||||||
|
* @date 2015年1月10日
|
||||||
|
* @since JDK 1.7
|
||||||
|
* @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 corpid;
|
||||||
|
private final String corpsecret;
|
||||||
|
|
||||||
|
public WeixinTokenCreator() {
|
||||||
|
WeixinQyAccount weixinAccount = ConfigUtil.getWeixinQyAccount();
|
||||||
|
this.corpid = weixinAccount.getId();
|
||||||
|
this.corpsecret = weixinAccount.getSecret();
|
||||||
|
this.request = new HttpRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
public WeixinTokenCreator(String corpid, String corpsecret) {
|
||||||
|
this.corpid = corpid;
|
||||||
|
this.corpsecret = corpsecret;
|
||||||
|
this.request = new HttpRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCacheKey() {
|
||||||
|
return String.format("qy_token_%s", corpid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Token createToken() throws WeixinException {
|
||||||
|
String tokenUrl = String.format(Consts.QY_ASSESS_TOKEN_URL, corpid,
|
||||||
|
corpsecret);
|
||||||
|
Response response = request.get(tokenUrl);
|
||||||
|
Token token = response.getAsObject(new TypeReference<Token>() {
|
||||||
|
});
|
||||||
|
token.setTime(System.currentTimeMillis());
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,10 +5,9 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||||
|
import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
|
||||||
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
import com.foxinmy.weixin4j.token.FileTokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||||
import com.foxinmy.weixin4j.token.WeixinTokenCreator;
|
|
||||||
import com.foxinmy.weixin4j.type.AccountType;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* token测试
|
* token测试
|
||||||
@ -25,7 +24,7 @@ public class TokenTest {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
tokenHolder = new FileTokenHolder(
|
tokenHolder = new FileTokenHolder(
|
||||||
new WeixinTokenCreator(AccountType.QY));
|
new WeixinTokenCreator());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user