From 3e68c5a400fc9c4c81636983bd61bb5c4fad24ac Mon Sep 17 00:00:00 2001 From: jinyu Date: Tue, 27 Dec 2016 00:08:29 +0800 Subject: [PATCH 1/5] merge #107 --- pom.xml | 42 +-- weixin4j-base/.gitignore | 2 + .../java/com/foxinmy/weixin4j/api/MchApi.java | 2 +- .../java/com/foxinmy/weixin4j/api/PayApi.java | 290 +----------------- .../weixin4j/exception/WeixinException.java | 101 +++--- .../exception/WeixinPayException.java | 26 -- .../http/weixin/WeixinRequestExecutor.java | 30 +- .../foxinmy/weixin4j/http/weixin/error.xml | 80 +---- .../com/foxinmy/weixin4j/model/Token.java | 32 +- .../weixin4j/payment/WeixinPayProxy.java | 2 +- .../weixin4j/payment/mch/APPPayRequest.java | 4 +- .../payment/mch/AbstractPayRequest.java | 12 +- .../weixin4j/payment/mch/JSAPIPayRequest.java | 4 +- .../weixin4j/payment/mch/MICROPayRequest.java | 12 - .../weixin4j/payment/mch/MchPayPackage.java | 88 +----- .../weixin4j/payment/mch/MchPayRequest.java | 6 - .../payment/mch/NATIVEPayRequest.java | 4 +- .../payment/mch/NativePayResponse.java | 1 - .../foxinmy/weixin4j/payment/mch/Order.java | 2 +- .../foxinmy/weixin4j/payment/mch/PrePay.java | 10 - .../weixin4j/payment/mch/Redpacket.java | 37 --- .../weixin4j/payment/mch/WAPPayRequest.java | 4 +- .../weixin4j/sign/WeixinPaymentSignature.java | 62 ++-- weixin4j-example/.gitignore | 2 + weixin4j-mp/.gitignore | 2 + .../weixin4j/mp/api/ShakeAroundApi.java | 8 +- weixin4j-qy/.gitignore | 2 + 27 files changed, 139 insertions(+), 728 deletions(-) delete mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java diff --git a/pom.xml b/pom.xml index 8e290ca2..fec44966 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ weixin4j-mp weixin4j-qy weixin4j-server + weixin4j-example UTF-8 @@ -53,18 +54,6 @@ - - org.apache.maven.plugins - maven-source-plugin - 2.4 - - - - jar - - - - org.apache.maven.plugins maven-compiler-plugin @@ -222,8 +211,8 @@ src/main/resources - *.xml - *.properties + **/*.xml + **/*.properties @@ -259,27 +248,14 @@ - - - Project Releases - Project Releases - http://repo.wyying.com/nexus/content/repositories/releases/ - - Project Snapshots - Project Snapshots - http://repo.wyying.com/nexus/content/repositories/snapshots/ + oss-snapshot + https://oss.sonatype.org/content/repositories/snapshots/ + + oss-release + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + - - - - - - - - - - \ No newline at end of file diff --git a/weixin4j-base/.gitignore b/weixin4j-base/.gitignore index 87bd9366..c1e98e49 100644 --- a/weixin4j-base/.gitignore +++ b/weixin4j-base/.gitignore @@ -30,3 +30,5 @@ target/* Thumbs.db /target/ .DS_Store +/target/ +/target/ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/MchApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/MchApi.java index 221a067b..86a878fc 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/MchApi.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/MchApi.java @@ -36,7 +36,7 @@ public class MchApi extends BaseApi { } protected final WeixinPayAccount weixinAccount; - protected final WeixinPaymentSignature weixinSignature; + protected final WeixinSignature weixinSignature; private volatile WeixinRequestExecutor weixinSSLExecutor; public MchApi(WeixinPayAccount weixinAccount) { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java index 24deccf6..db860ac0 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java @@ -16,7 +16,6 @@ import java.util.Map; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.foxinmy.weixin4j.exception.WeixinException; -import com.foxinmy.weixin4j.exception.WeixinPayException; import com.foxinmy.weixin4j.http.weixin.WeixinResponse; import com.foxinmy.weixin4j.http.weixin.XmlResult; import com.foxinmy.weixin4j.model.WeixinPayAccount; @@ -86,14 +85,8 @@ public class PayApi extends MchApi { String payJsRequestXml = XmlStream.toXML(payPackage); WeixinResponse response = weixinExecutor.post( getRequestUri("order_create_uri"), payJsRequestXml); - boolean validatePaySign = weixinSignature.validatePaySign(response); - if(validatePaySign) { - PrePay prePay = response.getAsObject(new TypeReference() { - }); - prePay.setResponse(response.getAsString()); - return prePay; - } - throw new WeixinPayException("验证签名信息失败,返回数据可能被篡改"); + return response.getAsObject(new TypeReference() { + }); } /** @@ -131,20 +124,19 @@ public class PayApi extends MchApi { MICROPayRequest microPayRequest = response .getAsObject(new TypeReference() { }); - microPayRequest.setResponse(response.getAsString()); microPayRequest.setPaymentAccount(weixinAccount); return microPayRequest; } PrePay prePay = createPrePay(payPackage); if (TradeType.APP.name().equals(tradeType)) { - return new APPPayRequest(prePay, weixinAccount); + return new APPPayRequest(prePay.getPrepayId(), weixinAccount); } else if (TradeType.JSAPI.name().equals(tradeType)) { - return new JSAPIPayRequest(prePay, weixinAccount); + return new JSAPIPayRequest(prePay.getPrepayId(), weixinAccount); } else if (TradeType.NATIVE.name().equals(tradeType)) { - return new NATIVEPayRequest(prePay, + return new NATIVEPayRequest(prePay.getPrepayId(), prePay.getCodeUrl(), weixinAccount); } else if (TradeType.WAP.name().equals(tradeType)) { - return new WAPPayRequest(prePay, weixinAccount); + return new WAPPayRequest(prePay.getPrepayId(), weixinAccount); } else { throw new WeixinException("unknown tradeType:" + tradeType); } @@ -180,36 +172,6 @@ public class PayApi extends MchApi { return createPayRequest(payPackage); } - /** - * 创建JSAPI支付请求对象 - * - * @param openId - * 用户ID - * @param body - * 订单描述 - * @param outTradeNo - * 订单号 - * @param totalFee - * 订单总额(元) - * @param notifyUrl - * 支付通知地址 - * @param createIp - * ip地址 - * @param attach - * 附加数据 非必填 - * @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest - * @return JSAPI支付对象 - * @throws WeixinException - */ - public MchPayRequest createJSPayRequest(String openId, String body, - String outTradeNo, long totalFee, String notifyUrl, - String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, - totalFee, notifyUrl, createIp, TradeType.JSAPI, openId, null, - null, attach); - return createPayRequest(payPackage); - } - /** *

