executor, String uri, E data) throws WxErrorException {
if (uri.contains("access_token=")) {
throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri);
}
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 81bf0008..a135b6dd 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
weixin-java-parent
- 2.8.8.BETA
+ 2.9.0
weixin-java-mp
WeiXin Java Tools - MP
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInRedisConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInRedisConfigStorage.java
index 3254972c..6974221c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInRedisConfigStorage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInRedisConfigStorage.java
@@ -5,7 +5,10 @@ import redis.clients.jedis.JedisPool;
/**
* 基于Redis的微信配置provider
- *
+ *
+ * 使用说明:本实现仅供参考,并不完整,
+ * 比如为减少项目依赖,未加入redis分布式锁的实现,如有需要请自行实现。
+ *
* @author nickwong
*/
@SuppressWarnings("hiding")
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
index 914c902d..0dd5a66b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
@@ -5,8 +5,11 @@ import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
-import me.chanjar.weixin.mp.bean.*;
-import me.chanjar.weixin.mp.bean.result.*;
+import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
+import me.chanjar.weixin.mp.bean.result.WxMpCurrentAutoReplyInfo;
+import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
+import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
/**
* 微信API的Service
@@ -62,6 +65,11 @@ public interface WxMpService {
*/
String GET_CURRENT_AUTOREPLY_INFO_URL = "https://api.weixin.qq.com/cgi-bin/get_current_autoreply_info";
+ /**
+ * 公众号调用或第三方平台帮公众号调用对公众号的所有api调用(包括第三方帮其调用)次数进行清零
+ */
+ String CLEAR_QUOTA_URL = "https://api.weixin.qq.com/cgi-bin/clear_quota";
+
/**
*
* 验证消息的确来自微信服务器
@@ -219,6 +227,18 @@ public interface WxMpService {
*/
WxMpCurrentAutoReplyInfo getCurrentAutoReplyInfo() throws WxErrorException;
+ /**
+ *
+ * 公众号调用或第三方平台帮公众号调用对公众号的所有api调用(包括第三方帮其调用)次数进行清零:
+ * HTTP调用:https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=ACCESS_TOKEN
+ * 接口文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433744592
+ *
+ *
+ *
+ * @param appid 公众号的APPID
+ */
+ void clearQuota(String appid) throws WxErrorException;
+
/**
* 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求
*/
@@ -376,6 +396,7 @@ public interface WxMpService {
/**
* 返回群发消息相关接口方法的实现类对象,以方便调用其各个接口
+ *
* @return WxMpMassMessageService
*/
WxMpMassMessageService getMassMessageService();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceAbstractImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceAbstractImpl.java
index 420cb252..d81018da 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceAbstractImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceAbstractImpl.java
@@ -207,6 +207,13 @@ public abstract class WxMpServiceAbstractImpl implements WxMpService, Requ
return WxMpCurrentAutoReplyInfo.fromJson(this.get(GET_CURRENT_AUTOREPLY_INFO_URL, null));
}
+ @Override
+ public void clearQuota(String appid) throws WxErrorException {
+ JsonObject o = new JsonObject();
+ o.addProperty("appid", appid);
+ this.post(CLEAR_QUOTA_URL, o.toString());
+ }
+
@Override
public String get(String url, String queryParam) throws WxErrorException {
return execute(SimpleGetRequestExecutor.create(this), url, queryParam);
@@ -252,7 +259,7 @@ public abstract class WxMpServiceAbstractImpl implements WxMpService, Requ
throw new RuntimeException("微信服务端异常,超出重试次数");
}
- public synchronized T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException {
+ public T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException {
if (uri.contains("access_token=")) {
throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri);
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java
index fe8dc580..baab51b5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java
@@ -1,5 +1,6 @@
package me.chanjar.weixin.mp.util.http.apache;
+import com.google.common.collect.ImmutableMap;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -43,9 +44,7 @@ public class ApacheMaterialNewsInfoRequestExecutor
httpPost.setConfig(config);
}
- Map params = new HashMap<>();
- params.put("media_id", materialId);
- httpPost.setEntity(new StringEntity(WxGsonBuilder.create().toJson(params)));
+ httpPost.setEntity(new StringEntity(WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId))));
try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
this.logger.debug("响应原始数据:{}", responseContent);
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/jodd/JoddMaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/jodd/JoddMaterialNewsInfoRequestExecutor.java
index 181a6407..2bce6ee4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/jodd/JoddMaterialNewsInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/jodd/JoddMaterialNewsInfoRequestExecutor.java
@@ -1,5 +1,6 @@
package me.chanjar.weixin.mp.util.http.jodd;
+import com.google.common.collect.ImmutableMap;
import jodd.http.HttpConnectionProvider;
import jodd.http.HttpRequest;
import jodd.http.HttpResponse;
@@ -9,6 +10,7 @@ import jodd.util.StringPool;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews;
import me.chanjar.weixin.mp.util.http.MaterialNewsInfoRequestExecutor;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
@@ -28,13 +30,13 @@ public class JoddMaterialNewsInfoRequestExecutor extends MaterialNewsInfoRequest
@Override
public WxMpMaterialNews execute(String uri, String materialId) throws WxErrorException, IOException {
- HttpRequest request = HttpRequest.post(uri);
if (requestHttp.getRequestHttpProxy() != null) {
requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
}
- request.withConnectionProvider(requestHttp.getRequestHttpClient());
- request.query("media_id", materialId);
+ HttpRequest request = HttpRequest.post(uri)
+ .withConnectionProvider(requestHttp.getRequestHttpClient())
+ .body(WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId)));
HttpResponse response = request.send();
response.charset(StringPool.UTF_8);
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/okhttp/OkhttpMaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/okhttp/OkhttpMaterialNewsInfoRequestExecutor.java
index 3f46ab78..e8bd9bee 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/okhttp/OkhttpMaterialNewsInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/okhttp/OkhttpMaterialNewsInfoRequestExecutor.java
@@ -1,9 +1,11 @@
package me.chanjar.weixin.mp.util.http.okhttp;
+import com.google.common.collect.ImmutableMap;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews;
import me.chanjar.weixin.mp.util.http.MaterialNewsInfoRequestExecutor;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
@@ -28,7 +30,8 @@ public class OkhttpMaterialNewsInfoRequestExecutor extends MaterialNewsInfoReque
//得到httpClient
OkHttpClient client = requestHttp.getRequestHttpClient();
- RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build();
+ RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
+ WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId)));
Request request = new Request.Builder().url(uri).post(requestBody).build();
Response response = client.newCall(request).execute();
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
index 9cb9e1d1..89060a6e 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
@@ -15,7 +15,6 @@ import static org.testng.Assert.*;
@Test
@Guice(modules = ApiTestModule.class)
public class WxMpServiceImplTest {
-
@Inject
private WxMpService wxService;
@@ -28,88 +27,8 @@ public class WxMpServiceImplTest {
}
@Test
- public void testCheckSignature() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testGetAccessToken() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testGetAccessTokenBoolean() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testGetJsapiTicket() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testGetJsapiTicketBoolean() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testCreateJsapiSignature() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testCustomMessageSend() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testMassNewsUpload() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testMassVideoUpload() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testMassGroupMessageSend() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testMassOpenIdsMessageSend() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testMassMessagePreview() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testShortUrl() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testSetIndustry() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testGetIndustry() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testSemanticQuery() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testOauth2buildAuthorizationUrl() {
- Assert.fail("Not yet implemented");
+ public void testClearQuota() throws WxErrorException {
+ this.wxService.clearQuota(wxService.getWxMpConfigStorage().getAppId());
}
@Test
@@ -121,44 +40,4 @@ public class WxMpServiceImplTest {
System.out.println(qrConnectUrl);
}
- @Test
- public void testOauth2getAccessToken() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testOauth2refreshAccessToken() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testOauth2getUserInfo() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testOauth2validateAccessToken() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testGetCallbackIP() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testGet() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testPost() {
- Assert.fail("Not yet implemented");
- }
-
- @Test
- public void testExecute() {
- Assert.fail("Not yet implemented");
- }
-
}
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index b52c5781..5dfd4308 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -8,7 +8,7 @@
com.github.binarywang
weixin-java-parent
- 2.8.8.BETA
+ 2.9.0
weixin-java-open
WeiXin Java Tools - Open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 47b3f4da..f245bff2 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
weixin-java-parent
com.github.binarywang
- 2.8.8.BETA
+ 2.9.0
4.0.0
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
index ad9aceb4..f7d91383 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
@@ -21,7 +21,7 @@ import lombok.NoArgsConstructor;
public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:设备号
+ * 字段名:设备号.
* 变量名:device_info
* 是否必填:否
* 示例值:123456sb
@@ -34,7 +34,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:批次ID
+ * 字段名:批次ID.
* 变量名:coupon_stock_id
* 是否必填:是
* 示例值:1567
@@ -47,7 +47,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:代金券id
+ * 字段名:代金券id.
* 变量名:coupon_id
* 是否必填:是
* 示例值:4242
@@ -60,7 +60,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:代金券面额
+ * 字段名:代金券面额.
* 变量名:coupon_value
* 是否必填:是
* 示例值:4
@@ -73,7 +73,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:代金券使用门槛
+ * 字段名:代金券使用门槛.
* 变量名:coupon_mininum
* 是否必填:是
* 示例值:10
@@ -86,7 +86,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:代金券名称
+ * 字段名:代金券名称.
* 变量名:coupon_name
* 是否必填:是
* 示例值:测试代金券
@@ -99,20 +99,20 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:代金券状态
+ * 字段名:代金券状态.
* 变量名:coupon_state
* 是否必填:是
* 示例值:SENDED
- * 类型:int
+ * 类型:String
* 说明:代金券状态:SENDED-可用,USED-已实扣,EXPIRED-已过期
*
*/
@XStreamAlias("coupon_state")
- private Integer couponState;
+ private String couponState;
/**
*
- * 字段名:代金券描述
+ * 字段名:代金券描述.
* 变量名:coupon_desc
* 是否必填:是
* 示例值:微信支付-代金券
@@ -125,7 +125,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:实际优惠金额
+ * 字段名:实际优惠金额.
* 变量名:coupon_use_value
* 是否必填:是
* 示例值:0
@@ -138,7 +138,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:优惠剩余可用额
+ * 字段名:优惠剩余可用额.
* 变量名:coupon_remain_value
* 是否必填:是
* 示例值:4
@@ -151,7 +151,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:生效开始时间
+ * 字段名:生效开始时间.
* 变量名:begin_time
* 是否必填:是
* 示例值:1943787483
@@ -164,7 +164,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:生效结束时间
+ * 字段名:生效结束时间.
* 变量名:end_time
* 是否必填:是
* 示例值:1943787484
@@ -177,7 +177,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:发放时间
+ * 字段名:发放时间.
* 变量名:send_time
* 是否必填:是
* 示例值:1943787420
@@ -190,7 +190,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:消耗方商户id
+ * 字段名:消耗方商户id.
* 变量名:consumer_mch_id
* 是否必填:否
* 示例值:10000098
@@ -203,7 +203,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:发放来源
+ * 字段名:发放来源.
* 变量名:send_source
* 是否必填:是
* 示例值:FULL_SEND
@@ -216,7 +216,7 @@ public class WxPayCouponInfoQueryResult extends WxPayBaseResult {
/**
*
- * 字段名:是否允许部分使用
+ * 字段名:是否允许部分使用.
* 变量名:is_partial_use
* 是否必填:否
* 示例值:1
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java
index 1a3b85e8..43bc51b4 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java
@@ -14,13 +14,6 @@ import java.util.Arrays;
/**
*
* 微信支付-申请退款请求参数
- * 注释中各行每个字段描述对应如下:
- *
字段名
- * 变量名
- * 是否必填
- * 类型
- * 示例值
- * 描述
* Created by Binary Wang on 2016-10-08.
*
*
@@ -34,53 +27,52 @@ import java.util.Arrays;
@XStreamAlias("xml")
public class WxPayRefundRequest extends WxPayBaseRequest {
private static final String[] REFUND_ACCOUNT = new String[]{
- RefundAccountSource.RECHARGE_FUNDS,
- RefundAccountSource.UNSETTLED_FUNDS
- };
+ RefundAccountSource.RECHARGE_FUNDS, RefundAccountSource.UNSETTLED_FUNDS};
+
/**
*
- * 设备号
- * device_info
- * 否
- * String(32)
- * 13467007045764
- * 终端设备号
+ * 字段名:设备号.
+ * 变量名:device_info
+ * 是否必填:否
+ * 类型:String(32)
+ * 示例值:13467007045764
+ * 描述:终端设备号
*
*/
@XStreamAlias("device_info")
private String deviceInfo;
/**
*
- * 微信订单号
- * transaction_id
- * 跟out_trade_no二选一
- * String(28)
- * 1217752501201400000000000000
- * 微信生成的订单号,在支付通知中有返回
+ * 字段名:微信订单号.
+ * 变量名:transaction_id
+ * 是否必填:跟out_trade_no二选一
+ * 类型:String(28)
+ * 示例值:1217752501201400000000000000
+ * 描述:微信生成的订单号,在支付通知中有返回
*
*/
@XStreamAlias("transaction_id")
private String transactionId;
/**
*
- * 商户订单号
- * out_trade_no
- * 跟transaction_id二选一
- * String(32)
- * 1217752501201400000000000000
- * 商户侧传给微信的订单号
+ * 字段名:商户订单号.
+ * 变量名:out_trade_no
+ * 是否必填:跟transaction_id二选一
+ * 类型:String(32)
+ * 示例值:1217752501201400000000000000
+ * 描述:商户侧传给微信的订单号
*
*/
@XStreamAlias("out_trade_no")
private String outTradeNo;
/**
*
- * 商户退款单号
- * out_refund_no
- * 是
- * String(32)
- * 1217752501201400000000000000
- * 商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔
+ * 字段名:商户退款单号.
+ * 变量名:out_refund_no
+ * 是否必填:是
+ * 类型:String(32)
+ * 示例值:1217752501201400000000000000
+ * 描述:商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔
*
*/
@Required
@@ -88,12 +80,12 @@ public class WxPayRefundRequest extends WxPayBaseRequest {
private String outRefundNo;
/**
*
- * 订单金额
- * total_fee
- * 是
- * Int
- * 100
- * 订单总金额,单位为分,只能为整数,详见支付金额
+ * 字段名:订单金额.
+ * 变量名:total_fee
+ * 是否必填:是
+ * 类型:Int
+ * 示例值:100
+ * 描述:订单总金额,单位为分,只能为整数,详见支付金额
*
*/
@Required
@@ -101,12 +93,12 @@ public class WxPayRefundRequest extends WxPayBaseRequest {
private Integer totalFee;
/**
*
- * 退款金额
- * refund_fee
- * 是
- * Int
- * 100
- * 退款总金额,订单总金额,单位为分,只能为整数,详见支付金额
+ * 字段名:退款金额.
+ * 变量名:refund_fee
+ * 是否必填:是
+ * 类型:Int
+ * 示例值:100
+ * 描述:退款总金额,订单总金额,单位为分,只能为整数,详见支付金额
*
*/
@Required
@@ -114,24 +106,24 @@ public class WxPayRefundRequest extends WxPayBaseRequest {
private Integer refundFee;
/**
*
- * 货币种类
- * refund_fee_type
- * 否
- * String(8)
- * CNY
- * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
+ * 字段名:货币种类.
+ * 变量名:refund_fee_type
+ * 是否必填:否
+ * 类型:String(8)
+ * 示例值:CNY
+ * 描述:货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
*
*/
@XStreamAlias("refund_fee_type")
private String refundFeeType;
/**
*
- * 操作员
- * op_user_id
- * 是
- * String(32)
- * 1900000109
- * 操作员帐号, 默认为商户号
+ * 字段名:操作员.
+ * 变量名:op_user_id
+ * 是否必填:是
+ * 类型:String(32)
+ * 示例值:1900000109
+ * 描述:操作员帐号, 默认为商户号
*
*/
//@Required
@@ -139,12 +131,12 @@ public class WxPayRefundRequest extends WxPayBaseRequest {
private String opUserId;
/**
*
- * 退款资金来源
- * refund_account
- * 否
- * String(30)
- * REFUND_SOURCE_RECHARGE_FUNDS
- * 仅针对老资金流商户使用,
+ * 字段名:退款资金来源.
+ * 变量名:refund_account
+ * 是否必填:否
+ * 类型:String(30)
+ * 示例值:REFUND_SOURCE_RECHARGE_FUNDS
+ * 描述:仅针对老资金流商户使用,
*
REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款),
* REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
*
@@ -153,12 +145,12 @@ public class WxPayRefundRequest extends WxPayBaseRequest {
private String refundAccount;
/**
*
- * 退款原因
- * refund_account
- * 否
- * String(80)
- * 商品已售完
- * 若商户传入,会在下发给用户的退款消息中体现退款原因
+ * 字段名:退款原因.
+ * 变量名:refund_account
+ * 是否必填:否
+ * 类型:String(80)
+ * 示例值:商品已售完
+ * 描述:若商户传入,会在下发给用户的退款消息中体现退款原因
*
*/
@XStreamAlias("refund_desc")
@@ -177,8 +169,8 @@ public class WxPayRefundRequest extends WxPayBaseRequest {
protected void checkConstraints() throws WxPayException {
if (StringUtils.isNotBlank(this.getRefundAccount())) {
if (!ArrayUtils.contains(REFUND_ACCOUNT, this.getRefundAccount())) {
- throw new WxPayException(String.format("refund_account目前必须为%s其中之一,实际值:%s",
- Arrays.toString(REFUND_ACCOUNT), this.getRefundAccount()));
+ throw new WxPayException(
+ String.format("refund_account目前必须为%s其中之一,实际值:%s", Arrays.toString(REFUND_ACCOUNT), this.getRefundAccount()));
}
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
index f9733601..2fad8f2e 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
@@ -8,6 +8,7 @@ import java.util.List;
/**
*
+ * 微信支付-退款查询返回结果
* Created by Binary Wang on 2016-11-24.
*
*
@@ -20,96 +21,104 @@ import java.util.List;
public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 设备号
- * device_info
- * 否
- * String(32)
- * 013467007045764
- * 终端设备号
+ * 字段名:设备号.
+ * 变量名:device_info
+ * 是否必填:否
+ * 类型:String(32)
+ * 示例值:013467007045764
+ * 描述:终端设备号
+ *
*/
@XStreamAlias("device_info")
private String deviceInfo;
/**
*
- * 微信订单号
- * transaction_id
- * 是
- * String(32)
- * 1217752501201407033233368018
- * 微信订单号
+ * 字段名:微信订单号.
+ * 变量名:transaction_id
+ * 是否必填:是
+ * 类型:String(32)
+ * 示例值:1217752501201407033233368018
+ * 描述:微信订单号
+ *
*/
@XStreamAlias("transaction_id")
private String transactionId;
/**
*
- * 商户订单号
- * out_trade_no
- * 是
- * String(32)
- * 1217752501201407033233368018
- * 商户系统内部的订单号
+ * 字段名:商户订单号.
+ * 变量名:out_trade_no
+ * 是否必填:是
+ * 类型:String(32)
+ * 示例值:1217752501201407033233368018
+ * 描述:商户系统内部的订单号
+ *
*/
@XStreamAlias("out_trade_no")
private String outTradeNo;
/**
*
- * 订单金额
- * total_fee
- * 是
- * Int
- * 100
- * 订单总金额,单位为分,只能为整数,详见支付金额
+ * 字段名:订单金额.
+ * 变量名:total_fee
+ * 是否必填:是
+ * 类型:Int
+ * 示例值:100
+ * 描述:订单总金额,单位为分,只能为整数,详见支付金额
+ *
*/
@XStreamAlias("total_fee")
private Integer totalFee;
/**
*
- * 应结订单金额
- * settlement_total_fee
- * 否
- * Int
- * 100
- * 应结订单金额=订单金额-非充值代金券金额,应结订单金额<=订单金额。
+ * 字段名:应结订单金额.
+ * 变量名:settlement_total_fee
+ * 是否必填:否
+ * 类型:Int
+ * 示例值:100
+ * 描述:应结订单金额=订单金额-非充值代金券金额,应结订单金额<=订单金额。
+ *
*/
@XStreamAlias("settlement_total_fee")
private Integer settlementTotalFee;
/**
*
- * 货币种类
- * fee_type
- * 否
- * String(8)
- * CNY
- * 订单金额货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
+ * 字段名:货币种类.
+ * 变量名:fee_type
+ * 是否必填:否
+ * 类型:String(8)
+ * 示例值:CNY
+ * 描述:订单金额货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
+ *
*/
@XStreamAlias("fee_type")
private String feeType;
/**
*
- * 现金支付金额
- * cash_fee
- * 是
- * Int
- * 100
- * 现金支付金额,单位为分,只能为整数,详见支付金额
+ * 字段名:现金支付金额.
+ * 变量名:cash_fee
+ * 是否必填:是
+ * 类型:Int
+ * 示例值:100
+ * 描述:现金支付金额,单位为分,只能为整数,详见支付金额
+ *
*/
@XStreamAlias("cash_fee")
private Integer cashFee;
/**
*
- * 退款笔数
- * refund_count
- * 是
- * Int
- * 1
- * 退款记录数
+ * 字段名:退款笔数.
+ * 变量名:refund_count
+ * 是否必填:是
+ * 类型:Int
+ * 示例值:1
+ * 描述:退款记录数
+ *
*/
@XStreamAlias("refund_count")
private Integer refundCount;
@@ -117,7 +126,7 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
private List refundRecords;
/**
- * 组装生成退款记录属性的内容
+ * 组装生成退款记录属性的内容.
*/
public void composeRefundRecords() {
if (this.refundCount != null && this.refundCount > 0) {
@@ -137,6 +146,7 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
refundRecord.setCouponRefundCount(this.getXmlValueAsInt("xml/coupon_refund_count_" + i));
refundRecord.setRefundStatus(this.getXmlValue("xml/refund_status_" + i));
refundRecord.setRefundRecvAccount(this.getXmlValue("xml/refund_recv_accout_" + i));
+ refundRecord.setRefundSuccessTime(this.getXmlValue("xml/refund_success_time_" + i));
if (refundRecord.getCouponRefundCount() == null || refundRecord.getCouponRefundCount() == 0) {
continue;
@@ -151,6 +161,8 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
)
);
}
+
+ refundRecord.setRefundCoupons(coupons);
}
}
@@ -163,12 +175,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
public static class RefundRecord {
/**
*
- * 商户退款单号
- * out_refund_no_$n
- * 是
- * String(32)
- * 1217752501201407033233368018
- * 商户退款单号
+ * 字段名:商户退款单号.
+ * 变量名:out_refund_no_$n
+ * 是否必填:是
+ * 类型:String(32)
+ * 示例值:1217752501201407033233368018
+ * 描述:商户退款单号
*
*/
@XStreamAlias("out_refund_no")
@@ -176,12 +188,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 微信退款单号
- * refund_id_$n
- * 是
- * String(28)
- * 1217752501201407033233368018
- * 微信退款单号
+ * 字段名:微信退款单号.
+ * 变量名:refund_id_$n
+ * 是否必填:是
+ * 类型:String(28)
+ * 示例值:1217752501201407033233368018
+ * 描述:微信退款单号
*
*/
@XStreamAlias("refund_id")
@@ -189,12 +201,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 退款渠道
- * refund_channel_$n
- * 否
- * String(16)
- * ORIGINAL
- * ORIGINAL—原路退款 BALANCE—退回到余额
+ * 字段名:退款渠道.
+ * 变量名:refund_channel_$n
+ * 是否必填:否
+ * 类型:String(16)
+ * 示例值:ORIGINAL
+ * 描述:ORIGINAL—原路退款 BALANCE—退回到余额
*
*/
@XStreamAlias("refund_channel")
@@ -202,12 +214,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 申请退款金额
- * refund_fee_$n
- * 是
- * Int
- * 100
- * 退款总金额,单位为分,可以做部分退款
+ * 字段名:申请退款金额.
+ * 变量名:refund_fee_$n
+ * 是否必填:是
+ * 类型:Int
+ * 示例值:100
+ * 描述:退款总金额,单位为分,可以做部分退款
*
*/
@XStreamAlias("refund_fee")
@@ -215,12 +227,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 退款金额
- * settlement_refund_fee_$n
- * 否
- * Int
- * 100
- * 退款金额=申请退款金额-非充值代金券退款金额,退款金额<=申请退款金额
+ * 字段名:退款金额.
+ * 变量名:settlement_refund_fee_$n
+ * 是否必填:否
+ * 类型:Int
+ * 示例值:100
+ * 描述:退款金额=申请退款金额-非充值代金券退款金额,退款金额<=申请退款金额
*
*/
@XStreamAlias("settlement_refund_fee")
@@ -228,12 +240,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 退款资金来源
- * refund_account
- * 否
- * String(30)
- * REFUND_SOURCE_RECHARGE_FUNDS
- * REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款/基本账户, REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款
+ * 字段名:退款资金来源.
+ * 变量名:refund_account
+ * 是否必填:否
+ * 类型:String(30)
+ * 示例值:REFUND_SOURCE_RECHARGE_FUNDS
+ * 描述:REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款/基本账户, REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款
*
*/
@XStreamAlias("refund_account")
@@ -241,12 +253,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 代金券类型
- * coupon_type_$n
- * 否
- * Int
- * CASH
- * CASH--充值代金券 , NO_CASH---非充值代金券。订单使用代金券时有返回(取值:CASH、NO_CASH)。$n为下标,从0开始编号,举例:coupon_type_$0
+ * 字段名:代金券类型.
+ * 变量名:coupon_type_$n
+ * 是否必填:否
+ * 类型:Int
+ * 示例值:CASH
+ * 描述:CASH--充值代金券 , NO_CASH---非充值代金券。订单使用代金券时有返回(取值:CASH、NO_CASH)。$n为下标,从0开始编号,举例:coupon_type_$0
*
*/
@XStreamAlias("coupon_type")
@@ -254,12 +266,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 代金券退款金额
- * coupon_refund_fee_$n
- * 否
- * Int
- * 100
- * 代金券退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠
+ * 字段名:代金券退款金额.
+ * 变量名:coupon_refund_fee_$n
+ * 是否必填:否
+ * 类型:Int
+ * 示例值:100
+ * 描述:代金券退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠
*
*/
@XStreamAlias("coupon_refund_fee")
@@ -267,12 +279,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 退款代金券使用数量
- * coupon_refund_count_$n
- * 否
- * Int
- * 1
- * 退款代金券使用数量 ,$n为下标,从0开始编号
+ * 字段名:退款代金券使用数量.
+ * 变量名:coupon_refund_count_$n
+ * 是否必填:否
+ * 类型:Int
+ * 示例值:1
+ * 描述:退款代金券使用数量 ,$n为下标,从0开始编号
*
*/
@XStreamAlias("coupon_refund_count")
@@ -282,12 +294,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 退款状态
- * refund_status_$n
- * 是
- * String(16)
- * SUCCESS
- * 退款状态:
+ * 字段名:退款状态.
+ * 变量名:refund_status_$n
+ * 是否必填:是
+ * 类型:String(16)
+ * 示例值:SUCCESS
+ * 描述:退款状态:
* SUCCESS—退款成功,
* FAIL—退款失败,
* PROCESSING—退款处理中,
@@ -297,30 +309,44 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
*/
@XStreamAlias("refund_status")
private String refundStatus;
+
/**
*
- * 退款入账账户
- * refund_recv_accout_$n
- * 是
- * String(64)
- * 招商银行信用卡0403
- * 取当前退款单的退款入账方,1)退回银行卡:{银行名称}{卡类型}{卡尾号},2)退回支付用户零钱:支付用户零钱
+ * 字段名:退款入账账户.
+ * 变量名:refund_recv_accout_$n
+ * 是否必填:是
+ * 类型:String(64)
+ * 示例值:招商银行信用卡0403
+ * 描述:取当前退款单的退款入账方,1)退回银行卡:{银行名称}{卡类型}{卡尾号},2)退回支付用户零钱:支付用户零钱
*
*/
@XStreamAlias("refund_recv_accout")
private String refundRecvAccount;
+ /**
+ *
+ * 字段名:退款成功时间.
+ * 变量名:refund_success_time_$n
+ * 是否必填:否
+ * 类型:String(20)
+ * 示例值:2016-07-25 15:26:26
+ * 描述:退款成功时间,当退款状态为退款成功时有返回。$n为下标,从0开始编号。
+ *
+ */
+ @XStreamAlias("refund_success_time")
+ private String refundSuccessTime;
+
@Data
@NoArgsConstructor
public static class RefundCoupon {
/**
*
- * 退款代金券批次ID
- * coupon_refund_batch_id_$n_$m
- * 否
- * String(20)
- * 100
- * 退款代金券批次ID ,$n为下标,$m为下标,从0开始编号
+ * 字段名:退款代金券批次ID.
+ * 变量名:coupon_refund_batch_id_$n_$m
+ * 是否必填:否
+ * 类型:String(20)
+ * 示例值:100
+ * 描述:退款代金券批次ID ,$n为下标,$m为下标,从0开始编号
*
*
* @deprecated 貌似是被去掉了,但不知是何时!
@@ -330,12 +356,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 退款代金券ID
- * coupon_refund_id_$n_$m
- * 否
- * String(20)
- * 10000
- * 退款代金券ID, $n为下标,$m为下标,从0开始编号
+ * 字段名:退款代金券ID.
+ * 变量名:coupon_refund_id_$n_$m
+ * 是否必填:否
+ * 类型:String(20)
+ * 示例值:10000
+ * 描述:退款代金券ID, $n为下标,$m为下标,从0开始编号
*
*/
@XStreamAlias("coupon_refund_id")
@@ -343,12 +369,12 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
/**
*
- * 单个退款代金券支付金额
- * coupon_refund_fee_$n_$m
- * 否
- * Int
- * 100
- * 单个退款代金券支付金额, $n为下标,$m为下标,从0开始编号
+ * 字段名:单个退款代金券支付金额.
+ * 变量名:coupon_refund_fee_$n_$m
+ * 是否必填:否
+ * 类型:Int
+ * 示例值:100
+ * 描述:单个退款代金券支付金额, $n为下标,$m为下标,从0开始编号
*
*/
@XStreamAlias("coupon_refund_fee")
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImpl.java
index 07c36279..0eccb727 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImpl.java
@@ -422,9 +422,9 @@ public abstract class WxPayServiceAbstractImpl implements WxPayService {
String responseContent = this.post(url, request.toXML(), false);
if (responseContent.startsWith("<")) {
throw WxPayException.from(WxPayBaseResult.fromXML(responseContent, WxPayCommonResult.class));
- } else {
- return this.handleBillInformation(responseContent);
}
+
+ return this.handleBillInformation(responseContent);
}
private WxPayBillResult handleBillInformation(String responseContent) {