Skip to content

Commit 8e9c987

Browse files
committed
#320 增加“拉取订单评价数据“接口方法
1 parent b9262c9 commit 8e9c987

File tree

8 files changed

+292
-31
lines changed

8 files changed

+292
-31
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayBaseRequest.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,19 @@ public abstract class WxPayBaseRequest {
9595
@XStreamAlias("sign")
9696
protected String sign;
9797

98+
/**
99+
* <pre>
100+
* 签名类型
101+
* sign_type
102+
* 否
103+
* String(32)
104+
* HMAC-SHA256
105+
* 签名类型,目前支持HMAC-SHA256和MD5
106+
* </pre>
107+
*/
108+
@XStreamAlias("sign_type")
109+
private String signType;
110+
98111
/**
99112
* 将单位为元转换为单位为分
100113
*
@@ -187,6 +200,14 @@ public void setSubMchId(String subMchId) {
187200
this.subMchId = subMchId;
188201
}
189202

203+
public String getSignType() {
204+
return signType;
205+
}
206+
207+
public void setSignType(String signType) {
208+
this.signType = signType;
209+
}
210+
190211
@Override
191212
public String toString() {
192213
return ToStringUtils.toSimpleString(this);
@@ -230,9 +251,8 @@ public void checkAndSign(WxPayConfig config) throws WxPayException {
230251
if (StringUtils.isBlank(getNonceStr())) {
231252
this.setNonceStr(String.valueOf(System.currentTimeMillis()));
232253
}
233-
234254
//设置签名字段的值
235-
this.setSign(SignUtils.createSign(this, config.getMchKey()));
255+
this.setSign(SignUtils.createSign(this, config.getMchKey(), this.signType));
236256
}
237257

238258
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.github.binarywang.wxpay.bean.request;
2+
3+
import com.github.binarywang.wxpay.exception.WxPayException;
4+
import com.thoughtworks.xstream.annotations.XStreamAlias;
5+
import me.chanjar.weixin.common.annotation.Required;
6+
7+
/**
8+
* <pre>
9+
* 拉取订单评价数据接口的请求参数封装类
10+
* Created by BinaryWang on 2017/9/2.
11+
* </pre>
12+
*
13+
* @author <a href="https://github.com/binarywang">Binary Wang</a>
14+
*/
15+
@XStreamAlias("xml")
16+
public class WxPayQueryCommentRequest extends WxPayBaseRequest {
17+
/**
18+
* <pre>
19+
* 字段名:开始时间
20+
* 变量名:begin_time
21+
* 是否必填:是
22+
* 类型:String(19)
23+
* 示例值:20170724000000
24+
* 描述:按用户评论时间批量拉取的起始时间,格式为yyyyMMddHHmmss
25+
* </pre>
26+
*/
27+
@Required
28+
@XStreamAlias("begin_time")
29+
private String beginTime;
30+
31+
/**
32+
* <pre>
33+
* 字段名:结束时间
34+
* 变量名:end_time
35+
* 是否必填:是
36+
* 类型:String(19)
37+
* 示例值:20170725000000
38+
* 描述:按用户评论时间批量拉取的结束时间,格式为yyyyMMddHHmmss
39+
* </pre>
40+
*/
41+
@Required
42+
@XStreamAlias("end_time")
43+
private String endTime;
44+
45+
/**
46+
* <pre>
47+
* 字段名:位移
48+
* 变量名:offset
49+
* 是否必填:是
50+
* 类型:uint(64)
51+
* 示例值:0
52+
* 描述:指定从某条记录的下一条开始返回记录。接口调用成功时,会返回本次查询最后一条数据的offset。商户需要翻页时,应该把本次调用返回的offset 作为下次调用的入参。注意offset是评论数据在微信支付后台保存的索引,未必是连续的
53+
* </pre>
54+
*/
55+
@Required
56+
@XStreamAlias("offset")
57+
private Integer offset;
58+
59+
/**
60+
* <pre>
61+
* 字段名:条数
62+
* 变量名:limit
63+
* 是否必填:否
64+
* 类型:uint(32)
65+
* 示例值:100
66+
* 描述:一次拉取的条数, 最大值是200,默认是200
67+
* </pre>
68+
*/
69+
@XStreamAlias("limit")
70+
private Integer limit;
71+
72+
/**
73+
* 检查约束情况
74+
*/
75+
@Override
76+
protected void checkConstraints() throws WxPayException {
77+
78+
}
79+
80+
public String getBeginTime() {
81+
return beginTime;
82+
}
83+
84+
public void setBeginTime(String beginTime) {
85+
this.beginTime = beginTime;
86+
}
87+
88+
public String getEndTime() {
89+
return endTime;
90+
}
91+
92+
public void setEndTime(String endTime) {
93+
this.endTime = endTime;
94+
}
95+
96+
public Integer getOffset() {
97+
return offset;
98+
}
99+
100+
public void setOffset(Integer offset) {
101+
this.offset = offset;
102+
}
103+
104+
public Integer getLimit() {
105+
return limit;
106+
}
107+
108+
public void setLimit(Integer limit) {
109+
this.limit = limit;
110+
}
111+
112+
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.github.binarywang.wxpay.constant;
22

3+
import java.text.SimpleDateFormat;
4+
35
/**
46
* <pre>
57
* 微信支付常量类
@@ -9,6 +11,12 @@
911
* @author <a href="https://github.com/binarywang">Binary Wang</a>
1012
*/
1113
public class WxPayConstants {
14+
15+
/**
16+
* 拉取订单评价数据接口的参数中日期格式
17+
*/
18+
public static final SimpleDateFormat QUERY_COMMENT_DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
19+
1220
/**
1321
* 校验用户姓名选项,企业付款时使用
1422
*/

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.github.binarywang.wxpay.exception.WxPayException;
1111

1212
import java.io.File;
13+
import java.util.Date;
1314
import java.util.Map;
1415

1516
/**
@@ -115,8 +116,8 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
115116
throws WxPayException;
116117

117118
/**
118-
* @deprecated use WxPayService#parseOrderNotifyResult(String) instead
119119
* @see WxPayService#parseOrderNotifyResult(String)
120+
* @deprecated use WxPayService#parseOrderNotifyResult(String) instead
120121
*/
121122
@Deprecated
122123
WxPayOrderNotifyResult getOrderNotifyResult(String xmlData) throws WxPayException;
@@ -389,4 +390,23 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
389390
* 获取微信请求数据,方便接口调用方获取处理
390391
*/
391392
WxPayApiData getWxApiData();
393+
394+
/**
395+
* <pre>
396+
* 拉取订单评价数据
397+
* 商户可以通过该接口拉取用户在微信支付交易记录中针对你的支付记录进行的评价内容。商户可结合商户系统逻辑对该内容数据进行存储、分析、展示、客服回访以及其他使用。如商户业务对评价内容有依赖,可主动引导用户进入微信支付交易记录进行评价。
398+
* 注意:
399+
* 1. 该内容所有权为提供内容的微信用户,商户在使用内容的过程中应遵从用户意愿
400+
* 2. 一次最多拉取200条评价数据,可根据时间区间分批次拉取
401+
* 3. 接口只能拉取最近三个月以内的评价数据
402+
* 接口链接:https://api.mch.weixin.qq.com/billcommentsp/batchquerycomment
403+
* 是否需要证书:需要
404+
* 文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_17&index=10
405+
* </pre>
406+
* @param beginDate 开始时间
407+
* @param endDate 结束时间
408+
* @param offset 位移
409+
* @param limit 条数
410+
*/
411+
String queryComment(Date beginDate, Date endDate, Integer offset, Integer limit) throws WxPayException;
392412
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImpl.java

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@
2323
import org.slf4j.LoggerFactory;
2424

2525
import java.io.File;
26-
import java.util.HashMap;
27-
import java.util.LinkedList;
28-
import java.util.List;
29-
import java.util.Map;
26+
import java.util.*;
27+
28+
import static com.github.binarywang.wxpay.constant.WxPayConstants.QUERY_COMMENT_DATE_FORMAT;
3029

3130
/**
3231
* <pre>
@@ -237,7 +236,7 @@ public <T> T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException
237236
configMap.put("appid", appId);
238237

239238
payResult = WxPayAppOrderResult.newBuilder()
240-
.sign(SignUtils.createSign(configMap, this.getConfig().getMchKey()))
239+
.sign(SignUtils.createSign(configMap, this.getConfig().getMchKey(), null))
241240
.prepayId(prepayId)
242241
.partnerId(partnerId)
243242
.appId(appId)
@@ -256,7 +255,7 @@ public <T> T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException
256255
.signType(SignType.MD5)
257256
.build();
258257
((WxPayMpOrderResult) payResult)
259-
.setPaySign(SignUtils.createSign(payResult, this.getConfig().getMchKey()));
258+
.setPaySign(SignUtils.createSign(payResult, this.getConfig().getMchKey(), null));
260259
break;
261260
}
262261
}
@@ -303,7 +302,7 @@ public Map<String, String> getPayInfo(WxPayUnifiedOrderRequest request) throws W
303302
configMap.put("noncestr", nonceStr);
304303
configMap.put("appid", appId);
305304
// 此map用于客户端与微信服务器交互
306-
payInfo.put("sign", SignUtils.createSign(configMap, this.getConfig().getMchKey()));
305+
payInfo.put("sign", SignUtils.createSign(configMap, this.getConfig().getMchKey(), null));
307306
payInfo.put("prepayId", prepayId);
308307
payInfo.put("partnerId", partnerId);
309308
payInfo.put("appId", appId);
@@ -317,7 +316,7 @@ public Map<String, String> getPayInfo(WxPayUnifiedOrderRequest request) throws W
317316
payInfo.put("nonceStr", nonceStr);
318317
payInfo.put("package", "prepay_id=" + prepayId);
319318
payInfo.put("signType", SignType.MD5);
320-
payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey()));
319+
payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey(), null));
321320
}
322321

323322
return payInfo;
@@ -364,7 +363,7 @@ public String createScanPayQrcodeMode1(String productId) {
364363
params.put("time_stamp", String.valueOf(System.currentTimeMillis() / 1000));//这里需要秒,10位数字
365364
params.put("nonce_str", String.valueOf(System.currentTimeMillis()));
366365

367-
String sign = SignUtils.createSign(params, this.getConfig().getMchKey());
366+
String sign = SignUtils.createSign(params, this.getConfig().getMchKey(), null);
368367
params.put("sign", sign);
369368

370369
for (String key : params.keySet()) {
@@ -411,15 +410,13 @@ public WxPayBillResult downloadBill(String billDate, String billType, String tar
411410
String url = this.getPayBaseUrl() + "/pay/downloadbill";
412411
String responseContent = this.post(url, request.toXML(), false);
413412
if (responseContent.startsWith("<")) {
414-
WxPayCommonResult result = WxPayBaseResult.fromXML(responseContent, WxPayCommonResult.class);
415-
result.checkResult(this);
416-
return null;
413+
throw WxPayException.from(WxPayBaseResult.fromXML(responseContent, WxPayCommonResult.class));
417414
} else {
418-
return billInformationDeal(responseContent);
415+
return this.handleBillInformation(responseContent);
419416
}
420417
}
421418

422-
private WxPayBillResult billInformationDeal(String responseContent) {
419+
private WxPayBillResult handleBillInformation(String responseContent) {
423420
WxPayBillResult wxPayBillResult = new WxPayBillResult();
424421

425422
String listStr = "";
@@ -597,4 +594,25 @@ public WxPayApiData getWxApiData() {
597594
wxApiData.remove();
598595
}
599596
}
597+
598+
@Override
599+
public String queryComment(Date beginDate, Date endDate, Integer offset, Integer limit) throws WxPayException {
600+
WxPayQueryCommentRequest request = new WxPayQueryCommentRequest();
601+
request.setBeginTime(QUERY_COMMENT_DATE_FORMAT.format(beginDate));
602+
request.setEndTime(QUERY_COMMENT_DATE_FORMAT.format(endDate));
603+
request.setOffset(offset);
604+
request.setLimit(limit);
605+
request.setSignType(SignType.HMAC_SHA256);
606+
607+
request.checkAndSign(this.getConfig());
608+
609+
String url = this.getPayBaseUrl() + "/billcommentsp/batchquerycomment";
610+
611+
String responseContent = this.post(url, request.toXML(), true);
612+
if (responseContent.startsWith("<")) {
613+
throw WxPayException.from(WxPayBaseResult.fromXML(responseContent, WxPayCommonResult.class));
614+
}
615+
616+
return responseContent;
617+
}
600618
}

0 commit comments

Comments
 (0)