() {
});
qr_uri = getRequestUri("qr_image_uri");
- response = weixinExecutor.get(String.format(qr_uri, result.getTicket()));
+ response = weixinExecutor
+ .get(String.format(qr_uri, result.getTicket()));
try {
result.setContent(IOUtil.toByteArray(response.getBody()));
} catch (IOException e) {
@@ -72,6 +71,8 @@ public class QrApi extends MpApi {
*
* @param parameter
* 二维码参数
+ * @param qrcodePath
+ * 二维码保存路径
* @return 硬盘存储的文件对象
* @throws WeixinException
* @see 0 && file.exists()) {
return file;
}
diff --git a/weixin4j-mp/src/main/resources/weixin4j.properties b/weixin4j-mp/src/main/resources/weixin4j.properties
index 7815943b..ff52cfd4 100644
--- a/weixin4j-mp/src/main/resources/weixin4j.properties
+++ b/weixin4j-mp/src/main/resources/weixin4j.properties
@@ -1,23 +1,24 @@
# \u6d4b\u8bd5\u4e4b\u7528 \u6b63\u5f0f\u73af\u5883\u4e0bcopy\u4e00\u4efd\u5230classpath
# \u516c\u4f17\u53f7\u4fe1\u606f
weixin4j.account={"id":"wx4ab8f8de58159a57","secret":"1d4eb0f4bf556aaed539f30ed05ca795",\
-"mchId":"V3.x\u7248\u672c\u4e0b\u7684\u5fae\u4fe1\u5546\u6237\u53f7 \u670d\u52a1\u53f7\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
-"partnerId":"V2\u7248\u672c\u4e0b\u7684\u8d22\u4ed8\u901a\u7684\u5546\u6237\u53f7 \u670d\u52a1\u53f7\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
-"partnerKey":"V2\u7248\u672c\u4e0b\u7684\u8d22\u4ed8\u901a\u5546\u6237\u6743\u9650\u5bc6\u94a5Key \u670d\u52a1\u53f7\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
-"paySignKey":"\u5fae\u4fe1\u652f\u4ed8\u4e2d\u8c03\u7528API\u7684\u5bc6\u94a5 \u670d\u52a1\u53f7\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165"}
+"mchId":"V3.x\u7248\u672c\u4e0b\u7684\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",\
+"partnerId":"V2\u7248\u672c\u4e0b\u7684\u8d22\u4ed8\u901a\u7684\u5546\u6237\u53f7 \u8001\u7248\u672c\u5fae\u4fe1\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
+"partnerKey":"V2\u7248\u672c\u4e0b\u7684\u8d22\u4ed8\u901a\u5546\u6237\u6743\u9650\u5bc6\u94a5Key \u8001\u7248\u672c\u5fae\u4fe1\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
+"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
-# \u4e8c\u7ef4\u7801\u4fdd\u5b58\u8def\u5f84
+# \u4e8c\u7ef4\u7801\u4fdd\u5b58\u8def\u5f84(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_TOKEN_PATH)
weixin4j.qrcode.path=/tmp/weixin4j/qrcode
-# \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
-# \u7528\u6237oauth\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url
+# \u7528\u6237oauth\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199)
weixin4j.user.oauth.redirect.uri=
\ No newline at end of file
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java
index 40011b1a..9e81cd50 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java
@@ -94,7 +94,8 @@ public class MediaTest extends TokenTest {
@Test
public void download2() throws WeixinException, IOException {
- File file = mediaApi.downloadMediaFile("8790403529", true);
+ File file = mediaApi.downloadMediaFile("8790403529", true,
+ "/tmp/weixin4j/media");
Assert.assertTrue(file.exists());
}
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java
index ac04bac9..74be7575 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java
@@ -19,12 +19,11 @@ import com.foxinmy.weixin4j.payment.mch.ApiResult;
import com.foxinmy.weixin4j.payment.mch.MchPayPackage;
import com.foxinmy.weixin4j.payment.mch.Order;
import com.foxinmy.weixin4j.payment.mch.PrePay;
-import com.foxinmy.weixin4j.token.FileTokenStorager;
+import com.foxinmy.weixin4j.settings.Weixin4jPaySettings;
import com.foxinmy.weixin4j.type.IdQuery;
import com.foxinmy.weixin4j.type.IdType;
import com.foxinmy.weixin4j.type.TradeType;
import com.foxinmy.weixin4j.util.DigestUtil;
-import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
public class PayTest {
protected final static Pay2Api PAY2;
@@ -33,14 +32,13 @@ public class PayTest {
protected final static WeixinPayAccount ACCOUNT3;
static {
ACCOUNT2 = new WeixinPayAccount("请填入v2版本的appid", "请填入v2版本的appSecret",
- "请填入v2版本的paysignkey", null, null, null, "请填入v2版本的partnerId",
- "请填入v2版本的partnerKey");
- PAY2 = new Pay2Api(ACCOUNT2, new FileTokenStorager(
- Weixin4jConfigUtil
- .getValue("token.path", "/tmp/weixin4j/token")));
+ "请填入v2版本的paysignkey", null, null, null, null,
+ "请填入v2版本的partnerId", "请填入v2版本的partnerKey");
+ PAY2 = new Pay2Api(new Weixin4jPaySettings(ACCOUNT2));
ACCOUNT3 = new WeixinPayAccount("请填入v3版本的appid", "请填入v3版本的appSecret",
- "请填入v3版本的paysignkey", "请填入v3版本的mchid", null, null, null, null);
- PAY3 = new WeixinPayProxy(ACCOUNT3);
+ "请填入v3版本的paysignkey", "请填入v3版本的mchid", null, null, null, null,
+ null);
+ PAY3 = new WeixinPayProxy(new Weixin4jPaySettings(ACCOUNT3));
}
/**
* 商户证书文件
@@ -55,7 +53,6 @@ public class PayTest {
@Test
public void refundV2() throws WeixinException {
- File caFile = new File("证书文件,如12333.pfx");
IdQuery idQuery = new IdQuery("D15020300005", IdType.TRADENO);
System.err.println(PAY2.refundApply(caFile, idQuery, "1422925555037",
16d, 16d, "1221928801", "111111", null, null, null));
@@ -84,7 +81,8 @@ public class PayTest {
System.err.println(order);
String sign = order.getSign();
order.setSign(null);
- String valiSign = DigestUtil.paysignMd5(order, ACCOUNT3.getPaySignKey());
+ String valiSign = DigestUtil
+ .paysignMd5(order, ACCOUNT3.getPaySignKey());
System.err
.println(String.format("sign=%s,valiSign=%s", sign, valiSign));
Assert.assertEquals(valiSign, sign);
@@ -98,7 +96,8 @@ public class PayTest {
// 这里的验证签名需要把details循环拼接
String sign = record.getSign();
record.setSign(null);
- String valiSign = DigestUtil.paysignMd5(record, ACCOUNT3.getPaySignKey());
+ String valiSign = DigestUtil.paysignMd5(record,
+ ACCOUNT3.getPaySignKey());
System.err
.println(String.format("sign=%s,valiSign=%s", sign, valiSign));
Assert.assertEquals(valiSign, sign);
@@ -118,7 +117,6 @@ public class PayTest {
@Test
public void refundV3() throws WeixinException, IOException {
- File caFile = new File("签名文件如123.p12");
IdQuery idQuery = new IdQuery("TT_1427183696238", IdType.TRADENO);
com.foxinmy.weixin4j.payment.mch.RefundResult result = PAY3
.refundApply(new FileInputStream(caFile), idQuery, "TT_R"
@@ -127,7 +125,8 @@ public class PayTest {
System.err.println(result);
String sign = result.getSign();
result.setSign(null);
- String valiSign = DigestUtil.paysignMd5(result, ACCOUNT3.getPaySignKey());
+ String valiSign = DigestUtil.paysignMd5(result,
+ ACCOUNT3.getPaySignKey());
System.err
.println(String.format("sign=%s,valiSign=%s", sign, valiSign));
Assert.assertEquals(valiSign, sign);
@@ -154,7 +153,8 @@ public class PayTest {
System.err.println(result);
String sign = result.getSign();
result.setSign(null);
- String valiSign = DigestUtil.paysignMd5(result, ACCOUNT3.getPaySignKey());
+ String valiSign = DigestUtil.paysignMd5(result,
+ ACCOUNT3.getPaySignKey());
System.err
.println(String.format("sign=%s,valiSign=%s", sign, valiSign));
Assert.assertEquals(valiSign, sign);
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/QRTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/QRTest.java
index ed60d93e..a1d809f7 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/QRTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/QRTest.java
@@ -29,19 +29,23 @@ public class QRTest extends TokenTest {
@Test
public void temp_qr() throws WeixinException, IOException {
- File file = qrApi.createQRFile(QRParameter.createTemporary(1200, 1200));
+ File file = qrApi.createQRFile(QRParameter.createTemporary(1200, 1200),
+ "/tmp/weixin4j/qrcode");
Assert.assertTrue(file.exists());
}
@Test
public void forever_qr_int() throws WeixinException, IOException {
- File file = qrApi.createQRFile(QRParameter.createPermanenceInt(2));
+ File file = qrApi.createQRFile(QRParameter.createPermanenceInt(2),
+ "/tmp/weixin4j/qrcode");
Assert.assertTrue(file.exists());
}
@Test
public void forever_qr_str() throws WeixinException, IOException {
- File file = qrApi.createQRFile(QRParameter.createPermanenceStr("1200中文"));
+ File file = qrApi.createQRFile(
+ QRParameter.createPermanenceStr("1200中文"),
+ "/tmp/weixin4j/qrcode");
Assert.assertTrue(file.exists());
}
}
diff --git a/weixin4j-qy/CHANGE.md b/weixin4j-qy/CHANGE.md
index 79464071..7d427724 100644
--- a/weixin4j-qy/CHANGE.md
+++ b/weixin4j-qy/CHANGE.md
@@ -168,3 +168,7 @@
* 2016-01-23
+ 新增获取客服列表接口
+
+* 2016-01-26
+
+ + 新增上传图文消息内的图片接口
\ No newline at end of file
diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md
index 1f9163bc..8b6b6c5d 100644
--- a/weixin4j-qy/README.md
+++ b/weixin4j-qy/README.md
@@ -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方法
diff --git a/weixin4j-qy/pom.xml b/weixin4j-qy/pom.xml
index d9d7656f..a2a0cf20 100644
--- a/weixin4j-qy/pom.xml
+++ b/weixin4j-qy/pom.xml
@@ -5,7 +5,7 @@
com.foxinmy
weixin4j
- 1.6.6
+ 1.6.7
weixin4j-qy
weixin4j-qy
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
index 64f7d38c..ada1e02a 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
@@ -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 上传图文消息内的图片
+ * @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);
+ }
+
/**
* 上传媒体文件
*
@@ -348,7 +346,7 @@ public class WeixinProxy {
* 企业应用Id(大于0时视为获取永久媒体文件)
* @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";
}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java
index 2f50b211..a5d42e03 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java
@@ -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 使用服务商API时必填项
* @param providerSecret
* 服务商secret 使用服务商API时必填项
* @param suites
* 套件信息 使用套件API时必填项
*/
- public WeixinSuiteProxy(TokenStorager tokenStorager, String corpId,
+ public WeixinSuiteProxy(TokenStorager tokenStorager, String providerCorpId,
String providerSecret, WeixinAccount... suites) {
if (suites != null) {
this.suiteMap = new HashMap();
@@ -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";
}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
index 6b55593a..f3b162f7 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
@@ -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(大于0时视为获取永久媒体文件)
* @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()) {
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java
index 198a75ce..b45845cc 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java
@@ -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">企业号第三方套件应用授权说明
*/
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");
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java
index ae83125a..e31ca225 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java
@@ -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
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java
index 3321ab1f..338115ff 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java
@@ -47,9 +47,6 @@ public class SuiteApi extends QyApi {
*
* @param suiteTicketHolder
* 套件ticket存取
- * @param tokenStorager
- * 应用token存储器
- * @throws WeixinException
*/
public SuiteApi(SuiteTicketHolder suiteTicketHolder) {
this.suiteTicketHolder = suiteTicketHolder;
diff --git a/weixin4j-qy/src/main/resources/weixin4j.properties b/weixin4j-qy/src/main/resources/weixin4j.properties
index 5dfa1735..ac7dfcd1 100644
--- a/weixin4j-qy/src/main/resources/weixin4j.properties
+++ b/weixin4j-qy/src/main/resources/weixin4j.properties
@@ -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=
\ No newline at end of file
diff --git a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/MediaTest.java b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/MediaTest.java
index dd2e4e69..2b0aff37 100644
--- a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/MediaTest.java
+++ b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/MediaTest.java
@@ -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());
}
diff --git a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
index c07753c8..d593b63b 100644
--- a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
+++ b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
@@ -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
diff --git a/weixin4j-server/pom.xml b/weixin4j-server/pom.xml
index 0849f287..5cbe6f68 100644
--- a/weixin4j-server/pom.xml
+++ b/weixin4j-server/pom.xml
@@ -5,10 +5,10 @@
com.foxinmy
weixin4j
- 1.6.6
+ 1.6.7
weixin4j-server
- 1.1.5
+ 1.1.6
weixin4j-server
https://github.com/foxinmy/weixin4j/tree/master/weixin4j-server
微信消息netty服务器
diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java
index 8e0f040e..1c25cbaf 100644
--- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java
+++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java
@@ -315,5 +315,5 @@ public final class WeixinServerBootstrap {
return this;
}
- public final static String VERSION = "1.1.5";
+ public final static String VERSION = "1.1.6";
}
\ No newline at end of file