* 生成编辑地址请求 @@ -311,43 +273,6 @@ public class PayApi extends MchApi { return new NativePayResponse(weixinAccount, prePay.getPrepayId()); } - /** - * 创建Native支付(扫码支付)回调对象【模式一】 - * - * @param productId - * 商品ID - * @param body - * 商品描述 - * @param outTradeNo - * 商户内部唯一订单号 - * @param totalFee - * 商品总额 单位元 - * @param notifyUrl - * 支付回调URL - * @param createIp - * 订单生成的机器 IP - * @param attach - * 附加数据 非必填 - * @return Native回调对象 - * @see com.foxinmy.weixin4j.payment.mch.NativePayResponse - * @see 扫码支付 - * - * @see 模式一 - * - * @throws WeixinException - */ - public NativePayResponse createNativePayResponse(String productId, - String body, String outTradeNo, long totalFee, String notifyUrl, - String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, - totalFee, notifyUrl, createIp, TradeType.NATIVE, null, null, - productId, attach); - PrePay prePay = createPrePay(payPackage); - return new NativePayResponse(weixinAccount, prePay.getPrepayId()); - } - /** * 创建Native支付(扫码支付)链接【模式二】 * @@ -384,42 +309,6 @@ public class PayApi extends MchApi { return createPayRequest(payPackage); } - /** - * 创建Native支付(扫码支付)链接【模式二】 - * - * @param productId - * 商品ID - * @param body - * 商品描述 - * @param outTradeNo - * 商户内部唯一订单号 - * @param totalFee - * 商品总额 单位元 - * @param notifyUrl - * 支付回调URL - * @param createIp - * 订单生成的机器 IP - * @param attach - * 附加数据 非必填 - * @return Native支付对象 - * @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest - * @see 扫码支付 - * - * @see 模式二 - * - * @throws WeixinException - */ - public MchPayRequest createNativePayRequest(String productId, String body, - String outTradeNo, long totalFee, String notifyUrl, - String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, - totalFee, notifyUrl, createIp, TradeType.NATIVE, null, null, - productId, attach); - return createPayRequest(payPackage); - } - /** * 创建APP支付请求对象 * @@ -451,37 +340,6 @@ public class PayApi extends MchApi { return createPayRequest(payPackage); } - /** - * 创建APP支付请求对象 - * - * @param body - * 商品描述 - * @param outTradeNo - * 商户内部唯一订单号 - * @param totalFee - * 商品总额 单位元 - * @param notifyUrl - * 支付回调URL - * @param createIp - * 订单生成的机器 IP - * @param attach - * 附加数据 非必填 - * @return APP支付对象 - * @see com.foxinmy.weixin4j.payment.mch.APPPayRequest - * @see - * APP支付 - * @throws WeixinException - */ - public MchPayRequest createAppPayRequest(String body, String outTradeNo, - long totalFee, String notifyUrl, String createIp, String attach) - throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, - totalFee, notifyUrl, createIp, TradeType.APP, null, null, null, - attach); - return createPayRequest(payPackage); - } - /** * 创建WAP支付请求对象 * @@ -513,37 +371,6 @@ public class PayApi extends MchApi { return createPayRequest(payPackage); } - /** - * 创建WAP支付请求对象 - * - * @param body - * 商品描述 - * @param outTradeNo - * 商户内部唯一订单号 - * @param totalFee - * 商品总额 单位元 - * @param notifyUrl - * 支付回调URL - * @param createIp - * 订单生成的机器 IP - * @param attach - * 附加数据 非必填 - * @return WAP支付对象 - * @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest - * @see WAP支付 - * - * @throws WeixinException - */ - public MchPayRequest createWapPayRequest(String body, String outTradeNo, - long totalFee, String notifyUrl, String createIp, String attach) - throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, - totalFee, notifyUrl, createIp, TradeType.WAP, null, null, null, - attach); - return createPayRequest(payPackage); - } - /** * 提交被扫支付 * @@ -568,43 +395,11 @@ public class PayApi extends MchApi { * @throws WeixinException */ public MchPayRequest createMicroPayRequest(String authCode, String body, - String outTradeNo, double totalFee, String createIp, String attach) + String outTradeNo, double totalFee, String createIp, String attach) throws WeixinException { MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, - totalFee, null, createIp, TradeType.MICROPAY, null, authCode, - null, attach); - return createPayRequest(payPackage); - } - - /** - * 提交被扫支付 - * - * @param authCode - * 扫码支付授权码 ,设备读取用户微信中的条码或者二维码信息 - * @param body - * 商品描述 - * @param outTradeNo - * 商户内部唯一订单号 - * @param totalFee - * 商品总额 单位元 - * @param createIp - * 订单生成的机器 IP - * @param attach - * 附加数据 非必填 - * @return 支付的订单信息 - * @see com.foxinmy.weixin4j.payment.mch.MICROPayRequest - * @see com.foxinmy.weixin4j.payment.mch.Order - * @see - * 提交被扫支付API - * @throws WeixinException - */ - public MchPayRequest createMicroPayRequest(String authCode, String body, - String outTradeNo, long totalFee, String createIp, String attach) - throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, - totalFee, null, createIp, TradeType.MICROPAY, null, authCode, - null, attach); + totalFee, null, createIp, TradeType.MICROPAY, null, authCode, + null, attach); return createPayRequest(payPackage); } @@ -675,51 +470,13 @@ public class PayApi extends MchApi { double totalFee, double refundFee, CurrencyType refundFeeType, String opUserId, RefundAccountType refundAccountType) throws WeixinException { - return applyRefund(idQuery, outRefundNo, DateUtil.formatYuan2Fen(totalFee), DateUtil.formatYuan2Fen(refundFee), refundFeeType, opUserId, - refundAccountType); - } - - /** - * 申请退款(请求需要双向证书) - *

- * 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后, - * 按照退款规则将支付款按原路退到买家帐号上。 - *

- *

- * 1.交易时间超过半年的订单无法提交退款; - * 2.微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交 - * ,要采用原来的退款单号。总退款金额不能超过用户实际支付金额。 - *

- * - * @param idQuery - * 商户系统内部的订单号, transaction_id 、 out_trade_no 二选一,如果同时存在优先级: - * transaction_id> out_trade_no - * @param outRefundNo - * 商户系统内部的退款单号,商 户系统内部唯一,同一退款单号多次请求只退一笔 - * @param totalFee - * 订单总金额,单位为元 - * @param refundFee - * 退款总金额,单位为元,可以做部分退款 - * @param refundFeeType - * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY - * @param opUserId - * 操作员帐号, 默认为商户号 - * @param refundAccountType - * @return 退款申请结果 - * @see com.foxinmy.weixin4j.payment.mch.RefundResult - * @see - * 申请退款API - * @since V3 - * @throws WeixinException - */ - public RefundResult applyRefund(IdQuery idQuery, String outRefundNo, long totalFee, long refundFee, CurrencyType refundFeeType, - String opUserId, RefundAccountType refundAccountType) throws WeixinException { WeixinResponse response = null; Map map = createBaseRequestMap(idQuery); map.put("out_refund_no", outRefundNo); - map.put("total_fee", String.valueOf(totalFee)); - map.put("refund_fee", String.valueOf(refundFee)); + map.put("total_fee", + Integer.toString(DateUtil.formatYuan2Fen(totalFee))); + map.put("refund_fee", + Integer.toString(DateUtil.formatYuan2Fen(refundFee))); if (StringUtil.isBlank(opUserId)) { opUserId = weixinAccount.getMchId(); } @@ -750,7 +507,7 @@ public class PayApi extends MchApi { * 商户系统内部的退款单号,商 户系统内部唯一,同一退款单号多次请求只退一笔 * @param totalFee * 订单总金额,单位为元 - * @see {@link #applyRefund(IdQuery, String, double, double,CurrencyType, String,RefundAccountType)} + * @see {@link #applyRefund(IdQuery, String, double, double,CurrencyType, String)} */ public RefundResult applyRefund(IdQuery idQuery, String outRefundNo, double totalFee) throws WeixinException { @@ -758,23 +515,6 @@ public class PayApi extends MchApi { null, null); } - /** - * 退款申请(全额退款) - * - * @param idQuery - * 商户系统内部的订单号, transaction_id 、 out_trade_no 二选一,如果同时存在优先级: - * transaction_id> out_trade_no - * @param outRefundNo - * 商户系统内部的退款单号,商 户系统内部唯一,同一退款单号多次请求只退一笔 - * @param totalFee - * 订单总金额,单位为元 - * @see {@link #applyRefund(IdQuery, String, double, double,CurrencyType, String,RefundAccountType)} - */ - public RefundResult applyRefund(IdQuery idQuery, String outRefundNo, - long totalFee) throws WeixinException { - return applyRefund(idQuery, outRefundNo, totalFee, totalFee, null, null, null); - } - /** * 冲正订单(需要证书)
当支付返回失败,或收银系统超时需要取消交易,可以调用该接口
接口逻辑:支 * 付失败的关单,支付成功的撤销支付
7天以内的单可撤销,其他正常支付的单 @@ -1024,6 +764,4 @@ public class PayApi extends MchApi { return response.getAsObject(new TypeReference() { }); } - - } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java index aa6b5681..40a5c752 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java @@ -2,82 +2,65 @@ package com.foxinmy.weixin4j.exception; import com.foxinmy.weixin4j.util.StringUtil; import com.foxinmy.weixin4j.util.WeixinErrorUtil; -import com.foxinmy.weixin4j.util.WeixinErrorUtil2; /** * 调用微信接口抛出的异常 * - * @author jinyu(foxinmy@gmail.com) * @className WeixinException + * @author jinyu(foxinmy@gmail.com) * @date 2014年4月10日 - * @see * @since JDK 1.6 + * @see */ public class WeixinException extends Exception { - private static final long serialVersionUID = 7148145661883468514L; + private static final long serialVersionUID = 7148145661883468514L; - private String code; - private String desc; - private String describeErrorMsg; + private String code; + private String desc; - public WeixinException(String code, String desc) { - this(code, desc, null); - } + public WeixinException(String code, String desc) { + this.code = code; + this.desc = desc; + } + public WeixinException(String desc) { + this.code = "-1"; + this.desc = desc; + } - public WeixinException(String errorCode, String errorMsg, String describeErrorMsg) { - this.code = errorCode; - this.desc = errorMsg; - if (describeErrorMsg == null) { - this.describeErrorMsg = errorMsg; - } else { - this.describeErrorMsg = describeErrorMsg; - } - } + public WeixinException(Throwable e) { + super(e); + } - public WeixinException(String desc) { - this.code = "-1"; - this.desc = desc; - } + public WeixinException(String message, Throwable cause) { + super(message, cause); + } - public String getDescribeErrorMsg() { - return describeErrorMsg; - } + public String getErrorCode() { + return code; + } + public String getErrorDesc() { + return desc; + } - public WeixinException(Throwable e) { - super(e); - } + public String getErrorText() { + return WeixinErrorUtil.getText(code); + } - public WeixinException(String message, Throwable cause) { - super(message, cause); - } - - public String getErrorCode() { - return code; - } - - public String getErrorDesc() { - return desc; - } - - public String getErrorText() { - return WeixinErrorUtil2.getText(code); - } - - @Override - public String getMessage() { - if (StringUtil.isNotBlank(code)) { - StringBuilder buf = new StringBuilder(); - buf.append(code).append(" >> ").append(desc); - String text = getErrorText(); - if (StringUtil.isNotBlank(text)) { - buf.append(" >> ").append(text); - } - return buf.toString(); - } else { - return super.getMessage(); - } - } + @Override + public String getMessage() { + if (StringUtil.isNotBlank(code)) { + StringBuilder buf = new StringBuilder(); + buf.append(code).append(" >> ").append(desc); + String text = getErrorText(); + if (StringUtil.isNotBlank(text)) { + buf.append(" >> ").append(text); + } + return buf.toString(); + } else { + return super.getMessage(); + } + } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java deleted file mode 100644 index 7a480362..00000000 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.foxinmy.weixin4j.exception; - -/** - * 调用微信支付抛出的异常 - * - * @className WeixinPayException - * @author jinyu(foxinmy@gmail.com) - * @date 2014年10月28日 - * @since JDK 1.6 - * @see - */ -public class WeixinPayException extends WeixinException { - private static final long serialVersionUID = 7148145661883468514L; - - public WeixinPayException(String desc) { - super(desc); - } - - public WeixinPayException(String code, String desc) { - super(code, desc); - } - - public WeixinPayException(Throwable e) { - super(e); - } -} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java index 8f4eb32d..f24cf664 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java @@ -28,24 +28,21 @@ import com.foxinmy.weixin4j.http.message.XmlMessageConverter; import com.foxinmy.weixin4j.logging.InternalLogLevel; import com.foxinmy.weixin4j.logging.InternalLogger; import com.foxinmy.weixin4j.logging.InternalLoggerFactory; - - import com.foxinmy.weixin4j.util.Consts; -import com.foxinmy.weixin4j.util.WeixinErrorUtil2; /** * 负责微信请求的执行 * - * @author jy * @className WeixinRequestExecutor * @author jinyu(foxinmy@gmail.com) * @date 2015年8月15日 - * @see * @since JDK 1.6 + * @see */ public class WeixinRequestExecutor { - protected final InternalLogger logger = InternalLoggerFactory.getInstance(getClass()); + protected final InternalLogger logger = InternalLoggerFactory + .getInstance(getClass()); private static final String SUCCESS_CODE = ",0,success,"; @@ -61,7 +58,7 @@ public class WeixinRequestExecutor { /** * Post方法执行微信请求 - * + * * @param url * 请求URL * @param body @@ -78,7 +75,7 @@ public class WeixinRequestExecutor { /** * Post方法执行微信请求,用于文件上传 - * + * * @param url * 请求URL * @param bodyParts @@ -100,7 +97,7 @@ public class WeixinRequestExecutor { /** * Get方法执行微信请求 - * + * * @param url * 请求URL,如:https://api.weixin.qq.com/cgi-bin/token * @param parameters @@ -121,7 +118,7 @@ public class WeixinRequestExecutor { /** * 执行微信请求 - * + * * @param request * 微信请求 * @return 微信响应 @@ -133,9 +130,6 @@ public class WeixinRequestExecutor { logger.debug("weixin request >> " + request.getMethod() + " " + request.getURI().toString()); } - if(request.getEntity() instanceof StringEntity){ - logger.debug("weixin request body >> " + ((StringEntity) request.getEntity()).getContentString()); - } HttpResponse httpResponse = httpClient.execute(request); WeixinResponse response = new WeixinResponse(httpResponse); handleResponse(response); @@ -147,7 +141,7 @@ public class WeixinRequestExecutor { /** * 响应内容是否为流 - * + * * @param response * 微信响应 * @return true/false @@ -165,7 +159,7 @@ public class WeixinRequestExecutor { /** * handle the weixin response - * + * * @param response * 微信请求响应 * @throws WeixinException @@ -188,7 +182,7 @@ public class WeixinRequestExecutor { if (!SUCCESS_CODE.contains(String.format(",%s,", result.getReturnCode() .toLowerCase()))) { throw new WeixinException(result.getReturnCode(), - result.getReturnMsg(),WeixinErrorUtil2.getText(result.getReturnCode())); + result.getReturnMsg()); } if (XmlMessageConverter.GLOBAL.canConvert(XmlResult.class, response)) { try { @@ -197,7 +191,7 @@ public class WeixinRequestExecutor { if (!SUCCESS_CODE.contains(String.format(",%s,", xmlResult .getResultCode().toLowerCase()))) { throw new WeixinException(xmlResult.getErrCode(), - xmlResult.getErrCodeDes(),WeixinErrorUtil2.getText(xmlResult.getErrCode())); + xmlResult.getErrCodeDes()); } } catch (IOException e) { ; @@ -211,7 +205,7 @@ public class WeixinRequestExecutor { /** * 创建 SSL微信请求对象 - * + * * @param password * 加载密钥 * @param inputStream diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml index 81665ba5..a520e717 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml @@ -2,16 +2,14 @@ + + -1 + 系统繁忙,请稍后再试 + 0 请求成功 - - -1 - system error - 微信系统繁忙,请稍候再试 - - 40001 获取access_token时AppSecret错误,或者access_token无效 @@ -38,8 +36,7 @@ 40007 - invalid media_id - 请检查您的素材! + 无效的media_id 40008 @@ -136,7 +133,7 @@ 40031 - 不合法的粉丝列表 + 不合法的openid列表 40032 @@ -264,7 +261,7 @@ 40073 - 不合法的cardid + 不合法的openid 40074 @@ -342,10 +339,6 @@ 40116 不合法的Code码。 - - 40113 - 不支持的文件类型 - 40117 分组名字不合法 @@ -382,15 +375,6 @@ 40132 微信号不合法 - - 40130 - 最少选择两名粉丝 - - - 40132 - invalid username - 无效的微信号 - 40137 不支持的图片格式 @@ -549,8 +533,7 @@ 43004 - require subscribe - 未关注公众号 + 需要接收者关注 43005 @@ -610,23 +593,19 @@ 45001 - media size out of limit - 多媒体文件大小超过微信限制 + 多媒体文件大小超过限制 45002 - content size out of limit - 发送内容超过限制 + 消息内容超过限制 45003 - title size out of limit - 标题超过限制 + 标题字段超过限制 45004 - description size out of limit - 描述超过限制 + 描述字段超过限制 45005 @@ -672,10 +651,6 @@ 45021 字段超过长度限制,请参考相应接口的字段说明。 - - 45028 - 群发次数超过限制 - 45022 应用名字长度不合法,合法长度为2-16个字 @@ -740,32 +715,10 @@ 45058 不能修改0/1/2这三个系统默认保留的标签 - - 48001 - 公众号没有调用该接口的权限 - - - 48002 - 公众号没有调用该接口的权限 - - - 48003 - 请登录公众号后台,打开“群发功能”,同意腾讯群发消息声明 - - 45059 有粉丝身上的标签数已经超过限制 - - 48005 - 此素材被自定义菜单引用,请先解除引用关系再编辑素材 - forbid to delete material used by auto-reply or menu hint: [JMOD7a0063e292] - - - 61450 - 系统错误(system error) - 45157 标签名非法,请注意不能和其他标签重名 @@ -2467,8 +2420,8 @@ 金额不匹配,报关的订单金额必须和支付的金额一致,请检查报关订单的金额是否正确 - 9001007 - 上传文件无效 + POST_DATA_EMPTY + post数据为空,post数据不能为空,请检查post数据是否为空 REQUIRE_POST_METHOD @@ -2479,8 +2432,9 @@ 输入的参数xml格式有误,检查输入的xml格式是否正确 - 9001010 - 文件上传到微信失败 + SECOND_OVER_LIMITED + 企业红包的按分钟发放受限,每分钟发送红包数量不得超过1800个;(可联系微信支付wxhongbao@tencent.com调高额度) + SENDNUM_LIMIT diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java index 1bfcec19..a25f8755 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java @@ -3,7 +3,6 @@ package com.foxinmy.weixin4j.model; import java.util.HashMap; import java.util.Map; -import com.alibaba.fastjson.annotation.JSONField; import com.foxinmy.weixin4j.cache.Cacheable; /** @@ -26,12 +25,10 @@ public class Token implements Cacheable { /** * 获取到的凭证 */ - @JSONField(name = "access_token") private String accessToken; /** * 凭证有效时间,单位:毫秒 */ - @JSONField(name = "expires_in") private long expires; /** * token创建的时间,单位:毫秒 @@ -42,11 +39,6 @@ public class Token implements Cacheable { */ private Map extra; - /** - * 请求返回的原始结果 - */ - private String originalResult; - /** * 永不过期、创建时间为当前时间戳的token对象 * @@ -63,7 +55,7 @@ public class Token implements Cacheable { * @param accessToken * 凭证字符串 * @param expires - * 过期时间 单位秒 + * 过期时间 单位毫秒 */ public Token(String accessToken, long expires) { this(accessToken, expires, System.currentTimeMillis()); @@ -85,26 +77,6 @@ public class Token implements Cacheable { this.extra = new HashMap(); } - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - public void setExpires(long expires) { - this.expires = expires; - } - - public void setCreateTime(long createTime) { - this.createTime = createTime; - } - - public String getOriginalResult() { - return originalResult; - } - - public void setOriginalResult(String originalResult) { - this.originalResult = originalResult; - } - public String getAccessToken() { return accessToken; } @@ -128,8 +100,6 @@ public class Token implements Cacheable { return this; } - - @Override public String toString() { return "Token [accessToken=" + accessToken + ", expires=" + expires 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 90af97fe..596a6369 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 @@ -469,7 +469,7 @@ public class WeixinPayProxy { * * @throws IOException * - * @see {@link #applyRefund(IdQuery, String, double, double,CurrencyType,String,RefundAccountType)} + * @see {@link #applyRefund(IdQuery, String, double, double, String,CurrencyType)} */ public RefundResult applyRefund(IdQuery idQuery, String outRefundNo, double totalFee) throws WeixinException { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java index e930a472..66e1a8a7 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java @@ -20,8 +20,8 @@ import com.foxinmy.weixin4j.util.MapUtil; * href="https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1">APP支付 */ public class APPPayRequest extends AbstractPayRequest { - public APPPayRequest(PrePay prePay, WeixinPayAccount payAccount) { - super(prePay.getPrepayId(),prePay.getResponse(), payAccount); + public APPPayRequest(String prePayId, WeixinPayAccount payAccount) { + super(prePayId, payAccount); } @Override diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/AbstractPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/AbstractPayRequest.java index 246a8b21..7e344dd8 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/AbstractPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/AbstractPayRequest.java @@ -10,14 +10,10 @@ public abstract class AbstractPayRequest implements MchPayRequest { private final WeixinPayAccount paymentAccount; protected final WeixinSignature weixinSignature; - protected final String payResponse; - - public AbstractPayRequest(String prePayId, String payResponse, WeixinPayAccount paymentAccount) { + public AbstractPayRequest(String prePayId, WeixinPayAccount paymentAccount) { this.prePayId = prePayId; - this.payResponse = payResponse; this.paymentAccount = paymentAccount; this.weixinSignature = new WeixinPaymentSignature(paymentAccount.getPaySignKey()); - } @Override @@ -29,10 +25,4 @@ public abstract class AbstractPayRequest implements MchPayRequest { public WeixinPayAccount getPaymentAccount() { return this.paymentAccount; } - - - @Override - public String getResponseString() { - return payResponse; - } } \ No newline at end of file diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/JSAPIPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/JSAPIPayRequest.java index f7398d4d..258167ce 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/JSAPIPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/JSAPIPayRequest.java @@ -25,8 +25,8 @@ import com.foxinmy.weixin4j.type.TradeType; */ public class JSAPIPayRequest extends AbstractPayRequest { - public JSAPIPayRequest(PrePay prePay, WeixinPayAccount payAccount) { - super(prePay.getPrepayId(), prePay.getResponse(), payAccount); + public JSAPIPayRequest(String prePayId, WeixinPayAccount payAccount) { + super(prePayId, payAccount); } @Override diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MICROPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MICROPayRequest.java index 4fa6090c..72ad9661 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MICROPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MICROPayRequest.java @@ -27,8 +27,6 @@ public class MICROPayRequest extends Order implements MchPayRequest { @JSONField(serialize = false) private WeixinPayAccount paymentAccount; - private String response; - protected MICROPayRequest() { // jaxb required } @@ -57,16 +55,6 @@ public class MICROPayRequest extends Order implements MchPayRequest { return null; } - - public void setResponse(String response) { - this.response = response; - } - - @Override - public String getResponseString() { - return response; - } - /** * 返回null,请不要尝试作为支付请求 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java index 0295cb05..4df383da 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java @@ -108,38 +108,6 @@ public class MchPayPackage extends PayPackage { null, null, null, null); } - /** - * 微信支付 - * - * @param body - * 支付详情 必填 - * @param outTradeNo - * 商户侧订单号 必填 - * @param totalFee - * 支付金额(单位元) 必填 - * @param notifyUrl - * 支付回调URL 必填 - * @param createIp - * 发起支付的IP地址 必填 - * @param tradeType - * 支付类型 必填 - * @param openId - * 用户唯一标识 公众号JSAPI支付必填 - * @param authCode - * 支付授权码 刷卡MICROPAY支付必填 - * @param productId - * 商品ID 扫码NATIVE支付必填 - * @param attach - * 支付时附加信息 非必填 - */ - public MchPayPackage(String body, String outTradeNo, long totalFee, - String notifyUrl, String createIp, TradeType tradeType, - String openId, String authCode, String productId, String attach) { - this(body, null, outTradeNo, totalFee, notifyUrl, createIp, tradeType, - openId, authCode, productId, attach, null, null, null, null, - null); - } - /** * 完整参数 * @@ -179,12 +147,12 @@ public class MchPayPackage extends PayPackage { * 用户在子商户appid下的唯一标识 非必填 * openid和sub_openid可以选传其中之一,如果选择传sub_openid ,则必须传sub_appid */ - public MchPayPackage(String body, String detail, String outTradeNo, + public MchPayPackage(String body, String detial, String outTradeNo, double totalFee, CurrencyType feeType, String notifyUrl, String createIp, TradeType tradeType, String openId, String authCode, String productId, String attach, Date timeStart, Date timeExpire, String goodsTag, String limitPay, String subOpenId) { - super(body, detail, outTradeNo, totalFee, notifyUrl, createIp, attach, + super(body, detial, outTradeNo, totalFee, notifyUrl, createIp, attach, timeStart, timeExpire, goodsTag); this.tradeType = tradeType != null ? tradeType.name() : null; this.feeType = feeType == null ? CurrencyType.CNY.name() : feeType @@ -196,58 +164,6 @@ public class MchPayPackage extends PayPackage { this.subOpenId = subOpenId; } - /** - * 完整参数 - * - * @param body - * 商品描述 必填项 - * @param detail - * 商品名称明细列表 非必填项 - * @param outTradeNo - * 商户内部唯一订单号 必填项 - * @param totalFee - * 商品总额 单位元 必填项 - * @param notifyUrl - * 支付回调URL 必填项 - * @param createIp - * 订单生成的机器IP 必填项 - * @param tradeType - * 交易类型 必填项 - * @param openId - * 用户ID tradeType=JSAPI时必填 - * @param authCode - * 刷卡支付授权码 tradeType=MICROPAY时必填 - * @param productId - * 产品ID tradeType=NATIVE时必填 - * @param attach - * 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 非必填项 - * @param timeStart - * 订单生成时间,格式为yyyyMMddHHmmss 非必填项 - * @param timeExpire - * 订单失效时间,格式为yyyyMMddHHmmss;注意:最短失效时间间隔必须大于5分钟 非必填项 - * @param goodsTag - * 商品标记,代金券或立减优惠功能的参数 非必填项 - * @param limitPay - * 指定支付方式:no_credit--指定不能使用信用卡支付 非必填项 - * @param subOpenId - * 用户在子商户appid下的唯一标识 非必填 - * openid和sub_openid可以选传其中之一,如果选择传sub_openid ,则必须传sub_appid - */ - public MchPayPackage(String body, String detail, String outTradeNo, - long totalFee, String notifyUrl, String createIp, - TradeType tradeType, String openId, String authCode, - String productId, String attach, Date timeStart, Date timeExpire, - String goodsTag, String limitPay, String subOpenId) { - super(body, detail, outTradeNo, totalFee, notifyUrl, createIp, attach, - timeStart, timeExpire, goodsTag); - this.tradeType = tradeType.name(); - this.openId = openId; - this.authCode = authCode; - this.productId = productId; - this.limitPay = limitPay; - this.subOpenId = subOpenId; - } - public String getTradeType() { return tradeType; } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayRequest.java index 5e2f2292..1feda2b4 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayRequest.java @@ -52,10 +52,4 @@ public interface MchPayRequest { * @return */ public PayRequest toRequestObject(); - - /** - * 支付请求返回的结果 - * @return - */ - public String getResponseString(); } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NATIVEPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NATIVEPayRequest.java index ddc88150..3eb7809c 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NATIVEPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NATIVEPayRequest.java @@ -20,9 +20,9 @@ public class NATIVEPayRequest extends AbstractPayRequest { private final String codeUrl; - public NATIVEPayRequest(PrePay prePay, String codeUrl, + public NATIVEPayRequest(String prePayId, String codeUrl, WeixinPayAccount payAccount) { - super(prePay.getPrepayId(), prePay.getResponse(), payAccount); + super(prePayId, payAccount); this.codeUrl = codeUrl; } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java index 9e0bcf82..0cd0267b 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java @@ -6,7 +6,6 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import com.alibaba.fastjson.annotation.JSONField; -import com.foxinmy.weixin4j.exception.WeixinPayException; import com.foxinmy.weixin4j.model.WeixinPayAccount; import com.foxinmy.weixin4j.sign.WeixinPaymentSignature; import com.foxinmy.weixin4j.util.Consts; diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Order.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Order.java index d31dc08b..f6662181 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Order.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Order.java @@ -69,7 +69,7 @@ public class Order extends MerchantTradeResult { /** * 现金支付货币类型,符合 ISO 4217 标准的三位字母代码,默认人民币:CNY * - * @see com.foxinmy.weixin4j.type.CurrencyType + * @see com.foxinmy.weixin4j.mp.type.CurrencyType */ @XmlElement(name = "cash_fee_type") @JSONField(name = "cash_fee_type") diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/PrePay.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/PrePay.java index 23b7e63d..55c8c823 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/PrePay.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/PrePay.java @@ -40,8 +40,6 @@ public class PrePay extends MerchantResult { @XmlElement(name = "code_url") private String codeUrl; - private String response; - protected PrePay() { // jaxb required } @@ -74,14 +72,6 @@ public class PrePay extends MerchantResult { this.codeUrl = codeUrl; } - public String getResponse() { - return response; - } - - public void setResponse(String response) { - this.response = response; - } - @Override public String toString() { return "PrePay [tradeType=" + tradeType + ", prepayId=" + prepayId diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java index ab060b02..e20aa563 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java @@ -138,43 +138,6 @@ public class Redpacket extends MerchantResult { this.amtType = totalNum > 1 ? "ALL_RAND" : null; } - /** - * 红包 - * - * @param outTradeNo - * 商户侧一天内不可重复的订单号 接口根据商户订单号支持重入 如出现超时可再调用 必填 - * @param sendName - * 红包发送者名称 必填 - * @param openId - * 接受收红包的用户的openid 必填 - * @param totalAmount - * 付款金额 单位为分,自动格式化为分 必填 - * @param totalNum - * 红包发放总人数 大于1视为裂变红包 必填 - * @param wishing - * 红包祝福语 必填 - * @param clientIp - * Ip地址 必填 - * @param actName - * 活动名称 必填 - * @param remark - * 备注 必填 - */ - public Redpacket(String outTradeNo, String sendName, String openId, - int totalAmount, int totalNum, String wishing, String clientIp, - String actName, String remark) { - this.outTradeNo = outTradeNo; - this.sendName = sendName; - this.openId = openId; - this.totalNum = totalNum; - this.wishing = wishing; - this.clientIp = clientIp; - this.actName = actName; - this.remark = remark; - this.totalAmount = totalAmount; - this.amtType = totalNum > 1 ? "ALL_RAND" : null; - } - public String getOutTradeNo() { return outTradeNo; } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/WAPPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/WAPPayRequest.java index 7c851c84..754fe66b 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/WAPPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/WAPPayRequest.java @@ -22,8 +22,8 @@ import com.foxinmy.weixin4j.util.URLEncodingUtil; */ public class WAPPayRequest extends AbstractPayRequest { - public WAPPayRequest(PrePay prePay, WeixinPayAccount payAccount) { - super(prePay.getPrepayId(),prePay.getResponse(), payAccount); + public WAPPayRequest(String prePayId, WeixinPayAccount payAccount) { + super(prePayId, payAccount); } @Override diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/sign/WeixinPaymentSignature.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/sign/WeixinPaymentSignature.java index 4bcbc260..9d32ef29 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/sign/WeixinPaymentSignature.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/sign/WeixinPaymentSignature.java @@ -1,60 +1,36 @@ package com.foxinmy.weixin4j.sign; -import com.foxinmy.weixin4j.http.weixin.WeixinResponse; import com.foxinmy.weixin4j.type.SignType; import com.foxinmy.weixin4j.util.DigestUtil; -import com.foxinmy.weixin4j.xml.XmlStream; - -import java.util.Map; /** * 微信支付签名实现 * - * @author jinyu(foxinmy@gmail.com) * @className WeixinPaymentSignature + * @author jinyu(foxinmy@gmail.com) * @date 2016年3月26日 - * @see 支付签名说明 * @since JDK 1.6 + * @see 支付签名说明 */ public class WeixinPaymentSignature extends AbstractWeixinSignature { + /** + * 支付密钥 + */ + private final String paySignKey; - /** - * 支付密钥 - */ - private final String paySignKey; - - public WeixinPaymentSignature(String paySignKey) { - this.paySignKey = paySignKey; - } - - @Override - public SignType getSignType() { - return SignType.MD5; - } - - @Override - public String sign(Object obj) { - StringBuilder sb = join(obj).append("&key=").append(paySignKey); - return DigestUtil.MD5(sb.toString()).toUpperCase(); - } - - - public boolean validatePaySign(WeixinResponse weixinResponse) { - return this.validatePaySign(weixinResponse.getAsString()); - - } - - public boolean validatePaySign(String xmlResult) { - return this.validatePaySign(XmlStream.xml2map(xmlResult)); - } - - public boolean validatePaySign(Map map) { - String sign1 = map.get("sign"); - map.remove("sign"); - String sign2 = this.sign(map); - return sign1.equals(sign2); - } + public WeixinPaymentSignature(String paySignKey) { + this.paySignKey = paySignKey; + } + @Override + public SignType getSignType() { + return SignType.MD5; + } + @Override + public String sign(Object obj) { + StringBuilder sb = join(obj).append("&key=").append(paySignKey); + return DigestUtil.MD5(sb.toString()).toUpperCase(); + } } diff --git a/weixin4j-example/.gitignore b/weixin4j-example/.gitignore index 20b70bca..8c2bf0f3 100644 --- a/weixin4j-example/.gitignore +++ b/weixin4j-example/.gitignore @@ -31,3 +31,5 @@ Thumbs.db /target/ .DS_Store bin +/target/ +/target/ diff --git a/weixin4j-mp/.gitignore b/weixin4j-mp/.gitignore index 87bd9366..c1e98e49 100644 --- a/weixin4j-mp/.gitignore +++ b/weixin4j-mp/.gitignore @@ -30,3 +30,5 @@ target/* Thumbs.db /target/ .DS_Store +/target/ +/target/ diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/ShakeAroundApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/ShakeAroundApi.java index 284ad1fe..b0c043ab 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/ShakeAroundApi.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/ShakeAroundApi.java @@ -1,21 +1,19 @@ package com.foxinmy.weixin4j.mp.api; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.weixin.ApiResult; import com.foxinmy.weixin4j.http.weixin.WeixinResponse; import com.foxinmy.weixin4j.model.Token; -import com.foxinmy.weixin4j.model.paging.Pageable; import com.foxinmy.weixin4j.model.paging.Pagedata; import com.foxinmy.weixin4j.mp.model.shakearound.Device; import com.foxinmy.weixin4j.mp.model.shakearound.DeviceAuditState; import com.foxinmy.weixin4j.mp.model.shakearound.ShakeUserInfo; import com.foxinmy.weixin4j.token.TokenManager; -import com.sun.javafx.binding.StringFormatter; - -import java.util.ArrayList; -import java.util.List; /** * 摇一摇周边 diff --git a/weixin4j-qy/.gitignore b/weixin4j-qy/.gitignore index 87bd9366..c1e98e49 100644 --- a/weixin4j-qy/.gitignore +++ b/weixin4j-qy/.gitignore @@ -30,3 +30,5 @@ target/* Thumbs.db /target/ .DS_Store +/target/ +/target/ From e4a77e96df0d1b947a266bd37879c86c4b7a6bd2 Mon Sep 17 00:00:00 2001 From: jinyu Date: Thu, 5 Jan 2017 10:44:53 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=8F=91=E7=BA=A2?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/foxinmy/weixin4j/api/CashApi.java | 70 +++++++--- .../weixin4j/payment/WeixinPayProxy.java | 22 +-- .../weixin4j/payment/mch/Redpacket.java | 68 ++++++---- .../weixin4j/payment/mch/RedpacketRisk.java | 85 ++++++++++++ .../weixin4j/type/mch/RedpacketSceneType.java | 44 ++++++ .../foxinmy/weixin4j/base/test/CashTest.java | 8 +- .../com/foxinmy/weixin4j/mp/api/CardApi.java | 125 ++++++++++-------- 7 files changed, 317 insertions(+), 105 deletions(-) create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/RedpacketRisk.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketSceneType.java diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java index 9082d846..5a09f443 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java @@ -1,8 +1,15 @@ package com.foxinmy.weixin4j.api; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -49,11 +56,19 @@ public class CashApi extends MchApi { * * @param redpacket * 红包信息 - * @see #sendRedpack(Redpacket,String) + * @param openId + * 接受收红包的用户的openid 必填 + * @see #sendRedpacks(Redpacket, String...) */ - public RedpacketSendResult sendRedpack(Redpacket redpacket) + public RedpacketSendResult sendRedpack(Redpacket redpacket, String openId) throws WeixinException { - return sendRedpack(redpacket, null); + try { + return sendRedpacks(redpacket, openId).get(0).get(); + } catch (InterruptedException e) { + throw new WeixinException("send redpack error", e); + } catch (ExecutionException e) { + throw new WeixinException("send redpack error", e); + } } /** @@ -61,8 +76,8 @@ public class CashApi extends MchApi { * * @param redpacket * 红包信息 - * @param appId - * 应用ID 可为空 主要是针对企业号支付时传入的agentid + * @param openIds + * 接受收红包的用户的openid 必填 * @return 发放结果 * @see com.foxinmy.weixin4j.payment.mch.Redpacket * @see com.foxinmy.weixin4j.payment.mch.RedpacketSendResult @@ -74,23 +89,44 @@ public class CashApi extends MchApi { * 发放裂变红包接口 * @throws WeixinException */ - public RedpacketSendResult sendRedpack(Redpacket redpacket, String appId) - throws WeixinException { + public List> sendRedpacks(Redpacket redpacket, + String... openIds) { + String appId = redpacket.getAppId(); super.declareMerchant(redpacket); - JSONObject obj = (JSONObject) JSON.toJSON(redpacket); + final JSONObject obj = (JSONObject) JSON.toJSON(redpacket); if (StringUtil.isNotBlank(appId)) { obj.put("appid", appId); } obj.put("wxappid", obj.remove("appid")); - obj.put("sign", weixinSignature.sign(obj)); - String param = XmlStream.map2xml(obj); - WeixinResponse response = getWeixinSSLExecutor() - .post(redpacket.getTotalNum() > 1 ? getRequestUri("groupredpack_send_uri") - : getRequestUri("redpack_send_uri"), param); - String text = response.getAsString() - .replaceFirst("", "") - .replaceFirst("", ""); - return XmlStream.fromXML(text, RedpacketSendResult.class); + final String redpack_uri = redpacket.getTotalNum() > 1 ? getRequestUri("groupredpack_send_uri") + : getRequestUri("redpack_send_uri"); + int sendLength = openIds.length; + ExecutorService sendExecutor = Executors.newFixedThreadPool(Math.max(1, + sendLength / 10)); // 十分之一? + List> callSendList = new ArrayList>( + sendLength); + for (final String openId : openIds) { + Future futureSend = sendExecutor + .submit(new Callable() { + @Override + public RedpacketSendResult call() throws Exception { + obj.put("re_openid", openId); + obj.put("sign", weixinSignature.sign(obj)); + String param = XmlStream.map2xml(obj); + WeixinResponse response = getWeixinSSLExecutor() + .post(redpack_uri, param); + String text = response.getAsString() + .replaceFirst("", "") + .replaceFirst("", ""); + return XmlStream.fromXML(text, + RedpacketSendResult.class); + } + }); + callSendList.add(futureSend); + } + // 关闭启动线程,不再接受新的任务 + sendExecutor.shutdown(); + return callSendList; } /** 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 596a6369..bec415f2 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 @@ -3,6 +3,8 @@ package com.foxinmy.weixin4j.payment; import java.io.IOException; import java.io.OutputStream; import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; import com.alibaba.fastjson.JSON; import com.foxinmy.weixin4j.api.CashApi; @@ -679,11 +681,15 @@ public class WeixinPayProxy { * * @param redpacket * 红包信息 - * @see #sendRedpack(Redpacket,String) + * @param openId + * 接受收红包的用户的openid 必填 + * @see com.foxinmy.weixin4j.api.CashApi + * @throws WeixinException + * @see #sendRedpacks(Redpacket, String...) */ - public RedpacketSendResult sendRedpack(Redpacket redpacket) + public RedpacketSendResult sendRedpack(Redpacket redpacket, String openId) throws WeixinException { - return cashApi.sendRedpack(redpacket); + return cashApi.sendRedpack(redpacket, openId); } /** @@ -691,8 +697,8 @@ public class WeixinPayProxy { * * @param redpacket * 红包信息 - * @param appId - * 应用ID 可为空 主要是针对企业号支付时传入的agentid + * @param openIds + * 接受收红包的用户的openid 必填 * @return 发放结果 * @see com.foxinmy.weixin4j.api.CashApi * @see com.foxinmy.weixin4j.payment.mch.Redpacket @@ -705,9 +711,9 @@ public class WeixinPayProxy { * 发放裂变红包接口 * @throws WeixinException */ - public RedpacketSendResult sendRedpack(Redpacket redpacket, String appId) - throws WeixinException { - return cashApi.sendRedpack(redpacket, appId); + public List> sendRedpacks(Redpacket redpacket, + String... openIds) { + return cashApi.sendRedpacks(redpacket, openIds); } /** diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java index e20aa563..47339592 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java @@ -6,6 +6,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.mch.RedpacketSceneType; import com.foxinmy.weixin4j.util.DateUtil; /** @@ -38,12 +39,6 @@ public class Redpacket extends MerchantResult { @XmlElement(name = "send_name") @JSONField(name = "send_name") private String sendName; - /** - * 接收红包的用户的openid - */ - @XmlElement(name = "re_openid") - @JSONField(name = "re_openid") - private String openId; /** * 付款金额,单位分 */ @@ -96,6 +91,18 @@ public class Redpacket extends MerchantResult { @XmlElement(name = "consume_mch_id") @JSONField(name = "consume_mch_id") private String consumeMchId; + /** + * 发放红包使用场景,红包金额大于200时必传 + */ + @XmlElement(name = "scene_id") + @JSONField(name = "scene_id") + private RedpacketSceneType sceneType; + /** + * 活动信息 + */ + @XmlElement(name = "risk_info") + @JSONField(name = "risk_info") + private String risk; protected Redpacket() { // jaxb required @@ -108,8 +115,6 @@ public class Redpacket extends MerchantResult { * 商户侧一天内不可重复的订单号 接口根据商户订单号支持重入 如出现超时可再调用 必填 * @param sendName * 红包发送者名称 必填 - * @param openId - * 接受收红包的用户的openid 必填 * @param totalAmount * 付款金额 单位为元,自动格式化为分 必填 * @param totalNum @@ -123,12 +128,11 @@ public class Redpacket extends MerchantResult { * @param remark * 备注 必填 */ - public Redpacket(String outTradeNo, String sendName, String openId, - double totalAmount, int totalNum, String wishing, String clientIp, - String actName, String remark) { + public Redpacket(String outTradeNo, String sendName, double totalAmount, + int totalNum, String wishing, String clientIp, String actName, + String remark) { this.outTradeNo = outTradeNo; this.sendName = sendName; - this.openId = openId; this.totalNum = totalNum; this.wishing = wishing; this.clientIp = clientIp; @@ -146,14 +150,10 @@ public class Redpacket extends MerchantResult { return sendName; } - public String getOpenId() { - return openId; - } - public int getTotalAmount() { return totalAmount; } - + /** * 调用接口获取单位为分,get方法转换为元方便使用 * @@ -204,14 +204,34 @@ public class Redpacket extends MerchantResult { this.consumeMchId = consumeMchId; } + public RedpacketSceneType getSceneType() { + return sceneType; + } + + public void setSceneType(RedpacketSceneType sceneType) { + this.sceneType = sceneType; + } + + public String getRisk() { + return risk; + } + + public void setRisk(String risk) { + this.risk = risk; + } + + public void setRisk(RedpacketRisk risk) { + this.risk = risk.toContent(); + } + @Override public String toString() { - return "Redpacket [msgAppId=" + msgAppId + ", consumeMchId=" - + consumeMchId + ", outTradeNo=" + outTradeNo + ", sendName=" - + sendName + ", openId=" + openId + ", totalAmount=" - + totalAmount + ", totalNum=" + totalNum + ", amtType=" - + amtType + ", wishing=" + wishing + ", clientIp=" + clientIp - + ", actName=" + actName + ", remark=" + remark + ", " - + super.toString() + "]"; + return "Redpacket [outTradeNo=" + outTradeNo + ", sendName=" + sendName + + ", totalAmount=" + totalAmount + ", totalNum=" + totalNum + + ", amtType=" + amtType + ", wishing=" + wishing + + ", clientIp=" + clientIp + ", actName=" + actName + + ", remark=" + remark + ", msgAppId=" + msgAppId + + ", consumeMchId=" + consumeMchId + ", sceneType=" + sceneType + + ", risk=" + risk + ", " + super.toString() + "]"; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/RedpacketRisk.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/RedpacketRisk.java new file mode 100644 index 00000000..809d4738 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/RedpacketRisk.java @@ -0,0 +1,85 @@ +package com.foxinmy.weixin4j.payment.mch; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +import com.foxinmy.weixin4j.util.Consts; +import com.foxinmy.weixin4j.util.DateUtil; +import com.foxinmy.weixin4j.util.MapUtil; + +/** + * 发送红包的活动信息 + * + * @className RedpacketRisk + * @author jinyu(foxinmy@gmail.com) + * @date 2017年1月4日 + * @since JDK 1.6 + * @see + */ +public class RedpacketRisk { + private Map risk; + + public RedpacketRisk() { + this.risk = new HashMap(); + } + + /** + * 用户操作的时间戳 + * + * @return + */ + public RedpacketRisk postTimestamp() { + risk.put("posttime", DateUtil.timestamp2string()); + return this; + } + + /** + * 业务系统账号的手机号,国家代码-手机号。不需要+号 + * + * @param mobile + * @return + */ + public RedpacketRisk mobile(String mobile) { + risk.put("mobile", mobile); + return this; + } + + /** + * 用户操作的客户端版本 + * + * @param clientVersion + * @return + */ + public RedpacketRisk clientVersion(String clientVersion) { + risk.put("clientversion", clientVersion); + return this; + } + + /** + * mac 地址或者设备唯一标识 + * + * @param deviceid + * @return + */ + public RedpacketRisk deviceid(String deviceid) { + risk.put("deviceid", deviceid); + return this; + } + + public Map getRisk() { + return risk; + } + + public String toContent() { + if (risk.isEmpty()) + return null; + try { + return URLEncoder.encode(MapUtil.toJoinString(risk, false, false), + Consts.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + return null; + } + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketSceneType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketSceneType.java new file mode 100644 index 00000000..0da68f68 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketSceneType.java @@ -0,0 +1,44 @@ +package com.foxinmy.weixin4j.type.mch; + +/** + * 发放红包使用场景 + * + * @className RedpacketSceneType + * @author jinyu(foxinmy@gmail.com) + * @date 2017年1月4日 + * @since JDK 1.6 + */ +public enum RedpacketSceneType { + /** + * 商品促销 + */ + PRODUCT_1, + /** + * 抽奖 + */ + PRODUCT_2, + /** + * 虚拟物品兑奖 + */ + PRODUCT_3, + /** + * 企业内部福利 + */ + PRODUCT_4, + /** + * 渠道分润 + */ + PRODUCT_5, + /** + * 保险回馈 + */ + PRODUCT_6, + /** + * 彩票派奖 + */ + PRODUCT_7, + /** + * 税务刮奖 + */ + PRODUCT_8 +} diff --git a/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java index c7c04683..85e3366e 100644 --- a/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java +++ b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java @@ -26,10 +26,10 @@ public class CashTest extends PayTest { @Test public void sendRedpacket() throws WeixinException { - Redpacket redpacket = new Redpacket("HB001", "无忧钱庄", - "oyFLst1bqtuTcxK-ojF8hOGtLQao", 1d, 1, "红包测试", "127.0.0.1", - "快来领取红包吧!", "来就送钱"); - RedpacketSendResult result = PAY.sendRedpack(redpacket); + Redpacket redpacket = new Redpacket("HB001", "无忧钱庄", 1d, 1, "红包测试", + "127.0.0.1", "快来领取红包吧!", "来就送钱"); + RedpacketSendResult result = PAY.sendRedpack(redpacket, + "oyFLst1bqtuTcxK-ojF8hOGtLQao"); Assert.assertEquals(Consts.SUCCESS, result.getReturnCode()); Assert.assertEquals(Consts.SUCCESS, result.getResultCode()); System.err.println(result); diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java index 4439ab14..79af30b5 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java @@ -168,13 +168,19 @@ public class CardApi extends MpApi { * 1.同时支持“openid”、“username”两种字段设置白名单,总数上限为10个。 * 2.设置测试白名单接口为全量设置,即测试名单发生变化时需调用该接口重新传入所有测试人员的ID. * 3.白名单用户领取该卡券时将无视卡券失效状态,请开发者注意。 - * @param openIds the open ids - * @param userNames the user names + * + * @param openIds + * the open ids + * @param userNames + * the user names * @author fengyapeng * @since 2016 -12-20 11:22:57 - * @see 设置测试白名单 + * @see 设置测试白名单 */ - public void setTestWhiteList(List openIds, List userNames) throws WeixinException { + public ApiResult setTestWhiteList(List openIds, + List userNames) throws WeixinException { JSONObject requestObj = new JSONObject(); if (openIds != null && openIds.size() > 0) { requestObj.put("openid", openIds); @@ -185,27 +191,34 @@ public class CardApi extends MpApi { String card_set_test_whitelist_uri = getRequestUri("card_set_test_whitelist_uri"); Token token = tokenManager.getCache(); WeixinResponse response = weixinExecutor.post( - String.format(card_set_test_whitelist_uri, token.getAccessToken()), - requestObj.toJSONString()); + String.format(card_set_test_whitelist_uri, + token.getAccessToken()), requestObj.toJSONString()); + return response.getAsResult(); } /** * 查看获取卡券的审核状态 - * @see 查看卡券详情 + * + * @see 查看卡券详情 * * @author fengyapeng * @since 2016 -12-20 11:48:23 */ public CardStatus queryCardStatus(String cardId) throws WeixinException { JSONObject requestObj = new JSONObject(); - requestObj.put("card_id",cardId); + requestObj.put("card_id", cardId); String card_get_uri = getRequestUri("card_get_uri"); Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor.post(String.format(card_get_uri, token.getAccessToken()),requestObj.toJSONString()); + WeixinResponse response = weixinExecutor.post( + String.format(card_get_uri, token.getAccessToken()), + requestObj.toJSONString()); JSONObject responseAsJson = response.getAsJson(); JSONObject card = responseAsJson.getJSONObject("card"); String cardType = card.getString("card_type"); - JSONObject baseInfo = card.getJSONObject(cardType.toLowerCase()).getJSONObject("base_info"); + JSONObject baseInfo = card.getJSONObject(cardType.toLowerCase()) + .getJSONObject("base_info"); String status = baseInfo.getString("status"); return CardStatus.valueOf(status); } @@ -213,15 +226,19 @@ public class CardApi extends MpApi { /** * 支持更新所有卡券类型的部分通用字段及特殊卡券(会员卡、飞机票、电影票、会议门票)中特定字段的信息。 * - * @param cardId the card id - * @param card the card + * @param cardId + * the card id + * @param card + * the card * @return 是否提交审核,false为修改后不会重新提审,true为修改字段后重新提审,该卡券的状态变为审核中 - * @throws WeixinException the weixin exception + * @throws WeixinException + * the weixin exception * @author fengyapeng * @see * @since 2016 -12-21 15:29:10 */ - public Boolean updateCardCoupon(String cardId, CardCoupon card) throws WeixinException { + public Boolean updateCardCoupon(String cardId, CardCoupon card) + throws WeixinException { JSONObject request = new JSONObject(); request.put("card_id", cardId); CardType cardType = card.getCardType(); @@ -229,84 +246,88 @@ public class CardApi extends MpApi { request.put(cardType.name().toLowerCase(), card); String card_update_uri = getRequestUri("card_update_uri"); Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor.post(String.format(card_update_uri,token.getAccessToken()),JSON.toJSONString(request)); - JSONObject jsonObject= response.getAsJson(); - return jsonObject.getBoolean("send_check"); + WeixinResponse response = weixinExecutor.post( + String.format(card_update_uri, token.getAccessToken()), + JSON.toJSONString(request)); + JSONObject jsonObject = response.getAsJson(); + return jsonObject.getBoolean("send_check"); } - - - - /** - * 激活方式说明 - * 接口激活通常需要开发者开发用户填写资料的网页。通常有两种激活流程: - * 1. 用户必须在填写资料后才能领卡,领卡后开发者调用激活接口为用户激活会员卡; - * 2. 是用户可以先领取会员卡,点击激活会员卡跳转至开发者设置的资料填写页面,填写完成后开发者调用激活接口为用户激活会员卡。 + * 激活方式说明 接口激活通常需要开发者开发用户填写资料的网页。通常有两种激活流程: 1. + * 用户必须在填写资料后才能领卡,领卡后开发者调用激活接口为用户激活会员卡; 2. + * 是用户可以先领取会员卡,点击激活会员卡跳转至开发者设置的资料填写页面,填写完成后开发者调用激活接口为用户激活会员卡。 * - * @see 接口激活 + * @see 接口激活 */ - public ApiResult activateMemberCard(MemberInitInfo memberInitInfo) throws WeixinException { + public ApiResult activateMemberCard(MemberInitInfo memberInitInfo) + throws WeixinException { String card_member_card_activate_uri = getRequestUri("card_member_card_activate_uri"); Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor - .post(String.format(card_member_card_activate_uri, token.getAccessToken()), JSON.toJSONString(memberInitInfo)); + WeixinResponse response = weixinExecutor.post( + String.format(card_member_card_activate_uri, + token.getAccessToken()), + JSON.toJSONString(memberInitInfo)); return response.getAsResult(); } /** - * 设置开卡字段接口 - * 开发者在创建时填入wx_activate字段后, - * 需要调用该接口设置用户激活时需要填写的选项,否则一键开卡设置不生效。 + * 设置开卡字段接口 开发者在创建时填入wx_activate字段后, 需要调用该接口设置用户激活时需要填写的选项,否则一键开卡设置不生效。 * - * @see 一键激活 + * @see 一键激活 */ - public ApiResult setActivateUserForm(MemberUserForm memberUserForm) throws WeixinException { + public ApiResult setActivateUserForm(MemberUserForm memberUserForm) + throws WeixinException { String user_form_uri = getRequestUri("card_member_card_activate_user_form_uri"); Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor - .post(String.format(user_form_uri, token.getAccessToken()), JSON.toJSONString(memberUserForm)); + WeixinResponse response = weixinExecutor.post( + String.format(user_form_uri, token.getAccessToken()), + JSON.toJSONString(memberUserForm)); return response.getAsResult(); } /** * 拉取会员信息接口。 * - * @param cardId the card id - * @param code the code + * @param cardId + * the card id + * @param code + * the code * @author fengyapeng * @since 2016 -12-21 11:28:45 */ - public MemberUserInfo getMemberUserInfo(String cardId, String code) throws WeixinException { + public MemberUserInfo getMemberUserInfo(String cardId, String code) + throws WeixinException { String user_info_uri = getRequestUri("card_member_card_user_info_uri"); Token token = tokenManager.getCache(); JSONObject jsonObject = new JSONObject(); jsonObject.put("card_id", cardId); jsonObject.put("code", code); - WeixinResponse response = weixinExecutor.post(String.format(user_info_uri, token.getAccessToken()), JSON.toJSONString(jsonObject)); + WeixinResponse response = weixinExecutor.post( + String.format(user_info_uri, token.getAccessToken()), + JSON.toJSONString(jsonObject)); return response.getAsObject(new TypeReference() { }); } /** - * 更新会员 - * result_bonus 当前用户积分总额 - * result_balance 当前用户预存总金额 - * openid 用户openid + * 更新会员 result_bonus 当前用户积分总额 result_balance 当前用户预存总金额 openid 用户openid + * * @param updateInfo * @return * @throws WeixinException */ - public JSONObject updateMemberUserInfo(MemberUpdateInfo updateInfo) throws WeixinException { + public JSONObject updateMemberUserInfo(MemberUpdateInfo updateInfo) + throws WeixinException { String card_member_card_update_user_uri = getRequestUri("card_member_card_update_user_uri"); Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor - .post(String.format(card_member_card_update_user_uri, token.getAccessToken()), JSON.toJSONString(updateInfo)); + WeixinResponse response = weixinExecutor.post( + String.format(card_member_card_update_user_uri, + token.getAccessToken()), JSON.toJSONString(updateInfo)); return response.getAsJson(); } - - - - - } From 2777b0500570316369f22b6880013c240181ba5d Mon Sep 17 00:00:00 2001 From: jinyu Date: Mon, 9 Jan 2017 12:57:34 +0800 Subject: [PATCH 3/5] version upgrade to 1.7.4 --- CHANGE.md | 10 +- pom.xml | 2 +- weixin4j-base/pom.xml | 2 +- .../com/foxinmy/weixin4j/api/CashApi.java | 72 +++++------ .../weixin4j/payment/WeixinPayProxy.java | 41 +++---- .../weixin4j/payment/mch/APPPayRequest.java | 4 +- .../weixin4j/payment/mch/Redpacket.java | 54 +++++++-- .../weixin4j/util/WeixinErrorUtil2.java | 112 ------------------ .../foxinmy/weixin4j/base/test/CashTest.java | 6 +- weixin4j-mp/CHANGE.md | 8 +- weixin4j-mp/pom.xml | 2 +- .../weixin4j/mp/WeixinComponentProxy.java | 2 +- .../com/foxinmy/weixin4j/mp/WeixinProxy.java | 2 +- weixin4j-qy/CHANGE.md | 10 +- weixin4j-qy/pom.xml | 2 +- .../com/foxinmy/weixin4j/qy/WeixinProxy.java | 2 +- .../foxinmy/weixin4j/qy/WeixinSuiteProxy.java | 2 +- 17 files changed, 132 insertions(+), 201 deletions(-) delete mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil2.java diff --git a/CHANGE.md b/CHANGE.md index fa52e2f9..d9cc6b08 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -774,4 +774,12 @@ * 2016-12-13 - + version upgrade to 1.7.3 \ No newline at end of file + + version upgrade to 1.7.3 + +* 2017-01-09 + + + 新增批量发红包接口 + + + 新增摇一摇周边接口 + + + version upgrade to 1.7.4 \ No newline at end of file diff --git a/pom.xml b/pom.xml index fec44966..a6a21a45 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.foxinmy weixin4j - 1.7.4-SNAPSHOT + 1.7.4 pom weixin4j https://github.com/foxinmy/weixin4j diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml index 35f59332..1c99922d 100644 --- a/weixin4j-base/pom.xml +++ b/weixin4j-base/pom.xml @@ -5,7 +5,7 @@ com.foxinmy weixin4j - 1.7.4-SNAPSHOT + 1.7.4 weixin4j-base weixin4j-base diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java index 5a09f443..d514ee40 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/CashApi.java @@ -6,7 +6,8 @@ import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; +import java.util.concurrent.CompletionService; +import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -56,28 +57,6 @@ public class CashApi extends MchApi { * * @param redpacket * 红包信息 - * @param openId - * 接受收红包的用户的openid 必填 - * @see #sendRedpacks(Redpacket, String...) - */ - public RedpacketSendResult sendRedpack(Redpacket redpacket, String openId) - throws WeixinException { - try { - return sendRedpacks(redpacket, openId).get(0).get(); - } catch (InterruptedException e) { - throw new WeixinException("send redpack error", e); - } catch (ExecutionException e) { - throw new WeixinException("send redpack error", e); - } - } - - /** - * 发放红包 企业向微信用户个人发现金红包 - * - * @param redpacket - * 红包信息 - * @param openIds - * 接受收红包的用户的openid 必填 * @return 发放结果 * @see com.foxinmy.weixin4j.payment.mch.Redpacket * @see com.foxinmy.weixin4j.payment.mch.RedpacketSendResult @@ -89,8 +68,8 @@ public class CashApi extends MchApi { * 发放裂变红包接口 * @throws WeixinException */ - public List> sendRedpacks(Redpacket redpacket, - String... openIds) { + public RedpacketSendResult sendRedpack(Redpacket redpacket) + throws WeixinException { String appId = redpacket.getAppId(); super.declareMerchant(redpacket); final JSONObject obj = (JSONObject) JSON.toJSON(redpacket); @@ -100,26 +79,39 @@ public class CashApi extends MchApi { obj.put("wxappid", obj.remove("appid")); final String redpack_uri = redpacket.getTotalNum() > 1 ? getRequestUri("groupredpack_send_uri") : getRequestUri("redpack_send_uri"); - int sendLength = openIds.length; + obj.put("sign", weixinSignature.sign(obj)); + String param = XmlStream.map2xml(obj); + WeixinResponse response = getWeixinSSLExecutor().post(redpack_uri, + param); + String text = response.getAsString() + .replaceFirst("", "") + .replaceFirst("", ""); + return XmlStream.fromXML(text, RedpacketSendResult.class); + } + + /** + * 批量发放红包 企业向微信用户个人发现金红包 + * + * @param redpacket + * 多个红包信息 + * @return 发放结果 + * @see #sendRedpacks(Redpacket...) + * @throws WeixinException + */ + public List> sendRedpacks( + Redpacket... redpackets) { ExecutorService sendExecutor = Executors.newFixedThreadPool(Math.max(1, - sendLength / 10)); // 十分之一? + redpackets.length / 10)); // 十分之一? + CompletionService completion = new ExecutorCompletionService( + sendExecutor); List> callSendList = new ArrayList>( - sendLength); - for (final String openId : openIds) { - Future futureSend = sendExecutor + redpackets.length); + for (final Redpacket redpacket : redpackets) { + Future futureSend = completion .submit(new Callable() { @Override public RedpacketSendResult call() throws Exception { - obj.put("re_openid", openId); - obj.put("sign", weixinSignature.sign(obj)); - String param = XmlStream.map2xml(obj); - WeixinResponse response = getWeixinSSLExecutor() - .post(redpack_uri, param); - String text = response.getAsString() - .replaceFirst("", "") - .replaceFirst("", ""); - return XmlStream.fromXML(text, - RedpacketSendResult.class); + return sendRedpack(redpacket); } }); callSendList.add(futureSend); 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 bec415f2..b2b547d4 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 @@ -681,24 +681,6 @@ public class WeixinPayProxy { * * @param redpacket * 红包信息 - * @param openId - * 接受收红包的用户的openid 必填 - * @see com.foxinmy.weixin4j.api.CashApi - * @throws WeixinException - * @see #sendRedpacks(Redpacket, String...) - */ - public RedpacketSendResult sendRedpack(Redpacket redpacket, String openId) - throws WeixinException { - return cashApi.sendRedpack(redpacket, openId); - } - - /** - * 发放红包 企业向微信用户个人发现金红包 - * - * @param redpacket - * 红包信息 - * @param openIds - * 接受收红包的用户的openid 必填 * @return 发放结果 * @see com.foxinmy.weixin4j.api.CashApi * @see com.foxinmy.weixin4j.payment.mch.Redpacket @@ -711,9 +693,24 @@ public class WeixinPayProxy { * 发放裂变红包接口 * @throws WeixinException */ - public List> sendRedpacks(Redpacket redpacket, - String... openIds) { - return cashApi.sendRedpacks(redpacket, openIds); + public RedpacketSendResult sendRedpack(Redpacket redpacket) + throws WeixinException { + return cashApi.sendRedpack(redpacket); + } + + /** + * 批量发放红包 企业向微信用户个人发现金红包 + * + * @param redpacket + * 多个红包信息 + * @return 发放结果 + * @see com.foxinmy.weixin4j.api.CashApi + * @see #sendRedpacks(Redpacket...) + * @throws WeixinException + */ + public List> sendRedpacks( + Redpacket... redpackets) { + return cashApi.sendRedpacks(redpackets); } /** @@ -882,5 +879,5 @@ public class WeixinPayProxy { return customsApi.queryCustomsOrder(idQuery, customsCity); } - public final static String VERSION = "1.7.3"; + public final static String VERSION = "1.7.4"; } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java index 66e1a8a7..eaf311b7 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/APPPayRequest.java @@ -36,7 +36,7 @@ public class APPPayRequest extends AbstractPayRequest { public PayRequest toRequestObject() { PayRequest payRequest = new PayRequest(getPaymentAccount().getId(), "Sign=WXPay"); - payRequest.setPartnerId(getPaymentAccount().getPartnerId()); + payRequest.setPartnerId(getPaymentAccount().getMchId()); payRequest.setPrepayId(getPrePayId()); String sign = DigestUtil.MD5( String.format("%s&key=%s", @@ -55,7 +55,7 @@ public class APPPayRequest extends AbstractPayRequest { content.append(String.format("", payRequest.getAppId())); content.append(String.format("", - getPaymentAccount().getMchId())); + getPaymentAccount().getPartnerId())); content.append(String.format("", payRequest.getPrepayId())); content.append(String.format("", diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java index 47339592..0000003f 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java @@ -33,6 +33,12 @@ public class Redpacket extends MerchantResult { @XmlElement(name = "mch_billno") @JSONField(name = "mch_billno") private String outTradeNo; + /** + * 接受收红包的用户的openid 必填 + */ + @XmlElement(name = "re_openid") + @JSONField(name = "re_openid") + private String openId; /** * 红包发送者名称 必填 */ @@ -113,6 +119,8 @@ public class Redpacket extends MerchantResult { * * @param outTradeNo * 商户侧一天内不可重复的订单号 接口根据商户订单号支持重入 如出现超时可再调用 必填 + * @param openId + * 接受收红包的用户的openid 必填 * @param sendName * 红包发送者名称 必填 * @param totalAmount @@ -128,24 +136,48 @@ public class Redpacket extends MerchantResult { * @param remark * 备注 必填 */ - public Redpacket(String outTradeNo, String sendName, double totalAmount, - int totalNum, String wishing, String clientIp, String actName, - String remark) { + public Redpacket(String outTradeNo, String openId, String sendName, + double totalAmount, int totalNum, String wishing, String clientIp, + String actName, String remark) { this.outTradeNo = outTradeNo; + this.openId = openId; this.sendName = sendName; + this.totalAmount = DateUtil.formatYuan2Fen(totalAmount); this.totalNum = totalNum; this.wishing = wishing; this.clientIp = clientIp; this.actName = actName; this.remark = remark; - this.totalAmount = DateUtil.formatYuan2Fen(totalAmount); this.amtType = totalNum > 1 ? "ALL_RAND" : null; } + /** + * 批量发送时可能需要 + * + * @param outTradeNo + * 订单号 + * @param openId + * 用户ID + * @return 红包实体 + */ + public Redpacket copy(String outTradeNo, String openId) { + Redpacket readpacket = new Redpacket(outTradeNo, openId, sendName, + totalAmount, totalNum, wishing, clientIp, actName, remark); + readpacket.setMsgAppId(msgAppId); + readpacket.setConsumeMchId(consumeMchId); + readpacket.setSceneType(sceneType); + readpacket.setRisk(risk); + return readpacket; + } + public String getOutTradeNo() { return outTradeNo; } + public String getOpenId() { + return openId; + } + public String getSendName() { return sendName; } @@ -226,12 +258,12 @@ public class Redpacket extends MerchantResult { @Override public String toString() { - return "Redpacket [outTradeNo=" + outTradeNo + ", sendName=" + sendName - + ", totalAmount=" + totalAmount + ", totalNum=" + totalNum - + ", amtType=" + amtType + ", wishing=" + wishing - + ", clientIp=" + clientIp + ", actName=" + actName - + ", remark=" + remark + ", msgAppId=" + msgAppId - + ", consumeMchId=" + consumeMchId + ", sceneType=" + sceneType - + ", risk=" + risk + ", " + super.toString() + "]"; + return "Redpacket [outTradeNo=" + outTradeNo + ", openId=" + openId + + ", sendName=" + sendName + ", totalAmount=" + totalAmount + + ", totalNum=" + totalNum + ", amtType=" + amtType + + ", wishing=" + wishing + ", clientIp=" + clientIp + + ", actName=" + actName + ", remark=" + remark + ", msgAppId=" + + msgAppId + ", consumeMchId=" + consumeMchId + ", sceneType=" + + sceneType + ", risk=" + risk + ", " + super.toString() + "]"; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil2.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil2.java deleted file mode 100644 index 3f0634ba..00000000 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil2.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.foxinmy.weixin4j.util; - -import com.foxinmy.weixin4j.http.weixin.WeixinResponse; - -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; -import org.xml.sax.helpers.XMLReaderFactory; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 接口调用错误获取 - * - * @author fengyapeng - * @className WeixinErrorUtil2 - * @date - * @see - * @since JDK 1.6 - */ -public final class WeixinErrorUtil2 { - - private static byte[] errorXmlByteArray; - private final static Map errorCacheMap; - - static { - errorCacheMap = new ConcurrentHashMap(); - try { - errorXmlByteArray = IOUtil.toByteArray(WeixinResponse.class.getResourceAsStream("error.xml")); - XMLReader xmlReader = XMLReaderFactory.createXMLReader(); - ContentHandler textHandler = new ErrorTextHandler(errorCacheMap); - xmlReader.setContentHandler(textHandler); - xmlReader.parse(new InputSource(new ByteArrayInputStream(errorXmlByteArray))); - } catch (IOException e) { - ; - } catch (SAXException e) { - - } - } - - private static class ErrorTextHandler extends DefaultHandler { - - private Map errorCacheMap; - - public ErrorTextHandler(Map errorCacheMap) { - this.errorCacheMap = errorCacheMap; - } - - private String code; - private String text; - private boolean codeElement; - private boolean textElement; - private int isPair = 0; - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - codeElement = qName.equalsIgnoreCase("code"); - textElement = qName.equalsIgnoreCase("text"); - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - } - - @Override - public void characters(char[] ch, int start, int length) throws SAXException { - String _text = new String(ch, start, length); - if (codeElement) { - isPair++; - code = _text; - codeElement = false; - } - if (textElement) { - isPair++; - text = _text; - textElement = false; - } - if (isPair == 2) { - // 配对成功 - errorCacheMap.put(code, text); - isPair = 0; - code = null; - text = null; - } - } - } - - public static String getText(String code) throws RuntimeException { - return errorCacheMap.get(code); - } - - public static String getText(String code, String defaultMsg) throws RuntimeException { - String text = getText(code); - if (StringUtil.isNotBlank(text)) { - return text; - } - return defaultMsg; - } - - - public static void main(String[] args) { - System.out.println(getText("40001")); - System.out.println(getText("30002")); - System.out.println(getText("1234")); - } -} diff --git a/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java index 85e3366e..29b106d8 100644 --- a/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java +++ b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/CashTest.java @@ -26,10 +26,10 @@ public class CashTest extends PayTest { @Test public void sendRedpacket() throws WeixinException { - Redpacket redpacket = new Redpacket("HB001", "无忧钱庄", 1d, 1, "红包测试", + Redpacket redpacket = new Redpacket("HB001", + "oyFLst1bqtuTcxK-ojF8hOGtLQao", "无忧钱庄", 1d, 1, "红包测试", "127.0.0.1", "快来领取红包吧!", "来就送钱"); - RedpacketSendResult result = PAY.sendRedpack(redpacket, - "oyFLst1bqtuTcxK-ojF8hOGtLQao"); + RedpacketSendResult result = PAY.sendRedpack(redpacket); Assert.assertEquals(Consts.SUCCESS, result.getReturnCode()); Assert.assertEquals(Consts.SUCCESS, result.getResultCode()); System.err.println(result); diff --git a/weixin4j-mp/CHANGE.md b/weixin4j-mp/CHANGE.md index 2ededc69..d69bd491 100644 --- a/weixin4j-mp/CHANGE.md +++ b/weixin4j-mp/CHANGE.md @@ -260,4 +260,10 @@ * 2016-12-13 - + version upgrade to 1.7.3 \ No newline at end of file + + version upgrade to 1.7.3 + +* 2017-01-09 + + + 新增批量发红包接口 + + + version upgrade to 1.7.4 \ No newline at end of file diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml index ff30b420..e344f8dd 100644 --- a/weixin4j-mp/pom.xml +++ b/weixin4j-mp/pom.xml @@ -5,7 +5,7 @@ com.foxinmy weixin4j - 1.7.4-SNAPSHOT + 1.7.4 weixin4j-mp weixin4j-mp diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinComponentProxy.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinComponentProxy.java index 8f66eec2..bc5b1387 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinComponentProxy.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinComponentProxy.java @@ -225,5 +225,5 @@ public class WeixinComponentProxy { authAppId), component(componentId).getTokenManager()); } - public final static String VERSION = "1.7.3"; + public final static String VERSION = "1.7.4"; } 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 f6e586ef..0fbae03b 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 @@ -2063,5 +2063,5 @@ public class WeixinProxy { return cardApi.createCardQR(expireSeconds, cardQRs); } - public final static String VERSION = "1.7.3"; + public final static String VERSION = "1.7.4"; } diff --git a/weixin4j-qy/CHANGE.md b/weixin4j-qy/CHANGE.md index 96338603..9ed99efe 100644 --- a/weixin4j-qy/CHANGE.md +++ b/weixin4j-qy/CHANGE.md @@ -199,4 +199,12 @@ * 2016-12-13 - + version upgrade to 1.7.3 \ No newline at end of file + + version upgrade to 1.7.3 + +* 2017-01-09 + + + 新增批量发红包接口 + + + 新增摇一摇周边接口 + + + version upgrade to 1.7.4 \ No newline at end of file diff --git a/weixin4j-qy/pom.xml b/weixin4j-qy/pom.xml index b10f053e..af2ffa9d 100644 --- a/weixin4j-qy/pom.xml +++ b/weixin4j-qy/pom.xml @@ -5,7 +5,7 @@ com.foxinmy weixin4j - 1.7.4-SNAPSHOT + 1.7.4 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 2748d886..d6de2232 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 @@ -1433,5 +1433,5 @@ public class WeixinProxy { return chatApi.sendChatMessage(message); } - public final static String VERSION = "1.7.3"; + public final static String VERSION = "1.7.4"; } 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 017cd8cd..819bc263 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 @@ -285,5 +285,5 @@ public class WeixinSuiteProxy { suite(suiteId).getTokenManager()); } - public final static String VERSION = "1.7.3"; + public final static String VERSION = "1.7.4"; } From 4115278b27d0b99dfe127504a72ede040f06e0bb Mon Sep 17 00:00:00 2001 From: jinyu Date: Mon, 16 Jan 2017 21:50:56 +0800 Subject: [PATCH 4/5] authsucc --- .../foxinmy/weixin4j/http/SimpleHttpClient.java | 2 +- .../http/weixin/WeixinRequestExecutor.java | 4 ++-- .../java/com/foxinmy/weixin4j/model/Button.java | 2 +- .../com/foxinmy/weixin4j/qy/WeixinProxy.java | 16 ++++++++++++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/SimpleHttpClient.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/SimpleHttpClient.java index f32e821c..27005fff 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/SimpleHttpClient.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/SimpleHttpClient.java @@ -28,7 +28,7 @@ import com.foxinmy.weixin4j.util.StringUtil; * @since JDK 1.6 * @see */ -public class SimpleHttpClient extends AbstractHttpClient implements HttpClient { +public class SimpleHttpClient extends AbstractHttpClient { private final HttpParams params; diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java index f24cf664..6f3795ef 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java @@ -108,9 +108,9 @@ public class WeixinRequestExecutor { public WeixinResponse get(String url, URLParameter... parameters) throws WeixinException { // always contain the question mark - StringBuilder buf = new StringBuilder(url).append("&"); + StringBuilder buf = new StringBuilder(url); if (parameters != null && parameters.length > 0) { - buf.append(FormUrlEntity.formatParameters(Arrays.asList(parameters))); + buf.append("&").append(FormUrlEntity.formatParameters(Arrays.asList(parameters))); } HttpRequest request = new HttpRequest(HttpMethod.GET, buf.toString()); return doRequest(request); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Button.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Button.java index 3666d9e8..d6620c87 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Button.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Button.java @@ -72,7 +72,7 @@ public class Button implements Serializable { */ public Button(String name, Button... subButtons) { this.name = name; - this.subs = Arrays.asList(subButtons); + this.subs = new ArrayList