commons-httpclient
commons-httpclient
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
index 07418582..390b13e1 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
@@ -12,6 +12,7 @@ import java.nio.charset.Charset;
* @see
*/
public final class Consts {
+ public static final String WEIXIN4J = "weixin4j";
public static final Charset UTF_8 = Charset.forName("UTF-8");
public static final Charset GBK = Charset.forName("GBK");
public static final String SUCCESS = "SUCCESS";
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinPayAccount.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinPayAccount.java
index 395bb4f6..03ce99e0 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinPayAccount.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinPayAccount.java
@@ -49,9 +49,9 @@ public class WeixinPayAccount extends WeixinAccount {
* 商户平台版本(V3)字段
*
* @param appId
- * 公众号唯一的身份ID
+ * 公众号唯一的身份ID(必填)
* @param appSecret
- * 调用接口的凭证
+ * 调用接口的凭证(最好填写)
* @param paySignKey
* 支付密钥字符串(必填)
* @param mchId
@@ -68,7 +68,7 @@ public class WeixinPayAccount extends WeixinAccount {
* @param appId
* 公众号唯一的身份ID(必填)
* @param appSecret
- * 调用接口的凭证(必填)
+ * 调用接口的凭证(最好填写)
* @param paySignKey
* 支付密钥字符串(必填)
* @param mchId
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java
index 0b8f72f6..9cd83f11 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java
@@ -30,11 +30,11 @@ import com.foxinmy.weixin4j.payment.mch.Redpacket;
import com.foxinmy.weixin4j.payment.mch.RedpacketRecord;
import com.foxinmy.weixin4j.payment.mch.RedpacketSendResult;
import com.foxinmy.weixin4j.payment.mch.RefundRecord;
-import com.foxinmy.weixin4j.settings.Weixin4jPaySettings;
import com.foxinmy.weixin4j.type.BillType;
import com.foxinmy.weixin4j.type.CurrencyType;
import com.foxinmy.weixin4j.type.IdQuery;
import com.foxinmy.weixin4j.type.TradeType;
+import com.foxinmy.weixin4j.util.Weixin4jSettings;
/**
* 微信支付接口实现
@@ -52,26 +52,26 @@ public class WeixinPayProxy {
private final CouponApi couponApi;
private final CashApi cashApi;
- private final Weixin4jPaySettings settings;
+ private final Weixin4jSettings settings;
/**
* 使用weixin4j.properties配置的支付账号信息
*/
public WeixinPayProxy() {
- this(new Weixin4jPaySettings());
+ this(new Weixin4jSettings());
}
/**
*
* @param settings
* 支付相关配置信息
- * @see com.foxinmy.weixin4j.settings.Weixin4jPaySettings
+ * @see com.foxinmy.weixin4j.util.Weixin4jSettings
*/
- public WeixinPayProxy(Weixin4jPaySettings settings) {
+ public WeixinPayProxy(Weixin4jSettings settings) {
this.settings = settings;
- this.pay3Api = new Pay3Api(settings.getPayAccount());
- this.couponApi = new CouponApi(settings.getPayAccount());
- this.cashApi = new CashApi(settings.getPayAccount());
+ this.pay3Api = new Pay3Api(settings.getWeixinPayAccount());
+ this.couponApi = new CouponApi(settings.getWeixinPayAccount());
+ this.cashApi = new CashApi(settings.getWeixinPayAccount());
}
/**
@@ -80,7 +80,7 @@ public class WeixinPayProxy {
* @return
*/
public WeixinPayAccount getPayAccount() {
- return this.settings.getPayAccount();
+ return this.settings.getWeixinPayAccount();
}
/**
@@ -467,7 +467,7 @@ public class WeixinPayProxy {
IdQuery idQuery, String outRefundNo, double totalFee)
throws WeixinException, IOException {
return pay3Api.refundApply(
- new FileInputStream(settings.getCertificatePath()), idQuery,
+ new FileInputStream(settings.getCertificateFile0()), idQuery,
outRefundNo, totalFee);
}
@@ -514,7 +514,7 @@ public class WeixinPayProxy {
*/
public File downloadBill(Date billDate, BillType billType)
throws WeixinException {
- return pay3Api.downloadBill(billDate, billType, settings.getBillPath());
+ return pay3Api.downloadBill(billDate, billType, settings.getTmpdir0());
}
/**
@@ -551,7 +551,7 @@ public class WeixinPayProxy {
public ApiResult reverseOrder(IdQuery idQuery) throws WeixinException,
IOException {
return pay3Api.reverseOrder(
- new FileInputStream(settings.getCertificatePath()), idQuery);
+ new FileInputStream(settings.getCertificateFile0()), idQuery);
}
/**
@@ -655,7 +655,7 @@ public class WeixinPayProxy {
public CouponResult sendCoupon(String couponStockId, String partnerTradeNo,
String openId) throws WeixinException, IOException {
return couponApi.sendCoupon(
- new FileInputStream(settings.getCertificatePath()),
+ new FileInputStream(settings.getCertificateFile0()),
couponStockId, partnerTradeNo, openId, null);
}
@@ -721,7 +721,7 @@ public class WeixinPayProxy {
public RedpacketSendResult sendRedpack(Redpacket redpacket)
throws WeixinException, IOException {
return cashApi.sendRedpack(
- new FileInputStream(settings.getCertificatePath()), redpacket);
+ new FileInputStream(settings.getCertificateFile0()), redpacket);
}
/**
@@ -750,8 +750,10 @@ public class WeixinPayProxy {
*/
public RedpacketRecord queryRedpack(String outTradeNo)
throws WeixinException, IOException {
- return cashApi.queryRedpack(
- new FileInputStream(settings.getCertificatePath()), outTradeNo);
+ return cashApi
+ .queryRedpack(
+ new FileInputStream(settings.getCertificateFile0()),
+ outTradeNo);
}
/**
@@ -782,7 +784,7 @@ public class WeixinPayProxy {
public MPPaymentResult mpPayment(MPPayment mpPayment)
throws WeixinException, IOException {
return cashApi.mchPayment(
- new FileInputStream(settings.getCertificatePath()), mpPayment);
+ new FileInputStream(settings.getCertificateFile0()), mpPayment);
}
/**
@@ -811,8 +813,10 @@ public class WeixinPayProxy {
*/
public MPPaymentRecord mpPaymentQuery(String outTradeNo)
throws WeixinException, IOException {
- return cashApi.mchPaymentQuery(
- new FileInputStream(settings.getCertificatePath()), outTradeNo);
+ return cashApi
+ .mchPaymentQuery(
+ new FileInputStream(settings.getCertificateFile0()),
+ outTradeNo);
}
/**
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jHttpSettings.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jHttpSettings.java
deleted file mode 100644
index e26af308..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jHttpSettings.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.foxinmy.weixin4j.settings;
-
-/**
- * 微信请求配置相关(待实现
- *
- * @className Weixin4jHttpSettings
- * @author jy
- * @date 2016年1月28日
- * @since JDK 1.6
- * @see
- */
-public class Weixin4jHttpSettings {
-
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jPaySettings.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jPaySettings.java
deleted file mode 100644
index 54bc5580..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jPaySettings.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.foxinmy.weixin4j.settings;
-
-import com.alibaba.fastjson.JSON;
-import com.foxinmy.weixin4j.model.WeixinPayAccount;
-import com.foxinmy.weixin4j.util.StringUtil;
-import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
-
-/**
- * 微信支付配置相关
- *
- * @className Weixin4jPaySettings
- * @author jy
- * @date 2016年1月28日
- * @since JDK 1.6
- * @see
- */
-public class Weixin4jPaySettings {
-
- private final WeixinPayAccount payAccount;
-
- public Weixin4jPaySettings() {
- this(JSON.parseObject(Weixin4jConfigUtil.getValue("account"),
- WeixinPayAccount.class));
- }
-
- public Weixin4jPaySettings(WeixinPayAccount payAccount) {
- this.payAccount = payAccount;
- }
-
- /**
- * 支付账号信息
- *
- * @return
- */
- public WeixinPayAccount getPayAccount() {
- return this.payAccount;
- }
-
- private String billPath;
-
- /**
- * 对账单保存路径
- *
- * @param billPath
- * 硬盘目录
- */
- public Weixin4jPaySettings billPath(String billPath) {
- this.billPath = billPath;
- return this;
- }
-
- /**
- * 默认对账单保存路径
- */
- public static final String DEFAULT_BILL_PATH = "/tmp/weixin4j/bill";
-
- /**
- * 对账单保存路径,默认值为{@link #DEFAULT_BILL_PATH}
- *
- * @return
- */
- public String getBillPath() {
- if (StringUtil.isBlank(billPath)) {
- this.billPath = Weixin4jConfigUtil.getClassPathValue("bill.path",
- DEFAULT_BILL_PATH);
- }
- return this.billPath;
- }
-
- private String certificatePath;
-
- /**
- * ca证书存放路径
- *
- * @param certificatePath
- * 硬盘目录
- * @return
- */
- public Weixin4jPaySettings certificatePath(String certificatePath) {
- this.certificatePath = certificatePath;
- return this;
- }
-
- /**
- * 默认ca证书存放路径
- */
- public static final String DEFAULT_CAFILE_PATH = "classpath:ca.p12";
-
- /**
- * ca证书存放路径,默认值为{@link #DEFAULT_CAFILE_PATH}
- *
- * @return
- */
- public String getCertificatePath() {
- if (StringUtil.isBlank(certificatePath)) {
- this.certificatePath = Weixin4jConfigUtil.getClassPathValue(
- "certificate.path", DEFAULT_CAFILE_PATH);
- }
- return this.certificatePath;
- }
-
- @Override
- public String toString() {
- return "Weixin4jPaySettings [payAccount=" + payAccount + ", billPath="
- + getBillPath() + ", certificatePath=" + getCertificatePath()
- + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jSettings.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jSettings.java
deleted file mode 100644
index 1eeff35d..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/settings/Weixin4jSettings.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package com.foxinmy.weixin4j.settings;
-
-import com.foxinmy.weixin4j.model.WeixinAccount;
-import com.foxinmy.weixin4j.token.FileTokenStorager;
-import com.foxinmy.weixin4j.token.TokenStorager;
-import com.foxinmy.weixin4j.util.StringUtil;
-import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
-
-/**
- * 微信基础配置相关
- *
- * @className Weixin4jSettings
- * @author jy
- * @date 2016年1月28日
- * @since JDK 1.6
- * @see
- */
-public class Weixin4jSettings {
-
- private final WeixinAccount account;
-
- public Weixin4jSettings() {
- this(Weixin4jConfigUtil.getWeixinAccount());
- }
-
- /**
- *
- * @param id
- * 应用唯一标识 appid/corpid
- * @param secret
- * 应用接口密钥
- */
- public Weixin4jSettings(String id, String secret) {
- this(new WeixinAccount(id, secret));
- }
-
- public Weixin4jSettings(WeixinAccount account) {
- this.account = account;
- }
-
- /**
- * 微信账号信息
- */
- public WeixinAccount getAccount() {
- return this.account;
- }
-
- private String tokenPath;
-
- /**
- * 使用FileTokenStorager时token的存放路径
- *
- * @param tokenPath
- * 硬盘目录
- * @return
- */
- public Weixin4jSettings setTokenPath(String tokenPath) {
- this.tokenPath = tokenPath;
- return this;
- }
-
- /**
- * 默认token的存放路径
- */
- public static final String DEFAULT_TOKEN_PATH = "/tmp/weixin4j/token";
-
- /**
- * 使用FileTokenStorager时token的存放路径,默认值为{@link #DEFAULT_TOKEN_PATH}
- */
- public String getTokenPath() {
- if (StringUtil.isBlank(tokenPath)) {
- tokenPath = Weixin4jConfigUtil.getClassPathValue("token.path",
- DEFAULT_TOKEN_PATH);
- }
- return tokenPath;
- }
-
- private String qrcodePath;
-
- /**
- * 二维码保存路径
- *
- * @param qrcodePath
- * 硬盘目录
- */
- public Weixin4jSettings setQrcodePath(String qrcodePath) {
- this.qrcodePath = qrcodePath;
- return this;
- }
-
- /**
- * 默认二维码保存路径
- */
- public static final String DEFAULT_QRCODE_PATH = "/tmp/weixin4j/qrcode";
-
- /**
- * 二维码保存路径,默认值为{@link #DEFAULT_QRCODE_PATH}
- */
- public String getQrcodePath() {
- if (StringUtil.isBlank(qrcodePath)) {
- this.qrcodePath = Weixin4jConfigUtil.getClassPathValue(
- "qrcode.path", DEFAULT_QRCODE_PATH);
- }
- return this.qrcodePath;
- }
-
- private String mediaPath;
-
- /**
- * 媒体文件保存路径
- *
- * @param mediaPath
- * 硬盘目录
- */
- public Weixin4jSettings setMediaPath(String mediaPath) {
- this.mediaPath = mediaPath;
- return this;
- }
-
- /**
- * 默认媒体文件保存路径
- */
- public static final String DEFAULT_MEDIA_PATH = "/tmp/weixin4j/media";
-
- /**
- * 媒体文件保存路径,默认值为{@link #DEFAULT_MEDIA_PATH}
- */
- public String getMediaPath() {
- if (StringUtil.isBlank(mediaPath)) {
- this.mediaPath = Weixin4jConfigUtil.getClassPathValue("media.path",
- DEFAULT_MEDIA_PATH);
- }
- return this.mediaPath;
- }
-
- private TokenStorager tokenStorager;
-
- /**
- * token存储
- *
- * @param tokenStorager
- * @return
- */
- public Weixin4jSettings setTokenStorager(TokenStorager tokenStorager) {
- this.tokenStorager = tokenStorager;
- return this;
- }
-
- /**
- * 获取token存储方式 默认为FileTokenStorager
- *
- * @return
- */
- public TokenStorager getTokenStorager() {
- if (tokenStorager == null) {
- this.tokenStorager = new FileTokenStorager(getTokenPath());
- }
- return this.tokenStorager;
- }
-
- @Override
- public String toString() {
- return "Weixin4jSettings [account=" + account + ", tokenPath="
- + getTokenPath() + ", qrcodePath=" + getQrcodePath()
- + ", mediaPath=" + getMediaPath() + ", tokenStorager="
- + getTokenStorager() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/Weixin4jConfigUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/Weixin4jConfigUtil.java
index 0afc53bf..ccc628b9 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/Weixin4jConfigUtil.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/Weixin4jConfigUtil.java
@@ -1,6 +1,5 @@
package com.foxinmy.weixin4j.util;
-import java.io.File;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
@@ -25,18 +24,6 @@ public class Weixin4jConfigUtil {
.getResource("").getPath();
try {
weixinBundle = ResourceBundle.getBundle("weixin4j");
- File file = null;
- for (String key : weixinBundle.keySet()) {
- if (!key.endsWith(".path")) {
- continue;
- }
- file = new File(getValue(key).replaceFirst(CLASSPATH_PREFIX,
- CLASSPATH_VALUE));
- if (!file.exists() && !file.mkdirs()) {
- System.err.append(String.format("%s create fail.%n",
- file.getAbsolutePath()));
- }
- }
} catch (MissingResourceException e) {
;
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/Weixin4jSettings.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/Weixin4jSettings.java
new file mode 100644
index 00000000..79e03615
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/Weixin4jSettings.java
@@ -0,0 +1,155 @@
+package com.foxinmy.weixin4j.util;
+
+import com.alibaba.fastjson.JSON;
+import com.foxinmy.weixin4j.http.HttpParams;
+import com.foxinmy.weixin4j.model.WeixinAccount;
+import com.foxinmy.weixin4j.model.WeixinPayAccount;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
+import com.foxinmy.weixin4j.token.TokenStorager;
+
+/**
+ * 微信配置相关
+ *
+ * @className Weixin4jSettings
+ * @author jy
+ * @date 2016年1月28日
+ * @since JDK 1.6
+ * @see
+ */
+public class Weixin4jSettings {
+ /**
+ * 微信支付账号信息
+ */
+ private WeixinPayAccount weixinPayAccount;
+ /**
+ * 微信账号信息
+ */
+ private WeixinAccount weixinAccount;
+ /**
+ * Http参数
+ */
+ private HttpParams httpParams;
+ /**
+ * token存储方式 默认为FileTokenStorager
+ */
+ private TokenStorager tokenStorager;
+ /**
+ * 系统临时目录
+ */
+ private String tmpdir;
+ /**
+ * 支付接口需要的证书文件(*.p12)
+ */
+ private String certificateFile;
+
+ /**
+ * 默认使用weixin4j.properties配置的信息
+ */
+ public Weixin4jSettings() {
+ this(JSON.parseObject(Weixin4jConfigUtil.getValue("account"),
+ WeixinPayAccount.class));
+ }
+
+ /**
+ * 支付代理接口
+ *
+ * @param weixinPayAccount
+ * 商户信息
+ * @param certificateFile
+ * 支付接口需要的证书文件(*.p12),比如退款接口
+ */
+ public Weixin4jSettings(WeixinPayAccount weixinPayAccount,
+ String certificateFile) {
+ this.weixinPayAccount = weixinPayAccount;
+ this.certificateFile = certificateFile;
+ this.weixinAccount = new WeixinAccount(weixinPayAccount.getId(),
+ weixinPayAccount.getSecret());
+ }
+
+ /**
+ * 普通代理接口
+ *
+ * @param weixinAccount
+ */
+ public Weixin4jSettings(WeixinAccount weixinAccount) {
+ this.weixinAccount = weixinAccount;
+ }
+
+ public WeixinPayAccount getWeixinPayAccount() {
+ return weixinPayAccount;
+ }
+
+ public WeixinAccount getWeixinAccount() {
+ return weixinAccount;
+ }
+
+ public HttpParams getHttpParams() {
+ return httpParams;
+ }
+
+ public HttpParams getHttpParams0() {
+ if (httpParams == null) {
+ return new HttpParams();
+ }
+ return httpParams;
+ }
+
+ public String getTmpdir() {
+ return tmpdir;
+ }
+
+ public String getTmpdir0() {
+ if (StringUtil.isBlank(tmpdir)) {
+ return Weixin4jConfigUtil.getClassPathValue("weixin4j.tmpdir",
+ System.getProperty("java.io.tmpdir"));
+ }
+ return tmpdir;
+ }
+
+ public TokenStorager getTokenStorager() {
+ return tokenStorager;
+ }
+
+ public TokenStorager getTokenStorager0() {
+ if (tokenStorager == null) {
+ return new FileTokenStorager(getTmpdir0());
+ }
+ return tokenStorager;
+ }
+
+ public String getCertificateFile() {
+ return certificateFile;
+ }
+
+ public String getCertificateFile0() {
+ if (StringUtil.isBlank(certificateFile)) {
+ return Weixin4jConfigUtil.getClassPathValue(
+ "weixin4j.certificate.file", "classpath:ca.p12");
+ }
+ return certificateFile;
+ }
+
+ public void setHttpParams(HttpParams httpParams) {
+ this.httpParams = httpParams;
+ }
+
+ public void setTmpdir(String tmpdir) {
+ this.tmpdir = tmpdir;
+ }
+
+ public void setTokenStorager(TokenStorager tokenStorager) {
+ this.tokenStorager = tokenStorager;
+ }
+
+ public void setCertificateFile(String certificateFile) {
+ this.certificateFile = certificateFile;
+ }
+
+ @Override
+ public String toString() {
+ return "Weixin4jSettings [weixinAccount=" + weixinAccount
+ + ", httpParams=" + httpParams + ",tokenStorager="
+ + tokenStorager + ", tmpdir=" + tmpdir + ", certificateFile= "
+ + certificateFile + "]";
+ }
+}
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CashTest.java b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java
similarity index 94%
rename from weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CashTest.java
rename to weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java
index 0b5e338f..bc0c6272 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CashTest.java
+++ b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.test;
+package com.foxinmy.weixin4j.base.test;
import java.io.FileInputStream;
import java.io.IOException;
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CouponTest.java b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CouponTest.java
similarity index 97%
rename from weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CouponTest.java
rename to weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CouponTest.java
index 5a17eb3d..99801928 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CouponTest.java
+++ b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CouponTest.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.test;
+package com.foxinmy.weixin4j.base.test;
import java.io.FileInputStream;
import java.io.IOException;
diff --git a/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/PayTest.java b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/PayTest.java
new file mode 100644
index 00000000..aa740c45
--- /dev/null
+++ b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/PayTest.java
@@ -0,0 +1,156 @@
+package com.foxinmy.weixin4j.base.test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.exception.WeixinPayException;
+import com.foxinmy.weixin4j.http.weixin.XmlResult;
+import com.foxinmy.weixin4j.model.WeixinPayAccount;
+import com.foxinmy.weixin4j.payment.WeixinPayProxy;
+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.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.Weixin4jSettings;
+
+/**
+ * 支付测试(商户平台)
+ *
+ * @className PayTest
+ * @author jy
+ * @date 2016年1月30日
+ * @since JDK 1.7
+ * @see
+ */
+public class PayTest {
+ protected final static WeixinPayProxy PAY3;
+ protected final static WeixinPayAccount ACCOUNT3;
+ static {
+ ACCOUNT3 = new WeixinPayAccount("wx5518c745065b1f95",
+ "请填入v3版本的appSecret", "DTYUNJKL1234fghjkRTGHJNM345678fc",
+ "1298173301", null, null, null, null, null);
+ PAY3 = new WeixinPayProxy(new Weixin4jSettings(ACCOUNT3));
+ }
+ /**
+ * 商户证书文件
+ */
+ protected File caFile = new File("证书文件,如12333.p12");
+
+ @Test
+ public void orderQueryV3() throws WeixinException {
+ Order order = PAY3.orderQuery(new IdQuery("BY2016010800025",
+ IdType.TRADENO));
+ System.err.println(order);
+ String sign = order.getSign();
+ order.setSign(null);
+ String valiSign = DigestUtil
+ .paysignMd5(order, ACCOUNT3.getPaySignKey());
+ System.err
+ .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
+ Assert.assertEquals(valiSign, sign);
+ }
+
+ @Test
+ public void refundQueryV3() throws WeixinException {
+ com.foxinmy.weixin4j.payment.mch.RefundRecord record = PAY3
+ .refundQuery(new IdQuery("TT_1427183696238", IdType.TRADENO));
+ System.err.println(record);
+ // 这里的验证签名需要把details循环拼接
+ String sign = record.getSign();
+ record.setSign(null);
+ String valiSign = DigestUtil.paysignMd5(record,
+ ACCOUNT3.getPaySignKey());
+ System.err
+ .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
+ Assert.assertEquals(valiSign, sign);
+ }
+
+ @Test
+ public void downbillV3() throws WeixinException {
+ Calendar c = Calendar.getInstance();
+ System.err.println(c.getTime());
+ c.set(Calendar.YEAR, 2015);
+ c.set(Calendar.MONTH, 2);
+ c.set(Calendar.DAY_OF_MONTH, 24);
+ System.err.println(c.getTime());
+ File file = PAY3.downloadBill(c.getTime(), null);
+ System.err.println(file);
+ }
+
+ @Test
+ public void refundV3() throws WeixinException, IOException {
+ IdQuery idQuery = new IdQuery("TT_1427183696238", IdType.TRADENO);
+ com.foxinmy.weixin4j.payment.mch.RefundResult result = PAY3
+ .refundApply(new FileInputStream(caFile), idQuery, "TT_R"
+ + System.currentTimeMillis(), 0.01d, 0.01d, null,
+ "10020674");
+ System.err.println(result);
+ String sign = result.getSign();
+ result.setSign(null);
+ String valiSign = DigestUtil.paysignMd5(result,
+ ACCOUNT3.getPaySignKey());
+ System.err
+ .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
+ Assert.assertEquals(valiSign, sign);
+ }
+
+ @Test
+ public void nativeV3() throws WeixinException {
+ MchPayPackage payPackageV3 = new MchPayPackage(ACCOUNT3,
+ "oyFLst1bqtuTcxK-ojF8hOGtLQao", "native测试", "T0001", 0.1d,
+ "notify_url", "127.0.0.1", TradeType.NATIVE);
+ payPackageV3.setProductId("0001");
+ PrePay prePay = null;
+ try {
+ prePay = PAY3.createPrePay(payPackageV3);
+ } catch (WeixinPayException e) {
+ e.printStackTrace();
+ }
+ System.err.println(prePay);
+ }
+
+ @Test
+ public void closeOrder() throws WeixinException {
+ ApiResult result = PAY3.closeOrder("D111");
+ System.err.println(result);
+ String sign = result.getSign();
+ result.setSign(null);
+ String valiSign = DigestUtil.paysignMd5(result,
+ ACCOUNT3.getPaySignKey());
+ System.err
+ .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
+ Assert.assertEquals(valiSign, sign);
+ }
+
+ @Test
+ public void shortUrl() throws WeixinException {
+ String url = "weixin://wxpay/bizpayurl?xxxxxx";
+ String shortUrl = PAY3.getPayShorturl(url);
+ System.err.println(shortUrl);
+ }
+
+ @Test
+ public void interfaceReport() throws WeixinException {
+ String interfaceUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+ int executeTime = 2500;
+ String outTradeNo = null;
+ String ip = "127.0.0.1";
+ Date time = new Date();
+ XmlResult returnXml = new XmlResult("SUCCESS", "");
+ returnXml.setResultCode("SUCCESS");
+ returnXml = PAY3.interfaceReport(interfaceUrl, executeTime, outTradeNo,
+ ip, time, returnXml);
+ System.err.println(returnXml);
+ }
+}
diff --git a/weixin4j-mp/README.md b/weixin4j-mp/README.md
index 08abac50..aa605137 100644
--- a/weixin4j-mp/README.md
+++ b/weixin4j-mp/README.md
@@ -35,70 +35,6 @@ weixin4j-mp
如何使用
--------
-0.maven依赖(1.6.6,2015-12-31 released)
-
-
- com.foxinmy
- weixin4j-mp
- 1.6.6
-
-1.需新增或拷贝`weixin4j.properties`文件到项目的`classpath`中
-
-weixin4j.properties说明
-
-| 属性名 | 说明 |
-| :---------- | :-------------- |
-| weixin4j.account | 微信公众号信息 `json格式`(使用new WeixinProxy()缺省构造器时须填写) |
-| weixin4j.token.path | 使用FileTokenStorager时token保存的物理路径(非必须填写) |
-| weixin4j.qrcode.path | 调用二维码接口时保存二维码图片的物理路径(非必须填写) |
-| weixin4j.media.path | 调用媒体接口时保存媒体文件的物理路径(非必须填写) |
-| weixin4j.bill.path | 调用下载对账单接口保存文件的物理路径(非必须填写) |
-| weixin4j.certificate.file | 调用某些接口(支付相关)强制需要auth的ca授权文件(按须填写) |
-| weixin4j.user.oauth.redirect.uri | 调用OauthApi接口时需要填写的重定向路径(非必须填写) |
-
-完整填写示例(properties中换行用右斜杆\\)
-
- weixin4j.account={"id":"appid","secret":"appsecret",\
- "mchId":"V3.x版本下的微信商户号 微信支付时需要填入",\
- "certificateKey":"加载支付证书文件的密码 如果不填写则默认获取mchId作为密码",\
- "partnerId":"V2版本下的财付通的商户号 微信支付时需要填入",\
- "partnerKey":"V2版本下的财付通商户权限密钥Key 微信支付时需要填入",\
- "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证书存放的完整路径 (V2版本后缀为*.pfx,V3版本后缀为*.p12)
- weixin4j.certificate.file=/tmp/weixin4j/xxxxx.p12
- # classpath路径下可以这么写(如果不填则默认为Weixin4jConst#DEFAULT_CAFILE_PATH)
- # weixin4j.certificate.file=classpath:xxxxx.pfx
-
- # 用户oauth授权后重定向的url(在使用OauthApi时填写)
- weixin4j.user.oauth.redirect.uri=http://xxx
-
-2.实例化微信公众号接口代理对象,调用具体的API方法
-
- // 微信公众号API 使用classpath的weixin4j.properties
- WeixinProxy weixinProxy = new WeixinProxy();
- // 直接传入公众号信息
- // weixinProxy = new WeixinProxy(appid,appsecret);
- weixinProxy.getUser(openId);
- // 微信支付API 使用classpath的weixin4j.properties
- WeixinPayProxy weixinPayProxy = new WeixinPayProxy();
- // 直接构造WexinAccount对象
- // weixinPayProxy = new WeixinPayProxy(weixinAccount);
- weixinPayProxy.orderQuery(idQuery);
-
-> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](../weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java).
->
-> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenStorager());
-
-> // weixinProxy = new WeixinProxy(new RedisTokenStorager(appid,appsecret));
[更新LOG](./CHANGE.md)
----------------------
\ No newline at end of file
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
index 60b9a952..1580a997 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
@@ -47,7 +47,6 @@ import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.mp.type.DatacubeType;
import com.foxinmy.weixin4j.mp.type.IndustryType;
import com.foxinmy.weixin4j.mp.type.Lang;
-import com.foxinmy.weixin4j.settings.Weixin4jSettings;
import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.tuple.MassTuple;
import com.foxinmy.weixin4j.tuple.MpArticle;
@@ -55,6 +54,7 @@ import com.foxinmy.weixin4j.tuple.MpVideo;
import com.foxinmy.weixin4j.tuple.Tuple;
import com.foxinmy.weixin4j.type.MediaType;
import com.foxinmy.weixin4j.type.TicketType;
+import com.foxinmy.weixin4j.util.Weixin4jSettings;
/**
* 微信公众平台接口实现
@@ -92,13 +92,13 @@ public class WeixinProxy {
/**
*
* @param settings
- * 配置信息
- * @see com.foxinmy.weixin4j.settings.Weixin4jSettings
+ * 微信配置信息
+ * @see com.foxinmy.weixin4j.util.Weixin4jSettings
*/
public WeixinProxy(Weixin4jSettings settings) {
- this(new TokenHolder(new WeixinTokenCreator(settings.getAccount()
- .getId(), settings.getAccount().getSecret()),
- settings.getTokenStorager()));
+ this(new TokenHolder(new WeixinTokenCreator(settings.getWeixinAccount()
+ .getId(), settings.getWeixinAccount().getSecret()),
+ settings.getTokenStorager0()));
this.settings = settings;
}
@@ -129,7 +129,7 @@ public class WeixinProxy {
* @return
*/
public WeixinAccount getWeixinAccount() {
- return this.settings.getAccount();
+ return this.settings.getWeixinAccount();
}
/**
@@ -222,29 +222,6 @@ public class WeixinProxy {
return mediaApi.uploadMedia(isMaterial, is, fileName);
}
- /**
- * 下载媒体文件
- *
- * 正常情况下返回表头如Content-Type: image/jpeg,否则抛出异常.
- *
- *
- * @param mediaId
- * 存储在微信服务器上的媒体标识
- * @param isMaterial
- * 是否下载永久素材
- * @return 写入硬盘后的文件对象
- * @throws WeixinException
- * @see 上传下载说明
- * @see com.foxinmy.weixin4j.mp.api.MediaApi
- * @see {@link #downloadMedia(String)}
- */
- public File downloadMediaFile(String mediaId, boolean isMaterial)
- throws WeixinException {
- return mediaApi.downloadMediaFile(mediaId, isMaterial,
- settings.getMediaPath());
- }
-
/**
* 下载媒体文件
*
@@ -1192,19 +1169,6 @@ public class WeixinProxy {
return qrApi.createQR(parameter);
}
- /**
- * 生成带参数的二维码
- *
- * @return 硬盘存储的文件对象
- * @param parameter
- * 二维码参数
- * @throws WeixinException
- * @see {@link #createQR(QRParameter)}
- */
- public File createQRFile(QRParameter parameter) throws WeixinException {
- return qrApi.createQRFile(parameter, settings.getQrcodePath());
- }
-
/**
* 设置所属行业(每月可修改行业1次,账号仅可使用所属行业中相关的模板)
*
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
index b345c028..d0274c54 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
@@ -1,12 +1,8 @@
package com.foxinmy.weixin4j.mp.api;
import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
@@ -228,63 +224,6 @@ public class MediaApi extends MpApi {
}
}
- /**
- * 下载媒体素材
- *
- * 正常情况下返回表头如Content-Type: image/jpeg,否则抛出异常.
- *
- *
- * @param mediaId
- * 存储在微信服务器上的媒体标识
- * @param isMaterial
- * 是否下载永久素材
- * @param mediaPath
- * 媒体素材保存路径
- * @return 写入硬盘后的文件对象
- * @throws WeixinException
- * @see 下载临时媒体文件
- * @see 下载永久媒体素材
- * @see {@link #downloadMedia(String,boolean)}
- */
- public File downloadMediaFile(String mediaId, boolean isMaterial,
- String mediaPath) throws WeixinException {
- final String prefixName = String.format("%s.", mediaId);
- File[] files = new File(mediaPath).listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith(prefixName);
- }
- });
- if (files.length > 0) {
- return files[0];
- }
- MediaDownloadResult result = downloadMedia(mediaId, isMaterial);
- File file = new File(mediaPath + File.separator + result.getFileName());
- OutputStream os = null;
- try {
- if (file.createNewFile()) {
- os = new FileOutputStream(file);
- os.write(result.getContent());
- } else {
- throw new WeixinException(String.format("create file fail:%s",
- file.getAbsolutePath()));
- }
- } catch (IOException e) {
- throw new WeixinException(e);
- } finally {
- try {
- if (os != null) {
- os.close();
- }
- } catch (IOException e) {
- ;
- }
- }
- return file;
- }
-
/**
* 下载媒体素材
*
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
index d4dc832e..9b464f5a 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
@@ -40,11 +40,7 @@ import com.foxinmy.weixin4j.mp.payment.v2.RefundRecordV2;
import com.foxinmy.weixin4j.mp.payment.v2.RefundResultV2;
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.payment.PayRequest;
-import com.foxinmy.weixin4j.settings.Weixin4jSettings;
-import com.foxinmy.weixin4j.settings.Weixin4jPaySettings;
-import com.foxinmy.weixin4j.token.FileTokenStorager;
import com.foxinmy.weixin4j.token.TokenHolder;
-import com.foxinmy.weixin4j.token.TokenStorager;
import com.foxinmy.weixin4j.type.BillType;
import com.foxinmy.weixin4j.type.IdQuery;
import com.foxinmy.weixin4j.type.RefundType;
@@ -54,6 +50,7 @@ import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
import com.foxinmy.weixin4j.util.RandomUtil;
import com.foxinmy.weixin4j.util.StringUtil;
+import com.foxinmy.weixin4j.util.Weixin4jSettings;
import com.foxinmy.weixin4j.xml.ListsuffixResultDeserializer;
/**
@@ -67,27 +64,22 @@ import com.foxinmy.weixin4j.xml.ListsuffixResultDeserializer;
*/
public class Pay2Api extends MpApi {
- private final Weixin4jPaySettings settings;
+ private final Weixin4jSettings settings;
private final TokenHolder tokenHolder;
public Pay2Api() {
- this(new Weixin4jPaySettings());
+ this(new Weixin4jSettings());
}
- public Pay2Api(Weixin4jPaySettings settings) {
- this(settings, new FileTokenStorager(
- Weixin4jSettings.DEFAULT_TOKEN_PATH));
- }
-
- public Pay2Api(Weixin4jPaySettings settings, TokenStorager tokenStorager) {
+ public Pay2Api(Weixin4jSettings settings) {
+ this.tokenHolder = new TokenHolder(new WeixinTokenCreator(settings
+ .getWeixinAccount().getId(), settings.getWeixinAccount()
+ .getSecret()), settings.getTokenStorager0());
this.settings = settings;
- this.tokenHolder = new TokenHolder(
- new WeixinTokenCreator(settings.getPayAccount().getId(),
- settings.getPayAccount().getSecret()), tokenStorager);
}
public WeixinPayAccount getPayAccount() {
- return this.settings.getPayAccount();
+ return this.settings.getWeixinPayAccount();
}
/**
@@ -142,7 +134,7 @@ public class Pay2Api extends MpApi {
double totalFee, String notifyUrl, String createIp, String attach,
Date timeStart, Date timeExpire, double transportFee,
double productFee, String goodsTag) {
- PayPackageV2 payPackage = new PayPackageV2(settings.getPayAccount()
+ PayPackageV2 payPackage = new PayPackageV2(getPayAccount()
.getPartnerId(), body, outTradeNo, totalFee, notifyUrl,
createIp);
payPackage.setAttach(attach);
@@ -458,8 +450,8 @@ public class Pay2Api extends MpApi {
String formatBillDate = DateUtil.fortmat2yyyyMMdd(billDate);
String fileName = String.format("%s_%s_%s.txt", formatBillDate,
billType.name().toLowerCase(), getPayAccount().getId());
- File file = new File(String.format("%s/%s", settings.getBillPath(),
- fileName));
+ File file = new File(String.format("%s/weixin4j_bill_%s",
+ settings.getTmpdir0(), fileName));
if (file.exists()) {
return file;
}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java
index 1a1ca292..b610eb18 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java
@@ -1,9 +1,6 @@
package com.foxinmy.weixin4j.mp.api;
-import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.OutputStream;
import com.alibaba.fastjson.TypeReference;
import com.foxinmy.weixin4j.exception.WeixinException;
@@ -62,49 +59,4 @@ public class QrApi extends MpApi {
}
return result;
}
-
- /**
- * 生成带参数的二维码
- *
- * 二维码分为临时跟永久两种,扫描时触发推送带参数事件
- *
- *
- * @param parameter
- * 二维码参数
- * @param qrcodePath
- * 二维码保存路径
- * @return 硬盘存储的文件对象
- * @throws WeixinException
- * @see 二维码
- * @see #createQR(QRParameter)
- * @see com.foxinmy.weixin4j.mp.model.QRParameter
- */
- public File createQRFile(QRParameter parameter, String qrcodePath)
- throws WeixinException {
- String filename = String.format("%s_%s_%d.jpg", parameter.getQrType()
- .name(), parameter.getSceneValue(), parameter
- .getExpireSeconds());
- File file = new File(qrcodePath + File.separator + filename);
- if (parameter.getQrType().ordinal() > 0 && file.exists()) {
- return file;
- }
- QRResult qrResult = createQR(parameter);
- OutputStream os = null;
- try {
- os = new FileOutputStream(file);
- os.write(qrResult.getContent());
- } catch (IOException e) {
- throw new WeixinException(e);
- } finally {
- try {
- if (os != null) {
- os.close();
- }
- } catch (IOException e) {
- ;
- }
- }
- return file;
- }
}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/message/README.md b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/message/README.md
deleted file mode 100644
index 888b6526..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/message/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-NotifyMessage: (客服消息)[http://mp.weixin.qq.com/wiki/1/70a29afed17f56d537c833f89be979c9.html#.E5.AE.A2.E6.9C.8D.E6.8E.A5.E5.8F.A3-.E5.8F.91.E6.B6.88.E6.81.AF]
-
-TemplateMessage: (模板消息)[http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html]
\ No newline at end of file
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTicketCreator.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTicketCreator.java
index b42761e7..c9e4be43 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTicketCreator.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTicketCreator.java
@@ -48,7 +48,7 @@ public class WeixinTicketCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_mp_ticket_%s_%s", appid, ticketType.name());
+ return String.format("weixin4j_mp_ticket_%s_%s", appid, ticketType.name());
}
@Override
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java
index f4e49044..ec9acbc5 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java
@@ -40,7 +40,7 @@ public class WeixinTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_mp_token_%s", appid);
+ return String.format("weixin4j_mp_token_%s", appid);
}
@Override
diff --git a/weixin4j-mp/src/main/resources/weixin4j.properties b/weixin4j-mp/src/main/resources/weixin4j.properties
index ff52cfd4..5d794c21 100644
--- a/weixin4j-mp/src/main/resources/weixin4j.properties
+++ b/weixin4j-mp/src/main/resources/weixin4j.properties
@@ -1,24 +1,22 @@
# \u6d4b\u8bd5\u4e4b\u7528 \u6b63\u5f0f\u73af\u5883\u4e0bcopy\u4e00\u4efd\u5230classpath
-# \u516c\u4f17\u53f7\u4fe1\u606f
+
+# \u516c\u4f17\u53f7\u4fe1\u606f \u8bf7\u6309\u9700\u586b\u5199
weixin4j.account={"id":"wx4ab8f8de58159a57","secret":"1d4eb0f4bf556aaed539f30ed05ca795",\
-"mchId":"V3.x\u7248\u672c\u4e0b\u7684\u5fae\u4fe1\u5546\u6237\u53f7 \u5fae\u4fe1\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
+"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",\
"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(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_TOKEN_PATH)
-weixin4j.token.path=/tmp/weixin4j/token
-# \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(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_MEDIA_PATH)
-weixin4j.media.path=/tmp/weixin4j/media
-# \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\u7684\u4e34\u65f6\u76ee\u5f55
+# \u53ef\u80fd\u5b58\u653etoken\u6587\u4ef6\u3001\u4e8c\u7ef4\u7801\u6587\u4ef6\u3001\u5a92\u4f53\u6587\u4ef6\u3001\u5bf9\u8d26\u5355\u6587\u4ef6\u7b49
+# \u4e3a\u7a7a\u65f6\u5219\u83b7\u53d6java.io.tmpdir\u4e34\u65f6\u76ee\u5f55
+weixin4j.tmpdir=
+# \u5fae\u4fe1\u652f\u4ed8\u67d0\u4e9b\u63a5\u53e3\u9700\u8981\u7684ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84
+# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199
+# weixin4j.certificate.file=classpath:xxxxx.p12
+# \u4e3a\u7a7a\u65f6\u5219\u83b7\u53d6classpath\u6839\u76ee\u5f55\u4e0b\u7684ca.p12\u6587\u4ef6
weixin4j.certificate.file=/tmp/weixin4j/xxxxx.p12
-# 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(\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 9e81cd50..3e88a779 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
@@ -92,13 +92,6 @@ public class MediaTest extends TokenTest {
System.err.println(mediaId);
}
- @Test
- public void download2() throws WeixinException, IOException {
- File file = mediaApi.downloadMediaFile("8790403529", true,
- "/tmp/weixin4j/media");
- Assert.assertTrue(file.exists());
- }
-
@Test
public void downloadArticle() throws WeixinException {
List articles = mediaApi.downloadArticle("17385064953");
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 74be7575..d198739d 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
@@ -1,44 +1,34 @@
package com.foxinmy.weixin4j.mp.test;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
import java.util.Calendar;
-import java.util.Date;
-import org.junit.Assert;
import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.exception.WeixinPayException;
-import com.foxinmy.weixin4j.http.weixin.XmlResult;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.mp.api.Pay2Api;
-import com.foxinmy.weixin4j.payment.WeixinPayProxy;
-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.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.Weixin4jSettings;
+/**
+ * 支付测试(V2版本 2014年9月之前申请微信支付的公众号)
+ *
+ * @className PayTest
+ * @author jy
+ * @date 2016年1月30日
+ * @since JDK 1.7
+ * @see
+ */
public class PayTest {
protected final static Pay2Api PAY2;
- protected final static WeixinPayProxy PAY3;
protected final static WeixinPayAccount ACCOUNT2;
- protected final static WeixinPayAccount ACCOUNT3;
static {
ACCOUNT2 = new WeixinPayAccount("请填入v2版本的appid", "请填入v2版本的appSecret",
"请填入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,
- null);
- PAY3 = new WeixinPayProxy(new Weixin4jPaySettings(ACCOUNT3));
+ PAY2 = new Pay2Api(new Weixin4jSettings(ACCOUNT2));
}
/**
* 商户证书文件
@@ -62,7 +52,6 @@ public class PayTest {
public void refundQueryV2() throws WeixinException {
System.err.println(PAY2.refundQuery(new IdQuery("D14123000004",
IdType.TRADENO)));
- refundQueryV3();
}
@Test
@@ -74,110 +63,4 @@ public class PayTest {
File file = PAY2.downloadBill(c.getTime(), null);
System.err.println(file);
}
-
- @Test
- public void orderQueryV3() throws WeixinException {
- Order order = PAY3.orderQuery(new IdQuery("T0002", IdType.TRADENO));
- System.err.println(order);
- String sign = order.getSign();
- order.setSign(null);
- String valiSign = DigestUtil
- .paysignMd5(order, ACCOUNT3.getPaySignKey());
- System.err
- .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
- Assert.assertEquals(valiSign, sign);
- }
-
- @Test
- public void refundQueryV3() throws WeixinException {
- com.foxinmy.weixin4j.payment.mch.RefundRecord record = PAY3
- .refundQuery(new IdQuery("TT_1427183696238", IdType.TRADENO));
- System.err.println(record);
- // 这里的验证签名需要把details循环拼接
- String sign = record.getSign();
- record.setSign(null);
- String valiSign = DigestUtil.paysignMd5(record,
- ACCOUNT3.getPaySignKey());
- System.err
- .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
- Assert.assertEquals(valiSign, sign);
- }
-
- @Test
- public void downbillV3() throws WeixinException {
- Calendar c = Calendar.getInstance();
- System.err.println(c.getTime());
- c.set(Calendar.YEAR, 2015);
- c.set(Calendar.MONTH, 2);
- c.set(Calendar.DAY_OF_MONTH, 24);
- System.err.println(c.getTime());
- File file = PAY3.downloadBill(c.getTime(), null);
- System.err.println(file);
- }
-
- @Test
- public void refundV3() throws WeixinException, IOException {
- IdQuery idQuery = new IdQuery("TT_1427183696238", IdType.TRADENO);
- com.foxinmy.weixin4j.payment.mch.RefundResult result = PAY3
- .refundApply(new FileInputStream(caFile), idQuery, "TT_R"
- + System.currentTimeMillis(), 0.01d, 0.01d, null,
- "10020674");
- System.err.println(result);
- String sign = result.getSign();
- result.setSign(null);
- String valiSign = DigestUtil.paysignMd5(result,
- ACCOUNT3.getPaySignKey());
- System.err
- .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
- Assert.assertEquals(valiSign, sign);
- }
-
- @Test
- public void nativeV3() throws WeixinException {
- MchPayPackage payPackageV3 = new MchPayPackage(ACCOUNT3,
- "oyFLst1bqtuTcxK-ojF8hOGtLQao", "native测试", "T0001", 0.1d,
- "notify_url", "127.0.0.1", TradeType.NATIVE);
- payPackageV3.setProductId("0001");
- PrePay prePay = null;
- try {
- prePay = PAY3.createPrePay(payPackageV3);
- } catch (WeixinPayException e) {
- e.printStackTrace();
- }
- System.err.println(prePay);
- }
-
- @Test
- public void closeOrder() throws WeixinException {
- ApiResult result = PAY3.closeOrder("D111");
- System.err.println(result);
- String sign = result.getSign();
- result.setSign(null);
- String valiSign = DigestUtil.paysignMd5(result,
- ACCOUNT3.getPaySignKey());
- System.err
- .println(String.format("sign=%s,valiSign=%s", sign, valiSign));
- Assert.assertEquals(valiSign, sign);
- }
-
- @Test
- public void shortUrl() throws WeixinException {
- String url = "weixin://wxpay/bizpayurl?xxxxxx";
- String shortUrl = PAY3.getPayShorturl(url);
- System.err.println(shortUrl);
- }
-
- @Test
- public void interfaceReport() throws WeixinException {
- String interfaceUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
- int executeTime = 2500;
- String outTradeNo = null;
- String ip = "127.0.0.1";
- Date time = new Date();
- XmlResult returnXml = new XmlResult("SUCCESS", "");
- returnXml.setResultCode("SUCCESS");
- returnXml = PAY3.interfaceReport(interfaceUrl, executeTime, outTradeNo,
- ip, time, returnXml);
- System.err.println(returnXml);
- }
}
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 a1d809f7..186812db 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
@@ -1,6 +1,5 @@
package com.foxinmy.weixin4j.mp.test;
-import java.io.File;
import java.io.IOException;
import org.junit.Assert;
@@ -10,6 +9,7 @@ import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.mp.api.QrApi;
import com.foxinmy.weixin4j.mp.model.QRParameter;
+import com.foxinmy.weixin4j.mp.model.QRResult;
/**
* 二维码相关测试
@@ -29,23 +29,21 @@ public class QRTest extends TokenTest {
@Test
public void temp_qr() throws WeixinException, IOException {
- File file = qrApi.createQRFile(QRParameter.createTemporary(1200, 1200),
- "/tmp/weixin4j/qrcode");
- Assert.assertTrue(file.exists());
+ QRResult result = qrApi.createQR(QRParameter
+ .createTemporary(1200, 1200));
+ Assert.assertTrue(!result.getTicket().isEmpty());
}
@Test
public void forever_qr_int() throws WeixinException, IOException {
- File file = qrApi.createQRFile(QRParameter.createPermanenceInt(2),
- "/tmp/weixin4j/qrcode");
- Assert.assertTrue(file.exists());
+ QRResult result = qrApi.createQR(QRParameter.createPermanenceInt(2));
+ Assert.assertTrue(!result.getTicket().isEmpty());
}
@Test
public void forever_qr_str() throws WeixinException, IOException {
- File file = qrApi.createQRFile(
- QRParameter.createPermanenceStr("1200中文"),
- "/tmp/weixin4j/qrcode");
- Assert.assertTrue(file.exists());
+ QRResult result = qrApi.createQR(QRParameter
+ .createPermanenceStr("1200中文"));
+ Assert.assertTrue(!result.getTicket().isEmpty());
}
}
diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md
index 8b6b6c5d..878f615a 100644
--- a/weixin4j-qy/README.md
+++ b/weixin4j-qy/README.md
@@ -36,81 +36,6 @@ weixin4j-qy
如何使用
--------
-0.maven依赖(1.6.6,2015-12-31 released)
-
-
- com.foxinmy
- weixin4j-qy
- 1.6.6
-
-1.需新增或拷贝`weixin4j.properties`文件到项目的`classpath`中
-
-weixin4j.properties说明
-
-| 属性名 | 说明 |
-| :---------- | :-------------- |
-| weixin4j.account | 微信企业号信息 `json格式`(使用new WeixinProxy()缺省构造器时须填写) |
-| weixin4j.token.path | 使用FileTokenStorager时token保存的物理路径(非必须填写) |
-| weixin4j.media.path | 调用媒体接口时保存媒体文件的物理路径(非必须填写) |
-| weixin4j.bill.path | 调用下载对账单接口保存文件的物理路径(非必须填写) |
-| weixin4j.certificate.file | 调用某些接口(支付相关)强制需要auth的ca授权文件(非必须填写) |
-| weixin4j.user.oauth.redirect.uri | 企业号用户身份授权后重定向的url(OauthApi接口) |
-| weixin4j.third.oauth.redirect.uri | 企业号第三方提供商授权后重定向的url(OauthApi接口) |
-| weixin4j.suite.oauth.redirect.uri | 企业号第三方应用套件授权后重定向的url(OauthApi接口) |
-
-示例(properties中换行用右斜杆\\)
-
- weixin4j.account={"id":"corpid","secret":"corpsecret",\
- "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证书存放的完整路径
- weixin4j.certificate.file=/tmp/weixin4j/xxxxx.p12
- # classpath路径下可以这么写(如果不填则默认为Weixin4jConst#DEFAULT_CAFILE_PATH)
- # weixin4j.certificate.file=classpath:xxxxx.pfx
-
- # 企业号用户身份授权后重定向的url(在使用OauthApi时填写)
- weixin4j.user.oauth.redirect.uri=
- # 企业号第三方提供商授权后重定向的url(在使用OauthApi时填写)
- weixin4j.third.oauth.redirect.uri=
- # 企业号第三方应用套件授权后重定向的url(在使用OauthApi时填写)
- weixin4j.suite.oauth.redirect.uri=
-
-2.实例化微信企业号接口代理对象,调用具体的API方法
-
- // 微信企业号API 使用classpath的weixin4j.properties
- WeixinProxy weixinProxy = new WeixinProxy();
- // 直接传入企业号信息
- // weixinProxy = new WeixinProxy(corpid,corpsecret);
- weixinProxy.getUser(userid);
- // 微信支付API 使用classpath的weixin4j.properties
- WeixinPayProxy weixinPayProxy = new WeixinPayProxy();
- // 直接构造WexinAccount对象
- // weixinPayProxy = new WeixinPayProxy(weixinAccount);
- weixinPayProxy.orderQuery(idQuery);
- // 微信第三方应用API 使用classpath的weixin4j.properties
- WeixinSuiteProxy weixinSuiteProxy = new WeixinSuiteProxy();
- // 直接传入套件信息
- //weixinSuiteProxy = new WeixinSuiteProxy(suiteId,suiteSecret);
- weixinSuiteProxy.api().getOAuthInfo(authCorpid);
-
-> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](../weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java).
-
-> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenStorager());
-
-> // weixinProxy = new WeixinProxy(new RedisTokenStorager(corpid,corpsecret));
[更新LOG](./CHANGE.md)
----------------------
\ No newline at end of file
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 2c77b8c0..51bba882 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
@@ -1,6 +1,5 @@
package com.foxinmy.weixin4j.qy;
-import java.io.File;
import java.io.InputStream;
import java.util.List;
@@ -48,11 +47,11 @@ 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.tuple.MpArticle;
import com.foxinmy.weixin4j.type.MediaType;
import com.foxinmy.weixin4j.type.TicketType;
+import com.foxinmy.weixin4j.util.Weixin4jSettings;
/**
* 微信企业号接口实现
@@ -90,13 +89,13 @@ public class WeixinProxy {
/**
*
* @param settings
- * 配置信息
- * @see com.foxinmy.weixin4j.settings.Weixin4jSettings
+ * 微信配置信息
+ * @see com.foxinmy.weixin4j.util.Weixin4jSettings
*/
public WeixinProxy(Weixin4jSettings settings) {
- this(new TokenHolder(new WeixinTokenCreator(settings.getAccount()
- .getId(), settings.getAccount().getSecret()),
- settings.getTokenStorager()));
+ this(new TokenHolder(new WeixinTokenCreator(settings.getWeixinAccount()
+ .getId(), settings.getWeixinAccount().getSecret()),
+ settings.getTokenStorager0()));
this.settings = settings;
}
@@ -116,8 +115,8 @@ public class WeixinProxy {
TokenHolder suiteTokenHolder) {
this(new TokenHolder(new WeixinTokenSuiteCreator(perCodeHolder,
suiteTokenHolder), suiteTokenHolder.getTokenStorager()));
- this.settings = new Weixin4jSettings(perCodeHolder.getAuthCorpId(),
- null);
+ this.settings = new Weixin4jSettings(new WeixinAccount(
+ perCodeHolder.getAuthCorpId(), null));
}
/**
@@ -156,7 +155,7 @@ public class WeixinProxy {
* @return
*/
public WeixinAccount getWeixinAccount() {
- return this.settings.getAccount();
+ return this.settings.getWeixinAccount();
}
/**
@@ -345,25 +344,6 @@ public class WeixinProxy {
return mediaApi.uploadMedia(agentid, is, fileName);
}
- /**
- * 下载媒体文件
- *
- * @param agentid
- * 企业应用Id(大于0时视为获取永久媒体文件)
- * @param mediaId
- * 存储在微信服务器上的媒体标识
- * @return 写入硬盘后的文件对象
- * @throws WeixinException
- * @see com.foxinmy.weixin4j.qy.api.MediaApi
- * @see com.foxinmy.weixin4j.type.MediaType
- * @see {@link #downloadMedia(int,String)}
- */
- public File downloadMediaFile(int agentid, String mediaId)
- throws WeixinException {
- return mediaApi.downloadMediaFile(agentid, mediaId,
- settings.getMediaPath());
- }
-
/**
* 下载媒体文件
*
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 6f763dc5..99e17b9f 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,7 +3,6 @@ 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;
@@ -11,14 +10,11 @@ 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.suite.Weixin4jSuiteSettings;
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;
/**
* 微信第三方应用接口实现
@@ -36,72 +32,52 @@ public class WeixinSuiteProxy {
private Map suiteMap;
private ProviderApi providerApi;
+ private final Weixin4jSuiteSettings suiteSettings;
+
public WeixinSuiteProxy() {
- this(Weixin4jSettings.DEFAULT_TOKEN_PATH);
+ this(new Weixin4jSuiteSettings());
}
/**
*
- * @param tokenPath
- * 使用文件存储token的保存路径
+ * @param suiteSettings
+ * 套件信息配置
*/
- public WeixinSuiteProxy(String tokenPath) {
- this(new FileTokenStorager(tokenPath));
- }
-
- /**
- *
- * @param tokenStorager
- * token存储
- */
- public WeixinSuiteProxy(TokenStorager tokenStorager) {
- this(tokenStorager, JSON.parseObject(
- Weixin4jConfigUtil.getValue("account"), WeixinQyAccount.class));
- }
-
- /**
- *
- * @param tokenStorager
- * token存储
- * @param suites
- * 套件信息 必填项
- */
- public WeixinSuiteProxy(TokenStorager tokenStorager,
- WeixinQyAccount weixinAccount) {
- this(tokenStorager, weixinAccount.getId(), weixinAccount
- .getProviderSecret(), weixinAccount.suitesToArray());
- }
-
- /**
- *
- * @param tokenStorager
- * token存储
- * @param providerCorpId
- * 服务商的企业号ID 使用服务商API时必填项
- * @param providerSecret
- * 服务商secret 使用服务商API时必填项
- * @param suites
- * 套件信息 使用套件API时必填项
- */
- public WeixinSuiteProxy(TokenStorager tokenStorager, String providerCorpId,
- String providerSecret, WeixinAccount... suites) {
- if (suites != null) {
+ public WeixinSuiteProxy(Weixin4jSuiteSettings suiteSettings) {
+ this.suiteSettings = suiteSettings;
+ if (suiteSettings.getWeixinAccount().getSuiteAccounts() != null) {
this.suiteMap = new HashMap();
- for (WeixinAccount suite : suites) {
+ for (WeixinAccount suite : suiteSettings.getWeixinAccount()
+ .getSuiteAccounts()) {
this.suiteMap.put(suite.getId(), new SuiteApi(
new SuiteTicketHolder(suite.getId(), suite.getSecret(),
- tokenStorager)));
- this.suiteMap.put(null, suiteMap.get(suites[0].getId()));
+ suiteSettings.getTokenStorager0())));
+ this.suiteMap.put(
+ null,
+ suiteMap.get(suiteSettings.getWeixinAccount()
+ .getSuiteAccounts().get(0).getId()));
}
}
- if (StringUtil.isNotBlank(providerCorpId)
- && StringUtil.isNotBlank(providerSecret)) {
+ if (StringUtil.isNotBlank(suiteSettings.getWeixinAccount().getId())
+ && StringUtil.isNotBlank(suiteSettings.getWeixinAccount()
+ .getProviderSecret())) {
this.providerApi = new ProviderApi(new TokenHolder(
- new WeixinProviderTokenCreator(providerCorpId,
- providerSecret), tokenStorager));
+ new WeixinProviderTokenCreator(suiteSettings
+ .getWeixinAccount().getId(), suiteSettings
+ .getWeixinAccount().getProviderSecret()),
+ suiteSettings.getTokenStorager0()));
}
}
+ /**
+ * 企业号信息
+ *
+ * @return
+ */
+ public WeixinQyAccount getWeixinAccount() {
+ return this.suiteSettings.getWeixinAccount();
+ }
+
/**
* 只关注第一个套件获取API(如果只有一个套件
*
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 f3b162f7..9275687c 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
@@ -1,12 +1,8 @@
package com.foxinmy.weixin4j.qy.api;
import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
@@ -190,57 +186,6 @@ public class MediaApi extends QyApi {
}
}
- /**
- * 下载媒体文件
- *
- * @param agentid
- * 企业应用Id(大于0时视为获取永久媒体文件)
- * @param mediaId
- * 存储在微信服务器上的媒体标识
- * @param mediaPath
- * 媒体素材保存路径
- * @return 写入硬盘后的文件对象
- * @throws WeixinException
- * @see com.foxinmy.weixin4j.type.MediaType
- * @see {@link #downloadMedia(int,String)}
- */
- public File downloadMediaFile(int agentid, String mediaId, String mediaPath)
- throws WeixinException {
- final String prefixName = String.format("%d_%s.", agentid, mediaId);
- File[] files = new File(mediaPath).listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith(prefixName);
- }
- });
- if (files.length > 0) {
- return files[0];
- }
- MediaDownloadResult result = downloadMedia(agentid, mediaId);
- File file = new File(mediaPath + File.separator + result.getFileName());
- OutputStream os = null;
- try {
- if (file.createNewFile()) {
- os = new FileOutputStream(file);
- os.write(result.getContent());
- } else {
- throw new WeixinException(String.format("create file fail:%s",
- file.getAbsolutePath()));
- }
- } catch (IOException e) {
- throw new WeixinException(e);
- } finally {
- try {
- if (os != null) {
- os.close();
- }
- } catch (IOException e) {
- ;
- }
- }
- return file;
- }
-
/**
* 下载媒体文件
*
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java
index b025c2cc..30d2e460 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java
@@ -23,7 +23,7 @@ public class WeixinQyAccount extends WeixinAccount {
/**
* 多个应用套件信息
*/
- private List suites;
+ private List suiteAccounts;
/**
* 第三方提供商secret(企业号登陆)
*/
@@ -36,32 +36,30 @@ public class WeixinQyAccount extends WeixinAccount {
/**
*
* @param corpid
- * 企业ID
+ * 企业ID 必填
* @param corpsecret
- * 管理组的凭证密钥
- * @param suiteId
- * 应用套件的id
- * @param suiteSecret
- * 应用套件的secret
+ * 管理组的凭证密钥 使用普通接口(WeixinProxy对象)必须填写
+ * @param suites
+ * 应用套件集合 使用套件接口(WeixinSuiteProxy#SuiteApi)必须填写
* @param providerSecret
- * 第三方提供商secret(企业号登陆)
+ * 第三方提供商secret(企业号登陆) 使用服务商接口(WeixinSuiteProxy#ProviderApi)必填项
* @param chatSecret
- * 消息服务secret(企业号聊天)
+ * 消息服务secret(企业号聊天) 暂无用途
*/
@JSONCreator
public WeixinQyAccount(@JSONField(name = "id") String corpid,
@JSONField(name = "secret") String corpsecret,
- @JSONField(name = "suites") List suites,
+ @JSONField(name = "suites") List suiteAccounts,
@JSONField(name = "providerSecret") String providerSecret,
@JSONField(name = "chatSecret") String chatSecret) {
super(corpid, corpsecret);
- this.suites = suites;
+ this.suiteAccounts = suiteAccounts;
this.providerSecret = providerSecret;
this.chatSecret = chatSecret;
}
- public List getSuites() {
- return suites;
+ public List getSuiteAccounts() {
+ return suiteAccounts;
}
public String getProviderSecret() {
@@ -72,15 +70,15 @@ public class WeixinQyAccount extends WeixinAccount {
return chatSecret;
}
- public WeixinAccount[] suitesToArray() {
- return suites != null ? suites
- .toArray(new WeixinAccount[suites.size()]) : null;
+ public WeixinAccount[] suiteAccountsToArray() {
+ return suiteAccounts != null ? suiteAccounts
+ .toArray(new WeixinAccount[suiteAccounts.size()]) : null;
}
@Override
public String toString() {
- return "WeixinQyAccount [" + super.toString() + ", suites=" + suites
- + ", providerSecret=" + providerSecret + ", chatSecret="
- + chatSecret + "]";
+ return "WeixinQyAccount [" + super.toString() + ", suiteAccounts="
+ + suiteAccounts + ", providerSecret=" + providerSecret
+ + ", chatSecret=" + chatSecret + "]";
}
}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/Weixin4jSuiteSettings.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/Weixin4jSuiteSettings.java
new file mode 100644
index 00000000..a6dcb2ea
--- /dev/null
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/Weixin4jSuiteSettings.java
@@ -0,0 +1,124 @@
+package com.foxinmy.weixin4j.qy.suite;
+
+import java.util.Arrays;
+
+import com.alibaba.fastjson.JSON;
+import com.foxinmy.weixin4j.http.HttpParams;
+import com.foxinmy.weixin4j.model.WeixinAccount;
+import com.foxinmy.weixin4j.qy.model.WeixinQyAccount;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
+import com.foxinmy.weixin4j.token.TokenStorager;
+import com.foxinmy.weixin4j.util.StringUtil;
+import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
+
+/**
+ * 微信第三方套件配置相关
+ *
+ * @className Weixin4jSuiteSettings
+ * @author jy
+ * @date 2016年1月28日
+ * @since JDK 1.6
+ * @see
+ */
+public class Weixin4jSuiteSettings {
+ /**
+ * 微信企业号信息
+ */
+ private final WeixinQyAccount weixinAccount;
+ /**
+ * Http参数
+ */
+ private HttpParams httpParams;
+ /**
+ * token存储方式 默认为FileTokenStorager
+ */
+ private TokenStorager tokenStorager;
+ /**
+ * 系统临时目录
+ */
+ private String tmpdir;
+
+ /**
+ * 默认使用weixin4j.properties配置的信息
+ */
+ public Weixin4jSuiteSettings() {
+ this(JSON.parseObject(Weixin4jConfigUtil.getValue("account"),
+ WeixinQyAccount.class));
+ }
+
+ /**
+ *
+ * @param providerCorpId
+ * 服务商的企业号ID 使用服务商API时必填项
+ * @param providerSecret
+ * 服务商secret 使用服务商API时必填项
+ * @param suites
+ * 套件信息 使用套件API时必填项
+ */
+ public Weixin4jSuiteSettings(String providerCorpId, String providerSecret,
+ WeixinAccount... suites) {
+ this.weixinAccount = new WeixinQyAccount(providerCorpId, null,
+ Arrays.asList(suites), providerSecret, null);
+ }
+
+ private Weixin4jSuiteSettings(WeixinQyAccount weixinAccount) {
+ this.weixinAccount = weixinAccount;
+ }
+
+ public WeixinQyAccount getWeixinAccount() {
+ return weixinAccount;
+ }
+
+ public HttpParams getHttpParams() {
+ return httpParams;
+ }
+
+ public HttpParams getHttpParams0() {
+ if (httpParams == null) {
+ return new HttpParams();
+ }
+ return httpParams;
+ }
+
+ public String getTmpdir() {
+ return tmpdir;
+ }
+
+ public String getTmpdir0() {
+ if (StringUtil.isBlank(tmpdir)) {
+ return Weixin4jConfigUtil.getClassPathValue("weixin4j.tmpdir",
+ System.getProperty("java.io.tmpdir"));
+ }
+ return tmpdir;
+ }
+
+ public TokenStorager getTokenStorager() {
+ return tokenStorager;
+ }
+
+ public TokenStorager getTokenStorager0() {
+ if (tokenStorager == null) {
+ return new FileTokenStorager(getTmpdir0());
+ }
+ return tokenStorager;
+ }
+
+ public void setHttpParams(HttpParams httpParams) {
+ this.httpParams = httpParams;
+ }
+
+ public void setTmpdir(String tmpdir) {
+ this.tmpdir = tmpdir;
+ }
+
+ public void setTokenStorager(TokenStorager tokenStorager) {
+ this.tokenStorager = tokenStorager;
+ }
+
+ @Override
+ public String toString() {
+ return "Weixin4jSuiteSettings [weixinAccount=" + weixinAccount
+ + ", httpParams=" + httpParams + ",tokenStorager="
+ + tokenStorager + ", tmpdir=" + tmpdir + "]";
+ }
+}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java
index c5e66276..537e6641 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java
@@ -42,7 +42,7 @@ public class WeixinSuitePreCodeCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_qy_suite_precode_%s", suiteId);
+ return String.format("weixin4j_qy_suite_precode_%s", suiteId);
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java
index 261e0601..209f27a1 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java
@@ -36,7 +36,7 @@ public class WeixinSuiteTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_qy_suite_token_%s", ticketHolder.getSuiteId());
+ return String.format("weixin4j_qy_suite_token_%s", ticketHolder.getSuiteId());
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java
index fff9a445..f09928a3 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java
@@ -42,7 +42,7 @@ public class WeixinTokenSuiteCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_qy_token_suite_%s:%s",
+ return String.format("weixin4j_qy_token_suite_%s:%s",
perCodeHolder.getSuiteId(), perCodeHolder.getAuthCorpId()
);
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java
index 47cb6704..840a940a 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java
@@ -40,7 +40,7 @@ public class WeixinProviderTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_qy_provider_token_%s", corpid);
+ return String.format("weixin4j_qy_provider_token_%s", corpid);
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java
index 5def6219..beb4b69b 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java
@@ -45,7 +45,7 @@ public class WeixinTicketCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_qy_ticket_%s_%s", corpid, ticketType.name());
+ return String.format("weixin4j_qy_ticket_%s_%s", corpid, ticketType.name());
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java
index c54f60be..b2f0deff 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java
@@ -40,7 +40,7 @@ public class WeixinTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("wx_qy_token_%s", corpid);
+ return String.format("weixin4j_qy_token_%s", corpid);
}
@Override
diff --git a/weixin4j-qy/src/main/resources/weixin4j.properties b/weixin4j-qy/src/main/resources/weixin4j.properties
index ac7dfcd1..fb47608e 100644
--- a/weixin4j-qy/src/main/resources/weixin4j.properties
+++ b/weixin4j-qy/src/main/resources/weixin4j.properties
@@ -1,5 +1,6 @@
# \u6d4b\u8bd5\u4e4b\u7528 \u6b63\u5f0f\u73af\u5883\u4e0bcopy\u4e00\u4efd\u5230classpath
-# \u4f01\u4e1a\u53f7\u4fe1\u606f
+
+# \u4f01\u4e1a\u53f7\u4fe1\u606f \u8bf7\u6309\u9700\u586b\u5199
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)",\
@@ -8,16 +9,15 @@ weixin4j.account={"id":"wx5132afc5da26d661","secret":"GsnKLVDI1pWArdB60Ze4iP2cwF
"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(\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(\u5982\u679c\u4e0d\u586b\u5219\u9ed8\u8ba4\u4e3aWeixin4jConst#DEFAULT_MEDIA_PATH)
-weixin4j.media.path=/tmp/weixin4j/media
-# \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\u7684\u4e34\u65f6\u76ee\u5f55
+# \u53ef\u80fd\u5b58\u653etoken\u6587\u4ef6\u3001\u4e8c\u7ef4\u7801\u6587\u4ef6\u3001\u5a92\u4f53\u6587\u4ef6\u3001\u5bf9\u8d26\u5355\u6587\u4ef6\u7b49
+# \u4e3a\u7a7a\u65f6\u5219\u83b7\u53d6java.io.tmpdir\u4e34\u65f6\u76ee\u5f55
+weixin4j.tmpdir=
+# \u5fae\u4fe1\u652f\u4ed8\u67d0\u4e9b\u63a5\u53e3\u9700\u8981\u7684ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84
+# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199
+# weixin4j.certificate.file=classpath:xxxxx.p12
+# \u4e3a\u7a7a\u65f6\u5219\u83b7\u53d6classpath\u6839\u76ee\u5f55\u4e0b\u7684ca.p12\u6587\u4ef6
weixin4j.certificate.file=/tmp/weixin4j/xxxxx.p12
-# 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(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199)
weixin4j.user.oauth.redirect.uri=
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 2b0aff37..fc54f381 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
@@ -44,12 +44,11 @@ public class MediaTest extends TokenTest {
@Test
public void download() throws WeixinException, IOException {
- File file = mediaApi
- .downloadMediaFile(
+ MediaDownloadResult result = mediaApi
+ .downloadMedia(
0,
- "1y0NWE5ochkfOoiyJsPwQ3Wg7gsyRHNp8SveqhGXY_1rOH7OcOMwfHDg8KH6s88osq59AfS3BX-MBBKvERB7Bvw",
- "/tmp/weixin4j/media");
- Assert.assertTrue(file.exists());
+ "1y0NWE5ochkfOoiyJsPwQ3Wg7gsyRHNp8SveqhGXY_1rOH7OcOMwfHDg8KH6s88osq59AfS3BX-MBBKvERB7Bvw");
+ Assert.assertTrue(result.getContent().length > 0);
}
@Test
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 d593b63b..da2bc4ff 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
@@ -1,39 +1,39 @@
-package com.foxinmy.weixin4j.qy.test;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.model.WeixinAccount;
-import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
-import com.foxinmy.weixin4j.token.FileTokenStorager;
-import com.foxinmy.weixin4j.token.TokenHolder;
-import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
-
-/**
- * token测试
- *
- * @className TokenTest
- * @author jy.hu
- * @date 2014年4月10日
- * @since JDK 1.6
- */
-public class TokenTest {
-
- protected TokenHolder tokenHolder;
-
- @Before
- public void setUp() {
- WeixinAccount weixinAccount = Weixin4jConfigUtil.getWeixinAccount();
- tokenHolder = new TokenHolder(new WeixinTokenCreator(
- weixinAccount.getId(), weixinAccount.getSecret()),
- new FileTokenStorager(Weixin4jConfigUtil.getValue("token.path",
- "/tmp/weixin4j/token")));
- }
-
- @Test
- public void test() throws WeixinException {
- Assert.assertNotNull(tokenHolder.getToken());
- }
-}
+package com.foxinmy.weixin4j.qy.test;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.model.WeixinAccount;
+import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
+import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
+
+/**
+ * token测试
+ *
+ * @className TokenTest
+ * @author jy.hu
+ * @date 2014年4月10日
+ * @since JDK 1.6
+ */
+public class TokenTest {
+
+ protected TokenHolder tokenHolder;
+
+ @Before
+ public void setUp() {
+ WeixinAccount weixinAccount = Weixin4jConfigUtil.getWeixinAccount();
+ tokenHolder = new TokenHolder(new WeixinTokenCreator(
+ weixinAccount.getId(), weixinAccount.getSecret()),
+ new FileTokenStorager(Weixin4jConfigUtil.getValue("token.path",
+ "/tmp/weixin4j/token")));
+ }
+
+ @Test
+ public void test() throws WeixinException {
+ Assert.assertNotNull(tokenHolder.getToken());
+ }
+}