diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 6cde59507..06077fc1b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -121,7 +121,9 @@ public interface WxMpPayService { *
    * 文档详见:
    * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
+   *  接口地址:https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
    * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4
+   *  接口地址:https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack
    * 
    *
    * @param request 请求对象
@@ -129,6 +131,19 @@ public interface WxMpPayService {
    */
   WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request, File keyFile) throws WxErrorException;
 
+  /**
+   * + * 查询红包记录 + * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包。 + * 请求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo + * 是否需要证书 是(证书及使用说明详见商户证书) + * 请求方式 POST + *+ * @param mchBillNo 商户发放红包的商户订单号,比如10000098201411111234567890 + * @param keyFile 证书文件对象 + */ + WxPayRedpackQueryResult queryRedpack(String mchBillNo, File keyFile) throws WxErrorException; + /** *
    * 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
index e49891f18..2483b3793 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
@@ -183,6 +183,32 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     return result;
   }
 
+  @Override
+  public WxPayRedpackQueryResult queryRedpack(String mchBillNo, File keyFile) throws WxErrorException {
+    XStream xstream = XStreamInitializer.getInstance();
+    xstream.processAnnotations(WxPayRedpackQueryRequest.class);
+    xstream.processAnnotations(WxPayRedpackQueryResult.class);
+
+    WxPayRedpackQueryRequest request = new WxPayRedpackQueryRequest();
+    request.setMchBillNo(mchBillNo);
+    request.setBillType("MCHT");
+
+    request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
+    String mchId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
+    request.setMchId(mchId);
+    request.setNonceStr(System.currentTimeMillis() + "");
+
+    String sign = this.createSign(BeanUtils.xmlBean2Map(request),
+      this.wxMpService.getWxMpConfigStorage().getPartnerKey());
+    request.setSign(sign);
+
+    String url = PAY_BASE_URL + "/mmpaymkttransfers/gethbinfo";
+    String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), mchId);
+    WxPayRedpackQueryResult result = (WxPayRedpackQueryResult) xstream.fromXML(responseContent);
+    this.checkResult(result);
+    return result;
+  }
+
   /**
    * 微信公众号支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3)
    *
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRedpackQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRedpackQueryRequest.java
new file mode 100644
index 000000000..de7eee932
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRedpackQueryRequest.java
@@ -0,0 +1,57 @@
+package me.chanjar.weixin.mp.bean.pay.request;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+/**
+ * 
+ *   注释中各行对应含义:
+ *   字段名
+ *   字段
+ *   必填
+ *   示例值
+ *   类型
+ *   说明
+ * Created by Binary Wang on 2016-11-28.
+ * @author binarywang(Binary Wang)
+ * 
+ */
+@XStreamAlias("xml")
+public class WxPayRedpackQueryRequest extends WxPayBaseRequest {
+  /**
+   * 商户订单号
+   * mch_billno
+   * 是
+   * 10000098201411111234567890
+   * String(28)
+   * 商户发放红包的商户订单号
+   */
+  @XStreamAlias("mch_billno")
+  private String mchBillNo;
+
+  /**
+   * 订单类型
+   * bill_type
+   * 是
+   * MCHT
+   * String(32)
+   * MCHT:通过商户订单号获取红包信息。
+   */
+  @XStreamAlias("bill_type")
+  private String billType;
+
+  public String getBillType() {
+    return billType;
+  }
+
+  public void setBillType(String billType) {
+    this.billType = billType;
+  }
+
+  public String getMchBillNo() {
+    return mchBillNo;
+  }
+
+  public void setMchBillNo(String mchBillNo) {
+    this.mchBillNo = mchBillNo;
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java
index cad2cc521..535b2941c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java
@@ -14,7 +14,7 @@ public class WxPaySendRedpackRequest {
   * 商户订单号(每个订单号必须唯一)  组成:mch_id+yyyymmdd+10位一天内不能重复的数字。  接口根据商户订单号支持重入,如出现超时可再调用。
   */
   @XStreamAlias("mch_billno")
-  private String mchBillno;
+  private String mchBillNo;
 
   /**
    * send_name
@@ -157,12 +157,12 @@ public class WxPaySendRedpackRequest {
   @XStreamAlias("consume_mch_id")
   private String consumeMchId;
 
-  public String getMchBillno() {
-    return this.mchBillno;
+  public String getMchBillNo() {
+    return mchBillNo;
   }
 
-  public void setMchBillno(String mchBillno) {
-    this.mchBillno = mchBillno;
+  public void setMchBillNo(String mchBillNo) {
+    this.mchBillNo = mchBillNo;
   }
 
   public String getSendName() {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
index 17b3a412b..373497f37 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
@@ -1,10 +1,10 @@
 package me.chanjar.weixin.mp.bean.pay.result;
 
-import java.util.List;
-
 import com.google.common.collect.Lists;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 
+import java.util.List;
+
 /**
  * 
  *  查询订单 返回结果对象
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRedpackQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRedpackQueryResult.java
new file mode 100644
index 000000000..faf2df674
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRedpackQueryResult.java
@@ -0,0 +1,405 @@
+package me.chanjar.weixin.mp.bean.pay.result;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+/**
+ * 
+ *   注释中各行对应含义:
+ *   字段名
+ *   字段
+ *   必填
+ *   示例值
+ *   类型
+ *   说明
+ * Created by Binary Wang on 2016-11-28.
+ * @author binarywang(Binary Wang)
+ * 
+ */
+public class WxPayRedpackQueryResult extends WxPayBaseResult {
+
+  /**
+   * 
+   * 商户订单号
+   * mch_billno
+   * 是
+   * 10000098201411111234567890
+   * String(28)
+   * 商户使用查询API填写的商户单号的原路返回
+   * 
+   */
+  @XStreamAlias("mch_billno")
+  private String mchBillNo;
+
+  /**
+   * 
+   * 红包单号
+   * detail_id
+   * 是
+   * 1000000000201503283103439304
+   * String(32)
+   * 使用API发放现金红包时返回的红包单号
+   * 
+   */
+  @XStreamAlias("detail_id")
+  private String detailId;
+
+  /**
+   * 
+   * 红包状态
+   * status
+   * 是
+   * RECEIVED
+   * string(16)
+   * SENDING:发放中,
+     * SENT:已发放待领取,
+     * FAILED:发放失败,
+     * RECEIVED:已领取,
+     * RFUND_ING:退款中,
+     * REFUND:已退款
+   * 
+   */
+  @XStreamAlias("status")
+  private String status;
+
+  /**
+   * 
+   * 发放类型
+   * send_type
+   * 是
+   * API
+   * String(32)
+   *  API:通过API接口发放,
+   *  UPLOAD:通过上传文件方式发放,
+   *  ACTIVITY:通过活动方式发放
+   * 
+   */
+  @XStreamAlias("send_type")
+  private String sendType;
+
+  /**
+   * 
+   * 红包类型
+   * hb_type
+   * 是
+   * GROUP
+   * String(32)
+   *  GROUP:裂变红包,
+   *  NORMAL:普通红包
+   * 
+   */
+  @XStreamAlias("hb_type")
+  private String hbType;
+
+  /**
+   * 
+   * 红包个数
+   * total_num
+   * 是
+   * 1
+   * int
+   * 红包个数
+   * 
+   */
+  @XStreamAlias("total_num")
+  private Integer totalNum;
+
+  /**
+   * 
+   * 红包金额
+   * total_amount
+   * 是
+   * 5000
+   * int
+   * 红包总金额(单位分)
+   * 
+   */
+  @XStreamAlias("total_amount")
+  private Integer totalAmount;
+
+  /**
+   * 
+   * 失败原因
+   * reason
+   * 否
+   * 余额不足
+   * String(32)
+   * 发送失败原因
+   * 
+   */
+  @XStreamAlias("reason")
+  private String reason;
+
+  /**
+   * 
+   * 红包发送时间
+   * send_time
+   * 是
+   * 2015-04-21 20:00:00
+   * String(32)
+   * 红包的发送时间
+   * 
+   */
+  @XStreamAlias("send_time")
+  private String sendTime;
+
+  /**
+   * 
+   * 红包退款时间
+   * refund_time
+   * 否
+   * 2015-04-21 23:03:00
+   * String(32)
+   * 红包的退款时间(如果其未领取的退款)
+   * 
+   */
+  @XStreamAlias("refund_time")
+  private String refundTime;
+
+  /**
+   * 
+   * 红包退款金额
+   * refund_amount
+   * 否
+   * 8000
+   * Int
+   * 红包退款金额
+   * 
+   */
+  @XStreamAlias("refund_amount")
+  private Integer refundAmount;
+
+  /**
+   * 
+   * 祝福语
+   * wishing
+   * 否
+   * 新年快乐
+   * String(128)
+   * 祝福语
+   * 
+   */
+  @XStreamAlias("wishing")
+  private String wishing;
+
+  /**
+   * 
+   * 活动描述
+   * remark
+   * 否
+   * 新年红包
+   * String(256)
+   * 活动描述,低版本微信可见
+   * 
+   */
+  @XStreamAlias("remark")
+  private String remark;
+
+  /**
+   * 
+   * 活动名称
+   * act_name
+   * 否
+   * 新年红包
+   * String(32)
+   * 发红包的活动名称
+   * 
+   */
+  @XStreamAlias("act_name")
+  private String actName;
+
+  /**
+   * 
+   * 裂变红包领取列表
+   * hblist
+   * 否
+   *
+   *
+   * 裂变红包的领取列表
+   * 
+   */
+  @XStreamAlias("hblist")
+  private String hblist;
+
+  /**
+   * 
+   * 领取红包的Openid
+   * openid
+   * 是
+   * ohO4GtzOAAYMp2yapORH3dQB3W18
+   * String(32)
+   * 领取红包的openid
+   * 
+   */
+  @XStreamAlias("openid")
+  private String openid;
+
+  /**
+   * 
+   * 金额
+   * amount
+   * 是
+   * 100
+   * int
+   * 领取金额
+   * 
+   */
+  @XStreamAlias("amount")
+  private Integer amount;
+
+  /**
+   * 
+   * 接收时间
+   * rcv_time
+   * 是
+   * 2015-04-21 20:00:00
+   * String(32)
+   * 领取红包的时间
+   * 
+   */
+  @XStreamAlias("rcv_time")
+  private String receiveTime;
+
+  public String getMchBillNo() {
+    return mchBillNo;
+  }
+
+  public void setMchBillNo(String mchBillNo) {
+    this.mchBillNo = mchBillNo;
+  }
+
+  public String getDetailId() {
+    return detailId;
+  }
+
+  public void setDetailId(String detailId) {
+    this.detailId = detailId;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getSendType() {
+    return sendType;
+  }
+
+  public void setSendType(String sendType) {
+    this.sendType = sendType;
+  }
+
+  public String getHbType() {
+    return hbType;
+  }
+
+  public void setHbType(String hbType) {
+    this.hbType = hbType;
+  }
+
+  public Integer getTotalNum() {
+    return totalNum;
+  }
+
+  public void setTotalNum(Integer totalNum) {
+    this.totalNum = totalNum;
+  }
+
+  public Integer getTotalAmount() {
+    return totalAmount;
+  }
+
+  public void setTotalAmount(Integer totalAmount) {
+    this.totalAmount = totalAmount;
+  }
+
+  public String getReason() {
+    return reason;
+  }
+
+  public void setReason(String reason) {
+    this.reason = reason;
+  }
+
+  public String getSendTime() {
+    return sendTime;
+  }
+
+  public void setSendTime(String sendTime) {
+    this.sendTime = sendTime;
+  }
+
+  public String getRefundTime() {
+    return refundTime;
+  }
+
+  public void setRefundTime(String refundTime) {
+    this.refundTime = refundTime;
+  }
+
+  public Integer getRefundAmount() {
+    return refundAmount;
+  }
+
+  public void setRefundAmount(Integer refundAmount) {
+    this.refundAmount = refundAmount;
+  }
+
+  public String getWishing() {
+    return wishing;
+  }
+
+  public void setWishing(String wishing) {
+    this.wishing = wishing;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+
+  public String getActName() {
+    return actName;
+  }
+
+  public void setActName(String actName) {
+    this.actName = actName;
+  }
+
+  public String getHblist() {
+    return hblist;
+  }
+
+  public void setHblist(String hblist) {
+    this.hblist = hblist;
+  }
+
+  public String getOpenid() {
+    return openid;
+  }
+
+  public void setOpenid(String openid) {
+    this.openid = openid;
+  }
+
+  public Integer getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+
+  public String getReceiveTime() {
+    return receiveTime;
+  }
+
+  public void setReceiveTime(String receiveTime) {
+    this.receiveTime = receiveTime;
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundQueryResult.java
index efc21139b..430288466 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundQueryResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundQueryResult.java
@@ -183,6 +183,13 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
     this.refundRecords = refundRecords;
   }
 
+  public void composeRefundRecords(String xmlString) {
+    if (this.refundCount != null && this.refundCount > 0) {
+      this.refundRecords = Lists.newArrayList();
+      //TODO 暂时待实现
+    }
+  }
+
   public static class RefundRecord {
     /**
      * 
@@ -477,12 +484,5 @@ public class WxPayRefundQueryResult extends WxPayBaseResult {
     }
 
   }
-
-  public void composeRefundRecords(String xmlString){
-    if(this.refundCount != null && this.refundCount > 0 ){
-      this.refundRecords = Lists.newArrayList();
-      //TODO 暂时待实现
-    }
-  }
 }
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
index 5f155862f..7b2a9dea4 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
@@ -9,10 +9,7 @@ import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest;
 import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest;
 import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest;
 import me.chanjar.weixin.mp.bean.pay.request.WxPayUnifiedOrderRequest;
-import me.chanjar.weixin.mp.bean.pay.result.WxPayRefundQueryResult;
-import me.chanjar.weixin.mp.bean.pay.result.WxPayRefundResult;
-import me.chanjar.weixin.mp.bean.pay.result.WxPaySendRedpackResult;
-import me.chanjar.weixin.mp.bean.pay.result.WxPayUnifiedOrderResult;
+import me.chanjar.weixin.mp.bean.pay.result.*;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
@@ -36,6 +33,9 @@ public class WxMpPayServiceImplTest {
 
   }
 
+  /**
+   * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#refund(WxPayRefundRequest, File)} .
+   */
   @Test
   public void testRefund() throws Exception {
     WxPayRefundRequest request = new WxPayRefundRequest();
@@ -48,6 +48,10 @@ public class WxMpPayServiceImplTest {
     System.err.println(result);
   }
 
+
+  /**
+   * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#refundQuery(String, String, String, String)} .
+   */
   @Test
   public void testRefundQuery() throws Exception {
     WxPayRefundQueryResult result = this.wxService.getPayService().refundQuery("1", "", "", "");
@@ -67,12 +71,15 @@ public class WxMpPayServiceImplTest {
 
   }
 
+  /**
+   * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#sendRedpack(WxPaySendRedpackRequest, File)} .
+   */
   @Test
   public void testSendRedpack() throws Exception {
     WxPaySendRedpackRequest request = new WxPaySendRedpackRequest();
     request.setActName("abc");
     request.setClientIp("aaa");
-    request.setMchBillno("aaaa");
+    request.setMchBillNo("aaaa");
     request
       .setReOpenid(((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid());
     File keyFile = new File("E:\\dlt.p12");
@@ -80,6 +87,16 @@ public class WxMpPayServiceImplTest {
     System.err.println(redpackResult);
   }
 
+  /**
+   * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#queryRedpack(String, File)}.
+   */
+  @Test
+  public void testQueryRedpack() throws Exception {
+    File keyFile = new File("E:\\dlt.p12");
+    WxPayRedpackQueryResult redpackResult = this.wxService.getPayService().queryRedpack("aaaa", keyFile);
+    System.err.println(redpackResult);
+  }
+
   /**
    * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#unifiedOrder(WxPayUnifiedOrderRequest)}.
    */