From 17f0424ac9ab87bbd9293033a710e05c9a011615 Mon Sep 17 00:00:00 2001 From: jinyu Date: Tue, 8 Dec 2015 13:48:30 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91=E4=B8=BB?= =?UTF-8?q?=E8=A6=81=E8=B0=83=E6=95=B4=E4=BA=86Pay3Api#refundApply?= =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 8 ++++- .../com/foxinmy/weixin4j/api/Pay3Api.java | 34 +++++++----------- .../weixin4j/model/MediaDownloadResult.java | 6 ++-- .../weixin4j/payment/WeixinPayProxy.java | 14 ++++---- .../com/foxinmy/weixin4j/util/RegexUtil.java | 36 +++++++++++++++++++ .../com/foxinmy/weixin4j/mp/api/MediaApi.java | 9 +++-- .../foxinmy/weixin4j/mp/test/MediaTest.java | 2 +- .../com/foxinmy/weixin4j/qy/api/MediaApi.java | 9 +++-- 8 files changed, 78 insertions(+), 40 deletions(-) create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/RegexUtil.java diff --git a/CHANGE.md b/CHANGE.md index 707aedd4..50266a34 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -526,4 +526,10 @@ + weixin4j-[mp|qy]:version upgrade to 1.6.4 - + weixin4j-server:version upgrade to 1.1.4 \ No newline at end of file + + weixin4j-server:version upgrade to 1.1.4 + + + weixin4j-base:新增RegexUtil类 + + + weixin4j-base:调整Pay3Api退款方法名为 refundApply + + + weixin4j-base:调整Pay3Api#refundApply参数个数 diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java index 1e0c25cd..f9fb38e1 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java @@ -113,9 +113,10 @@ public class Pay3Api { * 订单总金额,单位为元 * @param refundFee * 退款总金额,单位为元,可以做部分退款 + * @param refundFeeType + * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY * @param opUserId * 操作员帐号, 默认为商户号 - * * @return 退款申请结果 * @see com.foxinmy.weixin4j.payment.mch.RefundResult * @see mopara) throws WeixinException { + CurrencyType refundFeeType, String opUserId) throws WeixinException { WeixinResponse response = null; try { Map map = baseMap(idQuery); @@ -136,9 +137,10 @@ public class Pay3Api { opUserId = weixinAccount.getMchId(); } map.put("op_user_id", opUserId); - if (mopara != null && !mopara.isEmpty()) { - map.putAll(mopara); + if (refundFeeType == null) { + refundFeeType = CurrencyType.CNY; } + map.put("refund_fee_type", refundFeeType.name()); String sign = PayUtil .paysignMd5(map, weixinAccount.getPaySignKey()); map.put("sign", sign); @@ -161,7 +163,7 @@ public class Pay3Api { } /** - * 退款申请 + * 退款申请(全额退款) * * @param ca * 证书文件(V3版本后缀为*.p12) @@ -172,24 +174,12 @@ public class Pay3Api { * 商户系统内部的退款单号,商 户系统内部唯一,同一退款单号多次请求只退一笔 * @param totalFee * 订单总金额,单位为元 - * @param refundFee - * 退款总金额,单位为元,可以做部分退款 - * @param refundFeeType - * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY - * @param opUserId - * 操作员帐号, 默认为商户号 - * @see {@link #refundApply(InputStream, IdQuery, String, double, double, String, Map)} + * @see {@link #refundApply(InputStream, IdQuery, String, double, double, String, CurrencyType)} */ public RefundResult refundApply(InputStream ca, IdQuery idQuery, - String outRefundNo, double totalFee, double refundFee, - CurrencyType refundFeeType, String opUserId) throws WeixinException { - Map mopara = new HashMap(); - if (refundFeeType == null) { - refundFeeType = CurrencyType.CNY; - } - mopara.put("refund_fee_type", refundFeeType.name()); - return refundApply(ca, idQuery, outRefundNo, totalFee, refundFee, - opUserId, mopara); + String outRefundNo, double totalFee) throws WeixinException { + return refundApply(ca, idQuery, outRefundNo, totalFee, totalFee, null, + null); } /** diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/MediaDownloadResult.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/MediaDownloadResult.java index 6298fbe0..a31a5ec0 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/MediaDownloadResult.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/MediaDownloadResult.java @@ -1,7 +1,6 @@ package com.foxinmy.weixin4j.model; import java.io.Serializable; -import java.util.Arrays; import com.foxinmy.weixin4j.http.ContentType; @@ -51,8 +50,7 @@ public class MediaDownloadResult implements Serializable { @Override public String toString() { - return "MediaDownloadResult [content=" + Arrays.toString(content) - + ", contentType=" + contentType + ", fileName=" + fileName - + "]"; + return "MediaDownloadResult [content=..., contentType=" + contentType + + ", fileName=" + fileName + "]"; } } 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 ab1380d4..45881e0d 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 @@ -141,19 +141,17 @@ public class WeixinPayProxy { } /** - * 退款申请采用properties中配置的ca文件 + * 退款申请(全额退款)采用properties中配置的ca文件 * * @throws IOException * - * @see {@link #refundApply(InputStream, IdQuery, String, double, double,CurrencyType, String)} + * @see {@link #refundApply(InputStream, IdQuery, String, double, double, String,CurrencyType)} */ public com.foxinmy.weixin4j.payment.mch.RefundResult refundApply( - IdQuery idQuery, String outRefundNo, double totalFee, - double refundFee, String opUserId) throws WeixinException, - IOException { + IdQuery idQuery, String outRefundNo, double totalFee) + throws WeixinException, IOException { return pay3Api.refundApply(new FileInputStream(DEFAULT_CA_FILE), - idQuery, outRefundNo, totalFee, refundFee, CurrencyType.CNY, - opUserId); + idQuery, outRefundNo, totalFee); } /** @@ -522,6 +520,6 @@ public class WeixinPayProxy { throws WeixinException { return pay3Api.authCode2openId(authCode); } - + public final static String VERSION = "1.6.4"; } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/RegexUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/RegexUtil.java new file mode 100644 index 00000000..f2fb4f41 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/RegexUtil.java @@ -0,0 +1,36 @@ +package com.foxinmy.weixin4j.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 正则表达式工具类 + * + * @className RegexUtil + * @author jy + * @date 2015年12月8日 + * @since JDK 1.7 + * @see + */ +public final class RegexUtil { + /** + * Content-disposition 中的 filename提取正则 + */ + private static final Pattern FILENAME_RGX = Pattern + .compile("(?<=filename=\").*?(?=\")"); + + /** + * 从 Content-disposition提取文件名 + * + * @param contentDisposition + * @return + */ + public static String regexFileNameFromContentDispositionHeader( + String contentDisposition) { + if (StringUtil.isBlank(contentDisposition)) { + return null; + } + Matcher filenameMatcher = FILENAME_RGX.matcher(contentDisposition); + return filenameMatcher.find() ? filenameMatcher.group() : null; + } +} 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 775f57ec..5a6f3bdd 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 @@ -45,6 +45,7 @@ import com.foxinmy.weixin4j.type.MediaType; import com.foxinmy.weixin4j.util.FileUtil; 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; @@ -341,8 +342,12 @@ public class MediaApi extends MpApi { .getCode()), jsonResult.getDesc()); } } - String fileName = String.format("%s.%s", mediaId, - contentType.split("/")[1]); + String fileName = RegexUtil + .regexFileNameFromContentDispositionHeader(disposition); + if (StringUtil.isBlank(fileName)) { + fileName = String.format("%s.%s", mediaId, + contentType.split("/")[1]); + } return new MediaDownloadResult(content, ContentType.create(contentType), fileName); } catch (IOException e) { 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 be933967..7399eea4 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 @@ -55,7 +55,7 @@ public class MediaTest extends TokenTest { @Test public void download1() throws WeixinException, IOException { MediaDownloadResult content = mediaApi.downloadMedia( - "zloeIROuS3YJFZwugGNM5oGBolqJmU_8FKTUmJwTFbSjfky904S9OPly5Wq0BRn2", true); + "V4GvAetzQQjj_ECx1Siqvccgm80a32tk1gRusOBYMk8Uouybl-CwSkGk8w7wKgvI", false); Assert.assertTrue(content != null); System.err.println(content); } 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 c452d329..453fc535 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 @@ -48,6 +48,7 @@ import com.foxinmy.weixin4j.type.MediaType; import com.foxinmy.weixin4j.util.FileUtil; 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; @@ -267,8 +268,12 @@ public class MediaApi extends QyApi { .getCode()), jsonResult.getDesc()); } } - String fileName = String.format("%s.%s", mediaId, - contentType.split("/")[1]); + String fileName = RegexUtil + .regexFileNameFromContentDispositionHeader(disposition); + if (StringUtil.isBlank(fileName)) { + fileName = String.format("%s.%s", mediaId, + contentType.split("/")[1]); + } return new MediaDownloadResult(content, ContentType.create(contentType), fileName); } catch (IOException e) {