新增Weixin4jSettings配置类
This commit is contained in:
@@ -168,3 +168,7 @@
|
||||
* 2016-01-23
|
||||
|
||||
+ 新增获取客服列表接口
|
||||
|
||||
* 2016-01-26
|
||||
|
||||
+ 新增上传图文消息内的图片接口
|
||||
+24
-17
@@ -25,13 +25,13 @@ weixin4j-qy
|
||||
|
||||
* PartyApi `部门管理API`
|
||||
|
||||
* ProviderApi `服务商API`
|
||||
* ProviderApi `服务商API`
|
||||
|
||||
* SuiteApi `第三方应用API`
|
||||
* SuiteApi `第三方应用API`
|
||||
|
||||
* TagApi `标签管理API`
|
||||
* TagApi `标签管理API`
|
||||
|
||||
* UserApi `成员管理API`
|
||||
* UserApi `成员管理API`
|
||||
|
||||
|
||||
如何使用
|
||||
@@ -61,25 +61,32 @@ weixin4j.properties说明
|
||||
示例(properties中换行用右斜杆\\)
|
||||
|
||||
weixin4j.account={"id":"corpid","secret":"corpsecret",\
|
||||
"suites":[{"id":"应用套件的id","secret":"应用套件的secret"}],\
|
||||
"providerSecret:"第三方提供商secret(企业号登陆)",\
|
||||
"chatSecret":"消息服务secret(企业号消息服务,暂时没用到)"}
|
||||
"suites":[{"id":"应用套件的id","secret":"应用套件的secret"}],\
|
||||
"providerSecret":"第三方提供商secret(企业号登陆)",\
|
||||
"chatSecret":"消息服务secret(企业号消息服务,暂时没用到)",\
|
||||
"mchId":"微信商户号 微信支付时需要填入",\
|
||||
"certificateKey":"加载支付证书文件的密码 如果不填写则默认获取mchId作为密码",\
|
||||
"paySignKey":"微信支付中调用API的密钥 微信支付时需要填入"}
|
||||
|
||||
# 使用FileTokenStorager时token的存放路径(如果不填则默认为Weixin4jConst#DEFAULT_TOKEN_PATH)
|
||||
weixin4j.token.path=/tmp/weixin4j/token
|
||||
# 二维码保存路径(如果不填则默认为Weixin4jConst#DEFAULT_TOKEN_PATH)
|
||||
weixin4j.qrcode.path=/tmp/weixin4j/qrcode
|
||||
# 媒体文件保存路径(如果不填则默认为Weixin4jConst#DEFAULT_MEDIA_PATH)
|
||||
weixin4j.media.path=/tmp/weixin4j/media
|
||||
# 对账单保存路径(如果不填则默认为Weixin4jConst#DEFAULT_BILL_PATH)
|
||||
weixin4j.bill.path=/tmp/weixin4j/bill
|
||||
# ca证书存放的完整路径 (证书文件后缀为*.p12)
|
||||
# ca证书存放的完整路径
|
||||
weixin4j.certificate.file=/tmp/weixin4j/xxxxx.p12
|
||||
#classpath路径下:weixin4j.certificate.file=classpath:xxxxx.p12
|
||||
# classpath路径下可以这么写(如果不填则默认为Weixin4jConst#DEFAULT_CAFILE_PATH)
|
||||
# weixin4j.certificate.file=classpath:xxxxx.pfx
|
||||
|
||||
#企业号用户身份授权后重定向的url(使用OauthApi时需要填写)
|
||||
weixin4j.user.oauth.redirect.uri=http://xxx
|
||||
|
||||
#企业号第三方管理员授权后重定向的url(使用OauthApi时需要填写)
|
||||
weixin4j.third.oauth.redirect.uri=http://xxx
|
||||
|
||||
#企业号第三方应用套件授权后重定向的url(使用OauthApi时需要填写)
|
||||
weixin4j.suite.oauth.redirect.uri=http://xxx
|
||||
# 企业号用户身份授权后重定向的url(在使用OauthApi时填写)
|
||||
weixin4j.user.oauth.redirect.uri=
|
||||
# 企业号第三方提供商授权后重定向的url(在使用OauthApi时填写)
|
||||
weixin4j.third.oauth.redirect.uri=
|
||||
# 企业号第三方应用套件授权后重定向的url(在使用OauthApi时填写)
|
||||
weixin4j.suite.oauth.redirect.uri=
|
||||
|
||||
2.实例化微信企业号接口代理对象,调用具体的API方法
|
||||
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>com.foxinmy</groupId>
|
||||
<artifactId>weixin4j</artifactId>
|
||||
<version>1.6.6</version>
|
||||
<version>1.6.7</version>
|
||||
</parent>
|
||||
<artifactId>weixin4j-qy</artifactId>
|
||||
<name>weixin4j-qy</name>
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.foxinmy.weixin4j.model.MediaItem;
|
||||
import com.foxinmy.weixin4j.model.MediaRecord;
|
||||
import com.foxinmy.weixin4j.model.MediaUploadResult;
|
||||
import com.foxinmy.weixin4j.model.Pageable;
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
import com.foxinmy.weixin4j.qy.api.AgentApi;
|
||||
import com.foxinmy.weixin4j.qy.api.BatchApi;
|
||||
import com.foxinmy.weixin4j.qy.api.ChatApi;
|
||||
@@ -22,7 +23,6 @@ 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.QyApi;
|
||||
import com.foxinmy.weixin4j.qy.api.TagApi;
|
||||
import com.foxinmy.weixin4j.qy.api.UserApi;
|
||||
import com.foxinmy.weixin4j.qy.message.ChatMessage;
|
||||
@@ -47,6 +47,7 @@ import com.foxinmy.weixin4j.qy.type.ChatType;
|
||||
import com.foxinmy.weixin4j.qy.type.InviteType;
|
||||
import com.foxinmy.weixin4j.qy.type.KfType;
|
||||
import com.foxinmy.weixin4j.qy.type.UserStatus;
|
||||
import com.foxinmy.weixin4j.settings.Weixin4jSettings;
|
||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||
import com.foxinmy.weixin4j.token.TokenStorager;
|
||||
import com.foxinmy.weixin4j.tuple.MpArticle;
|
||||
@@ -76,50 +77,27 @@ public class WeixinProxy {
|
||||
private final ChatApi chatApi;
|
||||
|
||||
private final TokenHolder tokenHolder;
|
||||
private String corpId;
|
||||
|
||||
private Weixin4jSettings settings;
|
||||
|
||||
/**
|
||||
* 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
|
||||
*/
|
||||
public WeixinProxy() {
|
||||
this(QyApi.DEFAULT_TOKEN_STORAGER);
|
||||
}
|
||||
|
||||
/**
|
||||
* 默认使用weixin4j.properties配置的账号信息
|
||||
*
|
||||
* @param tokenStorager
|
||||
* token存储策略
|
||||
*/
|
||||
public WeixinProxy(TokenStorager tokenStorager) {
|
||||
this(QyApi.DEFAULT_WEIXIN_ACCOUNT.getId(), QyApi.DEFAULT_WEIXIN_ACCOUNT
|
||||
.getSecret(), tokenStorager);
|
||||
}
|
||||
|
||||
/**
|
||||
* corpid,corpsecret
|
||||
*
|
||||
* @param corpid
|
||||
* @param corpsecret
|
||||
*/
|
||||
public WeixinProxy(String corpid, String corpsecret) {
|
||||
this(corpid, corpsecret, QyApi.DEFAULT_TOKEN_STORAGER);
|
||||
this(new Weixin4jSettings());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param corpid
|
||||
* 企业号ID
|
||||
* @param corpsecret
|
||||
* 企业号secret
|
||||
* @param tokenStorager
|
||||
* 企业号token存储器
|
||||
* @param settings
|
||||
* 配置信息
|
||||
* @see com.foxinmy.weixin4j.settings.Weixin4jSettings
|
||||
*/
|
||||
public WeixinProxy(String corpid, String corpsecret,
|
||||
TokenStorager tokenStorager) {
|
||||
this(new TokenHolder(new WeixinTokenCreator(corpid, corpsecret),
|
||||
tokenStorager));
|
||||
this.corpId = corpid;
|
||||
public WeixinProxy(Weixin4jSettings settings) {
|
||||
this(new TokenHolder(new WeixinTokenCreator(settings.getAccount()
|
||||
.getId(), settings.getAccount().getSecret()),
|
||||
settings.getTokenStorager()));
|
||||
this.settings = settings;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,7 +111,7 @@ public class WeixinProxy {
|
||||
public WeixinProxy(WeixinTokenSuiteCreator tokenCreator,
|
||||
TokenStorager tokenStorager) {
|
||||
this(new TokenHolder(tokenCreator, tokenStorager));
|
||||
this.corpId = tokenCreator.getAuthCorpId();
|
||||
this.settings = new Weixin4jSettings(tokenCreator.getAuthCorpId(), null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -167,12 +145,12 @@ public class WeixinProxy {
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业号ID
|
||||
* 获取微信账号信息
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getCorpId() {
|
||||
return this.corpId;
|
||||
public WeixinAccount getWeixinAccount() {
|
||||
return this.settings.getAccount();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -183,8 +161,9 @@ public class WeixinProxy {
|
||||
* @return
|
||||
*/
|
||||
public TokenHolder getTicketHolder(TicketType ticketType) {
|
||||
return new TokenHolder(new WeixinTicketCreator(this.corpId, ticketType,
|
||||
this.tokenHolder), this.tokenHolder.getTokenStorager());
|
||||
return new TokenHolder(new WeixinTicketCreator(getWeixinAccount()
|
||||
.getId(), ticketType, this.tokenHolder),
|
||||
this.tokenHolder.getTokenStorager());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -312,6 +291,25 @@ public class WeixinProxy {
|
||||
return menuApi.deleteMenu(agentid);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传图文消息内的图片:用于上传图片到企业号服务端,接口返回图片url,请注意,该url仅可用于图文消息的发送,
|
||||
* 且每个企业每天最多只能上传100张图片。
|
||||
*
|
||||
* @param is
|
||||
* 图片数据
|
||||
* @param fileName
|
||||
* 文件名
|
||||
* @see <a
|
||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%8A%E4%BC%A0%E5%9B%BE%E6%96%87%E6%B6%88%E6%81%AF%E5%86%85%E7%9A%84%E5%9B%BE%E7%89%87">上传图文消息内的图片</a>
|
||||
* @return 图片url
|
||||
* @see com.foxinmy.weixin4j.qy.api.MediaApi
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public String uploadImage(InputStream is, String fileName)
|
||||
throws WeixinException {
|
||||
return mediaApi.uploadImage(is, fileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传媒体文件
|
||||
* <p>
|
||||
@@ -348,7 +346,7 @@ public class WeixinProxy {
|
||||
* 企业应用Id(<font color="red">大于0时视为获取永久媒体文件</font>)
|
||||
* @param mediaId
|
||||
* 存储在微信服务器上的媒体标识
|
||||
* @return 写入硬盘后的文件对象,存储路径见weixin4j.properties配置
|
||||
* @return 写入硬盘后的文件对象
|
||||
* @throws WeixinException
|
||||
* @see com.foxinmy.weixin4j.qy.api.MediaApi
|
||||
* @see com.foxinmy.weixin4j.type.MediaType
|
||||
@@ -356,7 +354,8 @@ public class WeixinProxy {
|
||||
*/
|
||||
public File downloadMediaFile(int agentid, String mediaId)
|
||||
throws WeixinException {
|
||||
return mediaApi.downloadMediaFile(agentid, mediaId);
|
||||
return mediaApi.downloadMediaFile(agentid, mediaId,
|
||||
settings.getMediaPath());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1334,5 +1333,5 @@ public class WeixinProxy {
|
||||
return chatApi.sendChatMessage(message);
|
||||
}
|
||||
|
||||
public final static String VERSION = "1.6.6";
|
||||
public final static String VERSION = "1.6.7";
|
||||
}
|
||||
|
||||
@@ -3,19 +3,22 @@ package com.foxinmy.weixin4j.qy;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
import com.foxinmy.weixin4j.qy.api.ProviderApi;
|
||||
import com.foxinmy.weixin4j.qy.api.QyApi;
|
||||
import com.foxinmy.weixin4j.qy.api.SuiteApi;
|
||||
import com.foxinmy.weixin4j.qy.model.OUserInfo;
|
||||
import com.foxinmy.weixin4j.qy.model.WeixinQyAccount;
|
||||
import com.foxinmy.weixin4j.qy.suite.SuiteTicketHolder;
|
||||
import com.foxinmy.weixin4j.qy.token.WeixinProviderTokenCreator;
|
||||
import com.foxinmy.weixin4j.qy.type.LoginTargetType;
|
||||
import com.foxinmy.weixin4j.settings.Weixin4jSettings;
|
||||
import com.foxinmy.weixin4j.token.FileTokenStorager;
|
||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||
import com.foxinmy.weixin4j.token.TokenStorager;
|
||||
import com.foxinmy.weixin4j.util.StringUtil;
|
||||
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
|
||||
/**
|
||||
* 微信第三方应用接口实现
|
||||
@@ -34,20 +37,16 @@ public class WeixinSuiteProxy {
|
||||
private ProviderApi providerApi;
|
||||
|
||||
public WeixinSuiteProxy() {
|
||||
this(QyApi.DEFAULT_TOKEN_STORAGER);
|
||||
this(Weixin4jSettings.DEFAULT_TOKEN_PATH);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param suiteId
|
||||
* 应用ID
|
||||
* @param suiteSecret
|
||||
* 应用secret
|
||||
* @throws WeixinException
|
||||
* @param tokenPath
|
||||
* 使用文件存储token的保存路径
|
||||
*/
|
||||
public WeixinSuiteProxy(String suiteId, String suiteSecret) {
|
||||
this(QyApi.DEFAULT_TOKEN_STORAGER, null, null, new WeixinAccount(
|
||||
suiteId, suiteSecret));
|
||||
public WeixinSuiteProxy(String tokenPath) {
|
||||
this(new FileTokenStorager(tokenPath));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -56,7 +55,8 @@ public class WeixinSuiteProxy {
|
||||
* token存储
|
||||
*/
|
||||
public WeixinSuiteProxy(TokenStorager tokenStorager) {
|
||||
this(tokenStorager, QyApi.DEFAULT_WEIXIN_ACCOUNT);
|
||||
this(tokenStorager, JSON.parseObject(
|
||||
Weixin4jConfigUtil.getValue("account"), WeixinQyAccount.class));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -76,14 +76,14 @@ public class WeixinSuiteProxy {
|
||||
*
|
||||
* @param tokenStorager
|
||||
* token存储
|
||||
* @param corpId
|
||||
* @param providerCorpId
|
||||
* 服务商的企业号ID <font color="red">使用服务商API时必填项</font>
|
||||
* @param providerSecret
|
||||
* 服务商secret <font color="red">使用服务商API时必填项</font>
|
||||
* @param suites
|
||||
* 套件信息 <font color="red">使用套件API时必填项</font>
|
||||
*/
|
||||
public WeixinSuiteProxy(TokenStorager tokenStorager, String corpId,
|
||||
public WeixinSuiteProxy(TokenStorager tokenStorager, String providerCorpId,
|
||||
String providerSecret, WeixinAccount... suites) {
|
||||
if (suites != null) {
|
||||
this.suiteMap = new HashMap<String, SuiteApi>();
|
||||
@@ -94,11 +94,11 @@ public class WeixinSuiteProxy {
|
||||
this.suiteMap.put(null, suiteMap.get(suites[0].getId()));
|
||||
}
|
||||
}
|
||||
if (StringUtil.isNotBlank(corpId)
|
||||
if (StringUtil.isNotBlank(providerCorpId)
|
||||
&& StringUtil.isNotBlank(providerSecret)) {
|
||||
this.providerApi = new ProviderApi(new TokenHolder(
|
||||
new WeixinProviderTokenCreator(corpId, providerSecret),
|
||||
tokenStorager));
|
||||
new WeixinProviderTokenCreator(providerCorpId,
|
||||
providerSecret), tokenStorager));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,5 +160,5 @@ public class WeixinSuiteProxy {
|
||||
return providerApi.getLoginUrl(corpId, targetType, agentId);
|
||||
}
|
||||
|
||||
public final static String VERSION = "1.6.6";
|
||||
public final static String VERSION = "1.6.7";
|
||||
}
|
||||
|
||||
@@ -51,8 +51,6 @@ import com.foxinmy.weixin4j.util.IOUtil;
|
||||
import com.foxinmy.weixin4j.util.ObjectId;
|
||||
import com.foxinmy.weixin4j.util.RegexUtil;
|
||||
import com.foxinmy.weixin4j.util.StringUtil;
|
||||
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
import com.foxinmy.weixin4j.util.Weixin4jConst;
|
||||
import com.foxinmy.weixin4j.util.WeixinErrorUtil;
|
||||
|
||||
/**
|
||||
@@ -199,17 +197,17 @@ public class MediaApi extends QyApi {
|
||||
* 企业应用Id(<font color="red">大于0时视为获取永久媒体文件</font>)
|
||||
* @param mediaId
|
||||
* 存储在微信服务器上的媒体标识
|
||||
* @return 写入硬盘后的文件对象,存储路径见weixin4j.properties配置
|
||||
* @param mediaPath
|
||||
* 媒体素材保存路径
|
||||
* @return 写入硬盘后的文件对象
|
||||
* @throws WeixinException
|
||||
* @see com.foxinmy.weixin4j.type.MediaType
|
||||
* @see {@link #downloadMedia(int,String)}
|
||||
*/
|
||||
public File downloadMediaFile(int agentid, String mediaId)
|
||||
public File downloadMediaFile(int agentid, String mediaId, String mediaPath)
|
||||
throws WeixinException {
|
||||
String media_path = Weixin4jConfigUtil.getValue("media.path",
|
||||
Weixin4jConst.DEFAULT_MEDIA_PATH);
|
||||
final String prefixName = String.format("%d_%s.", agentid, mediaId);
|
||||
File[] files = new File(media_path).listFiles(new FilenameFilter() {
|
||||
File[] files = new File(mediaPath).listFiles(new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(File dir, String name) {
|
||||
return name.startsWith(prefixName);
|
||||
@@ -219,7 +217,7 @@ public class MediaApi extends QyApi {
|
||||
return files[0];
|
||||
}
|
||||
MediaDownloadResult result = downloadMedia(agentid, mediaId);
|
||||
File file = new File(media_path + File.separator + result.getFileName());
|
||||
File file = new File(mediaPath + File.separator + result.getFileName());
|
||||
OutputStream os = null;
|
||||
try {
|
||||
if (file.createNewFile()) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
import com.foxinmy.weixin4j.model.Consts;
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
|
||||
/**
|
||||
@@ -21,6 +22,15 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%94%E7%94%A8%E6%8E%88%E6%9D%83">企业号第三方套件应用授权说明</a>
|
||||
*/
|
||||
public class OauthApi extends QyApi {
|
||||
private final WeixinAccount account;
|
||||
|
||||
public OauthApi() {
|
||||
this(Weixin4jConfigUtil.getWeixinAccount());
|
||||
}
|
||||
|
||||
public OauthApi(WeixinAccount account) {
|
||||
this.account = account;
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业号用户身份授权
|
||||
@@ -30,7 +40,7 @@ public class OauthApi extends QyApi {
|
||||
* @return 请求授权的URL
|
||||
*/
|
||||
public String getUserAuthorizeURL() {
|
||||
String corpId = DEFAULT_WEIXIN_ACCOUNT.getId();
|
||||
String corpId = account.getId();
|
||||
String redirectUri = Weixin4jConfigUtil
|
||||
.getValue("user.oauth.redirect.uri");
|
||||
return getUserAuthorizeURL(corpId, redirectUri, "state");
|
||||
@@ -69,7 +79,7 @@ public class OauthApi extends QyApi {
|
||||
* @return 请求授权的URL
|
||||
*/
|
||||
public String getThirdAuthorizeURL() {
|
||||
String corpId = DEFAULT_WEIXIN_ACCOUNT.getId();
|
||||
String corpId = account.getId();
|
||||
String redirectUri = Weixin4jConfigUtil
|
||||
.getValue("third.oauth.redirect.uri");
|
||||
return getThirdAuthorizeURL(corpId, redirectUri, "state");
|
||||
|
||||
@@ -2,10 +2,7 @@ package com.foxinmy.weixin4j.qy.api;
|
||||
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.foxinmy.weixin4j.api.BaseApi;
|
||||
import com.foxinmy.weixin4j.qy.model.WeixinQyAccount;
|
||||
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
|
||||
/**
|
||||
* 微信企业号API
|
||||
@@ -20,16 +17,9 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
public class QyApi extends BaseApi {
|
||||
|
||||
private final static ResourceBundle WEIXIN_BUNDLE;
|
||||
/**
|
||||
* 默认使用weixin4j.properties文件中的企业号信息
|
||||
*/
|
||||
public final static WeixinQyAccount DEFAULT_WEIXIN_ACCOUNT;
|
||||
|
||||
static {
|
||||
WEIXIN_BUNDLE = ResourceBundle
|
||||
.getBundle("com/foxinmy/weixin4j/qy/api/weixin");
|
||||
DEFAULT_WEIXIN_ACCOUNT = JSON.parseObject(
|
||||
Weixin4jConfigUtil.getValue("account"), WeixinQyAccount.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -47,9 +47,6 @@ public class SuiteApi extends QyApi {
|
||||
*
|
||||
* @param suiteTicketHolder
|
||||
* 套件ticket存取
|
||||
* @param tokenStorager
|
||||
* 应用token存储器
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public SuiteApi(SuiteTicketHolder suiteTicketHolder) {
|
||||
this.suiteTicketHolder = suiteTicketHolder;
|
||||
|
||||
@@ -1,26 +1,29 @@
|
||||
# \u6d4b\u8bd5\u4e4b\u7528 \u6b63\u5f0f\u73af\u5883\u4e0bcopy\u4e00\u4efd\u5230classpath
|
||||
# \u4f01\u4e1a\u53f7\u4fe1\u606f
|
||||
weixin4j.account={"id":"id","secret":"secret",\
|
||||
weixin4j.account={"id":"wx5132afc5da26d661","secret":"GsnKLVDI1pWArdB60Ze4iP2cwFvcW5KCAs2vLJldipilmSYxtbkcAiBcGSHHvu_I",\
|
||||
"suites":[{"id":"\u5e94\u7528\u5957\u4ef6\u7684id","secret":"\u5e94\u7528\u5957\u4ef6\u7684secret"}],\
|
||||
"providerSecret":"\u7b2c\u4e09\u65b9\u63d0\u4f9b\u5546secret(\u4f01\u4e1a\u53f7\u767b\u9646)",\
|
||||
"chatSecret":"\u6d88\u606f\u670d\u52a1secret(\u4f01\u4e1a\u53f7\u6d88\u606f\u670d\u52a1,\u6682\u65f6\u6ca1\u7528\u5230)"}
|
||||
"chatSecret":"\u6d88\u606f\u670d\u52a1secret(\u4f01\u4e1a\u53f7\u6d88\u606f\u670d\u52a1,\u6682\u65f6\u6ca1\u7528\u5230)",\
|
||||
"mchId":"\u5fae\u4fe1\u5546\u6237\u53f7 \u5fae\u4fe1\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
|
||||
"certificateKey":"\u52a0\u8f7d\u652f\u4ed8\u8bc1\u4e66\u6587\u4ef6\u7684\u5bc6\u7801 \u5982\u679c\u4e0d\u586b\u5199\u5219\u9ed8\u8ba4\u83b7\u53d6mchId\u4f5c\u4e3a\u5bc6\u7801",\
|
||||
"paySignKey":"\u5fae\u4fe1\u652f\u4ed8\u4e2d\u8c03\u7528API\u7684\u5bc6\u94a5 \u5fae\u4fe1\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165"}
|
||||
|
||||
# \u4f7f\u7528FileTokenStorager\u65f6token\u7684\u5b58\u653e\u8def\u5f84
|
||||
# \u4f7f\u7528FileTokenStorager\u65f6token\u7684\u5b58\u653e\u8def\u5f84(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_TOKEN_PATH)
|
||||
weixin4j.token.path=/tmp/weixin4j/token
|
||||
# \u5a92\u4f53\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84
|
||||
# \u5a92\u4f53\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_MEDIA_PATH)
|
||||
weixin4j.media.path=/tmp/weixin4j/media
|
||||
# \u5bf9\u8d26\u5355\u4fdd\u5b58\u8def\u5f84
|
||||
# \u5bf9\u8d26\u5355\u4fdd\u5b58\u8def\u5f84(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_BILL_PATH)
|
||||
weixin4j.bill.path=/tmp/weixin4j/bill
|
||||
# ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84 (V2\u7248\u672c\u540e\u7f00\u4e3a*.pfx,V3\u7248\u672c\u540e\u7f00\u4e3a*.p12)
|
||||
weixin4j.certificate.file=/tmp/weixin4j/xxxxx.p12
|
||||
# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199
|
||||
# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_CAFILE_PATH)
|
||||
# weixin4j.certificate.file=classpath:xxxxx.pfx
|
||||
|
||||
# \u4f01\u4e1a\u53f7\u7528\u6237\u8eab\u4efd\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url
|
||||
# \u4f01\u4e1a\u53f7\u7528\u6237\u8eab\u4efd\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199)
|
||||
weixin4j.user.oauth.redirect.uri=
|
||||
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u63d0\u4f9b\u5546\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u63d0\u4f9b\u5546\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199)
|
||||
weixin4j.third.oauth.redirect.uri=
|
||||
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u5e94\u7528\u5957\u4ef6\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u5e94\u7528\u5957\u4ef6\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199)
|
||||
weixin4j.suite.oauth.redirect.uri=
|
||||
@@ -47,7 +47,8 @@ public class MediaTest extends TokenTest {
|
||||
File file = mediaApi
|
||||
.downloadMediaFile(
|
||||
0,
|
||||
"1y0NWE5ochkfOoiyJsPwQ3Wg7gsyRHNp8SveqhGXY_1rOH7OcOMwfHDg8KH6s88osq59AfS3BX-MBBKvERB7Bvw");
|
||||
"1y0NWE5ochkfOoiyJsPwQ3Wg7gsyRHNp8SveqhGXY_1rOH7OcOMwfHDg8KH6s88osq59AfS3BX-MBBKvERB7Bvw",
|
||||
"/tmp/weixin4j/media");
|
||||
Assert.assertTrue(file.exists());
|
||||
}
|
||||
|
||||
|
||||
@@ -28,8 +28,8 @@ public class TokenTest {
|
||||
WeixinAccount weixinAccount = Weixin4jConfigUtil.getWeixinAccount();
|
||||
tokenHolder = new TokenHolder(new WeixinTokenCreator(
|
||||
weixinAccount.getId(), weixinAccount.getSecret()),
|
||||
new FileTokenStorager(Weixin4jConfigUtil.getValue(
|
||||
"token.path", "/tmp/weixin4j/token")));
|
||||
new FileTokenStorager(Weixin4jConfigUtil.getValue("token.path",
|
||||
"/tmp/weixin4j/token")));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user