From d4d830fe3a3582f151dddbf214aab7fd7d628e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=85=B1=E6=B2=B999=E5=8F=B7?= <779687795@qq.com> Date: Tue, 3 Dec 2019 17:09:31 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=09#1309=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8F=91=E9=80=81=E5=92=8C=E6=9F=A5=E8=AF=A2=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=BA=A2=E5=8C=85=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entpay/EntPayRedpackQueryRequest.java | 33 ++++ .../bean/entpay/EntPayRedpackQueryResult.java | 133 ++++++++++++++++ .../bean/entpay/EntPayRedpackRequest.java | 147 ++++++++++++++++++ .../bean/entpay/EntPayRedpackResult.java | 80 ++++++++++ .../wxpay/bean/request/BaseWxPayRequest.java | 58 +++++-- .../wxpay/service/EntPayService.java | 24 +++ .../wxpay/service/impl/EntPayServiceImpl.java | 65 +++++--- .../binarywang/wxpay/util/SignUtils.java | 45 +++++- .../service/impl/EntPayServiceImplTest.java | 62 +++++++- 9 files changed, 608 insertions(+), 39 deletions(-) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryRequest.java new file mode 100644 index 000000000..29fc517f0 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryRequest.java @@ -0,0 +1,33 @@ +package com.github.binarywang.wxpay.bean.entpay; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; + +/** + * 红包发送记录查询请求 + * @author wuyong + * @date 2019-12-01 17:19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class EntPayRedpackQueryRequest extends BaseWxPayRequest { + + + /** + * 商户订单号 + */ + @XStreamAlias("mch_billno") + private String mchBillNo; + + + @Override + protected void checkConstraints() throws WxPayException { + + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java new file mode 100644 index 000000000..1235fe1bd --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java @@ -0,0 +1,133 @@ +package com.github.binarywang.wxpay.bean.entpay; + +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 红包发送记录查询返回 + * + * @author wuyong + * @date 2019-12-01 17:23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class EntPayRedpackQueryResult extends BaseWxPayResult { + + /** + * 商户订单号 + * 商户使用查询API填写的商户单号的原路返回 + */ + @XStreamAlias("mch_billno") + protected String mchBillNo; + + /** + * 红包单号 + * 使用API发放现金红包时返回的红包单号 + */ + @XStreamAlias("detailId") + private String detailId; + /** + * 红包状态 + * SENDING:发放 + * SENT: + * 已发放待领取 + * FAILED:发放失败 + * RECEIVED:已领取 + * RFUND_ING:退款中 REFUND:已退款 + */ + @XStreamAlias("status") + private String status; + + /** + * 发放类型 + * API:通过API接口发放 + */ + @XStreamAlias("send_type") + private String sendType; + + /** + * 红包金额 + * 红包总金额(单位分) + */ + @XStreamAlias("total_amount") + private Integer totalAmount; + + /** + * 失败原因 + * 发送失败原因 + */ + @XStreamAlias("reason") + private Integer reason; + + /** + * 红包发送时间 + */ + @XStreamAlias("send_time") + private String sendTime; + /** + * 红包的退款时间 + */ + @XStreamAlias("refund_time") + private String refundTime; + + /** + * 红包退款金额 + */ + @XStreamAlias("refund_amount") + private Integer refundAmount; + + /** + * 祝福语 + */ + @XStreamAlias("wishing") + private String wishing; + + /** + * 备注 + */ + @XStreamAlias("remark") + private String remark; + + /** + * 活动名称 + */ + @XStreamAlias("act_name") + private String actName; + + /** + * 领取红包的Openid + */ + @XStreamAlias("openid") + private String openid; + + /** + * 金额 + */ + @XStreamAlias("amount") + private Integer amount; + + /** + * 接收时间 + */ + @XStreamAlias("rcv_time") + private Integer rcvTime; + + /** + * 发送者名称 + */ + @XStreamAlias("sender_name") + private Integer senderName; + + /** + * 发送者头像 + * 通过企业微信开放接口上传获取 + */ + @XStreamAlias("sender_header_media_id") + private Integer senderHeaderMediaId; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackRequest.java new file mode 100644 index 000000000..0ab8bddab --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackRequest.java @@ -0,0 +1,147 @@ +package com.github.binarywang.wxpay.bean.entpay; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; + +/** + * 发送企业红包 + * @author wuyong + * @date 2019-12-1 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class EntPayRedpackRequest extends BaseWxPayRequest { + + private static final long serialVersionUID = 1L; + + @Override + protected void checkConstraints() throws WxPayException { + + } + + /** + * 商户订单号(每个订单号必须唯一) + * 组成:mch_id+yyyymmdd+10位一天内不能重复的数字。 接口根据商户订单号支持重入,如出现超时可再调用。 + * 必填:是 + */ + @Required + @XStreamAlias("mch_billno") + private String mchBillNo; + + /** + * 微信分配的公众账号ID(企业微信corpid即为此appId) + * 必填:是 + */ + @Required + @XStreamAlias("wxappid") + private String wxAppId; + + /** + * 发送者名称 + * 以个人名义发红包,红包发送者名称(需要utf-8格式)。与agentid互斥,二者只能填一个。 + * 必填:否 + */ + @XStreamAlias("sender_name") + private String senderName; + + /** + * 发送红包的应用id + * 以企业应用的名义发红包,企业应用id,整型,可在企业微信管理端应用的设置页面查看。与sender_name互斥,二者只能填一个。 + * 必填:否 + */ + @XStreamAlias("agentid") + private String agentId; + + /** + * 发送者头像 + * 发送者头像素材id,通过企业微信开放上传素材接口获取 + * 必填:否 + */ + @XStreamAlias("sender_header_media_id") + private String senderHeaderMediaId; + + /** + * 用户openid + * 接受红包的用户.用户在wxappid下的openid。 + * 必填:是 + */ + @Required + @XStreamAlias("re_openid") + private String reOpenid; + + /** + * 金额 + * 单位分,单笔最小金额默认为1元 + * 必填:是 + */ + @Required + @XStreamAlias("total_amount") + private Integer totalAmount; + + /** + * 红包祝福语 + * 必填:是 + */ + @Required + @XStreamAlias("wishing") + private String wishing; + + /** + * 项目名称 + * 必填:是 + */ + @Required + @XStreamAlias("act_name") + private String actName; + + /** + * 备注 + * 必填:是 + */ + @Required + @XStreamAlias("remark") + private String remark; + + /** + * 场景 + * 发放红包使用场景,红包金额大于200时必传 + * PRODUCT_1:商品促销 + * PRODUCT_2:抽奖 + * PRODUCT_3:虚拟物品兑奖 + * PRODUCT_4:企业内部福利 + * PRODUCT_5:渠道分润 + * PRODUCT_6:保险回馈 + * PRODUCT_7:彩票派奖 + * PRODUCT_8:税务刮奖 + */ + @XStreamAlias("scene_id") + private String sceneId; + + + @Override + protected boolean ignoreAppid() { + return true; + } + + @Override + protected boolean ignoreSubAppId() { + return true; + } + + @Override + protected boolean ignoreSubMchId() { + return true; + } + + @Override + protected boolean isWxWorkSign() { + return true; + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java new file mode 100644 index 000000000..677ac88f8 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java @@ -0,0 +1,80 @@ +package com.github.binarywang.wxpay.bean.entpay; + +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 企业微信红包返回 + * @author wuyong + * @date 2019-12-01 11:31 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class EntPayRedpackResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 商户订单号 + * 商户订单号(每个订单号必须唯一)组成:mch_id+yyyymmdd+10位一天内不能重复的数字 + */ + @XStreamAlias("mch_billno") + private String mchBillNo; + + /** + * 商户号 + * 微信支付分配的商户号 + */ + @XStreamAlias("mch_id") + private String mchId; + + /** + * 公众账号appid + * 商户appid,接口传入的所有appid应该为公众号的appid,不能为APP的appid + */ + @XStreamAlias("wxappid") + private String wxAppId; + + /** + * 用户openid + * 接受收红包的用户在wxappid下的openid + */ + @XStreamAlias("re_openid") + private String reOpenid; + + /** + * 付款金额 + * 付款金额,单位分 + */ + @XStreamAlias("totalAmount") + private String totalAmount; + + /** + * 微信单号 + * 红包订单的微信单号 + */ + @XStreamAlias("sendListid") + private String sendListId; + + /** + * 发送者名称 + * 红包发送者名称(需要utf-8格式) + */ + @XStreamAlias("sender_name") + private String senderName; + + /** + * 发送者头像 + * 发送者头像素材id,通过企业微信开放上传素材接口获取 + */ + @XStreamAlias("sender_header_media_id") + private String senderHeaderMediaId; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java index 73793a23f..0b85f41e9 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java @@ -1,21 +1,20 @@ package com.github.binarywang.wxpay.bean.request; -import java.io.Serializable; -import java.math.BigDecimal; - -import lombok.experimental.Accessors; -import org.apache.commons.lang3.StringUtils; - import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.util.SignUtils; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.annotations.XStreamAlias; import lombok.Data; +import lombok.experimental.Accessors; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.BeanUtils; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.common.util.xml.XStreamInitializer; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.math.BigDecimal; import static com.github.binarywang.wxpay.constant.WxPayConstants.SignType.ALL_SIGN_TYPES; @@ -118,6 +117,21 @@ public abstract class BaseWxPayRequest implements Serializable { @XStreamAlias("sign_type") private String signType; + + /** + * 企业微信签名 + */ + @XStreamAlias("workwx_sign") + private String workWxSign; + + public String getWorkWxSign() { + return workWxSign; + } + + public void setWorkWxSign(String workWxSign) { + this.workWxSign = workWxSign; + } + /** * 将单位为元转换为单位为分. * @@ -205,6 +219,26 @@ public abstract class BaseWxPayRequest implements Serializable { return false; } + /** + * 签名时,是否忽略sub_appid. + * + * @return the boolean + */ + protected boolean ignoreSubAppId() { + return false; + } + + protected boolean ignoreSubMchId(){ + return false; + } + + /** + * 是否是企业微信字段 + */ + protected boolean isWxWorkSign(){ + return false; + } + /** * 签名时,忽略的参数. * @@ -238,12 +272,16 @@ public abstract class BaseWxPayRequest implements Serializable { this.setMchId(config.getMchId()); } - if (StringUtils.isBlank(getSubAppId())) { - this.setSubAppId(config.getSubAppId()); + if (!ignoreSubAppId()) { + if (StringUtils.isBlank(getSubAppId())) { + this.setSubAppId(config.getSubAppId()); + } } - if (StringUtils.isBlank(getSubMchId())) { - this.setSubMchId(config.getSubMchId()); + if (!ignoreSubMchId()) { + if (StringUtils.isBlank(getSubMchId())) { + this.setSubMchId(config.getSubMchId()); + } } if (StringUtils.isBlank(getSignType())) { diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java index df9330fc9..1b1b76b15 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java @@ -119,4 +119,28 @@ public interface EntPayService { * @throws WxPayException the wx pay exception */ EntPayBankQueryResult queryPayBank(EntPayBankQueryRequest request) throws WxPayException; + + /** + * 企业发送微信红包给个人用户 + *
+   *   文档地址:https://work.weixin.qq.com/api/doc
+   *   接口地址: https://api.mch.weixin.qq.com/mmpaymkttransfers/sendworkwxredpack
+   * 
+ * @param request 请求对象 + * @return the wx pay send redpack result + * @throws WxPayException the wx pay exception + */ + EntPayRedpackResult sendEnterpriseRedpack(EntPayRedpackRequest request) throws WxPayException; + + /** + * 企业发送微信红包查询 + *
+   *   文档地址:https://work.weixin.qq.com/api/doc
+   *   接口地址: https://api.mch.weixin.qq.com/mmpaymkttransfers/queryworkwxredpack
+   * 
+ * @param request 请求对象 + * @return the wx pay send redpack result + * @throws WxPayException the wx pay exception + */ + EntPayRedpackQueryResult queryEnterpriseRedpack(EntPayRedpackQueryRequest request) throws WxPayException; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java index 59db3ee07..1db5bc40f 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java @@ -1,35 +1,26 @@ package com.github.binarywang.wxpay.service.impl; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.security.PublicKey; -import java.security.Security; -import javax.crypto.Cipher; - +import com.github.binarywang.wxpay.bean.entpay.*; +import com.github.binarywang.wxpay.bean.request.WxPayDefaultRequest; +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.EntPayService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.util.SignUtils; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; -import com.github.binarywang.wxpay.bean.entpay.EntPayBankQueryRequest; -import com.github.binarywang.wxpay.bean.entpay.EntPayBankQueryResult; -import com.github.binarywang.wxpay.bean.entpay.EntPayBankRequest; -import com.github.binarywang.wxpay.bean.entpay.EntPayBankResult; -import com.github.binarywang.wxpay.bean.entpay.EntPayQueryRequest; -import com.github.binarywang.wxpay.bean.entpay.EntPayQueryResult; -import com.github.binarywang.wxpay.bean.entpay.EntPayRequest; -import com.github.binarywang.wxpay.bean.entpay.EntPayResult; -import com.github.binarywang.wxpay.bean.entpay.GetPublicKeyResult; -import com.github.binarywang.wxpay.bean.request.WxPayDefaultRequest; -import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.EntPayService; -import com.github.binarywang.wxpay.service.WxPayService; +import javax.crypto.Cipher; +import java.io.File; +import java.io.FileReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.PublicKey; +import java.security.Security; /** *
@@ -140,6 +131,32 @@ public class EntPayServiceImpl implements EntPayService {
     return result;
   }
 
+  @Override
+  public EntPayRedpackResult sendEnterpriseRedpack(EntPayRedpackRequest request) throws WxPayException {
+    //企业微信签名,需要在请求签名之前
+    request.setNonceStr(String.valueOf(System.currentTimeMillis()));
+    request.setWorkWxSign(SignUtils.createEntSign(request.getActName(),request.getMchBillNo(),request.getMchId(),request.getNonceStr(),request.getReOpenid(),request.getTotalAmount(),request.getWxAppId(),"Hcf-X_dzLeaTIyK33okGmODK8sLzc7kLrgkWXOAoMbE","MD5"));
+
+    request.checkAndSign(this.payService.getConfig());
+
+    String url = this.payService.getPayBaseUrl() + "/mmpaymkttransfers/sendworkwxredpack";
+    String responseContent = this.payService.post(url, request.toXML(), true);
+    final EntPayRedpackResult result = BaseWxPayResult.fromXML(responseContent, EntPayRedpackResult.class);
+
+    result.checkResult(this.payService, request.getSignType(), true);
+    return result;
+  }
+
+  @Override
+  public EntPayRedpackQueryResult queryEnterpriseRedpack(EntPayRedpackQueryRequest request) throws WxPayException {
+    request.checkAndSign(this.payService.getConfig());
+    String url = this.payService.getPayBaseUrl() + "/mmpaymkttransfers/queryworkwxredpack";
+    String responseContent = this.payService.post(url, request.toXML(), true);
+    final EntPayRedpackQueryResult result = BaseWxPayResult.fromXML(responseContent, EntPayRedpackQueryResult.class);
+    result.checkResult(this.payService, request.getSignType(), true);
+    return result;
+  }
+
   private String encryptRSA(File publicKeyFile, String srcString) throws WxPayException {
     try {
       Security.addProvider(new BouncyCastleProvider());
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java
index 5591b016b..8490e0099 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java
@@ -91,7 +91,7 @@ public class SignUtils {
 
       if (shouldSign) {
         toSign.append(key).append("=").append(value).append("&");
-      }
+    }
     }
 
     toSign.append("key=").append(signKey);
@@ -102,6 +102,49 @@ public class SignUtils {
     }
   }
 
+  /**
+   * 企业微信签名
+   * @param signType md5 目前接口要求使用的加密类型
+   */
+  public static String createEntSign(String actName,String mchBillNo,String mchId,String nonceStr,
+                                     String reOpenid,Integer totalAmount,String wxAppId,String signKey,
+                                     String signType){
+    Map sortedMap = new HashMap<>();
+    sortedMap.put("act_name",actName);
+    sortedMap.put("mch_billno",mchBillNo);
+    sortedMap.put("mch_id",mchId);
+    sortedMap.put("nonce_str",nonceStr);
+    sortedMap.put("re_openid",reOpenid);
+    sortedMap.put("total_amount", totalAmount + "");
+    sortedMap.put("wxappid",wxAppId);
+
+    Map sortParams = new TreeMap<>(sortedMap);
+    Set> entries = sortParams.entrySet();
+    Iterator> iterator = entries.iterator();
+    StringBuilder toSign = new StringBuilder();
+    while(iterator.hasNext()){
+      Map.Entry entry = iterator.next();
+      String key = String.valueOf(entry.getKey());
+      String value = String.valueOf(entry.getValue());
+      boolean shouldSign = false;
+      if (StringUtils.isNotEmpty(value)) {
+        shouldSign = true;
+      }
+
+      if (shouldSign) {
+        toSign.append(key).append("=").append(value).append("&");
+      }
+    }
+    //企业微信这里字段名不一样
+    toSign.append("secret=").append(signKey);
+    if (SignType.HMAC_SHA256.equals(signType)) {
+      return me.chanjar.weixin.common.util.SignUtils.createHmacSha256Sign(toSign.toString(), signKey);
+    } else {
+      return DigestUtils.md5Hex(toSign.toString()).toUpperCase();
+    }
+
+  }
+
   /**
    * 校验签名是否正确.
    *
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImplTest.java
index 4c7f6e324..142bbbc73 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImplTest.java
@@ -1,8 +1,6 @@
 package com.github.binarywang.wxpay.service.impl;
 
-import com.github.binarywang.wxpay.bean.entpay.EntPayBankRequest;
-import com.github.binarywang.wxpay.bean.entpay.EntPayBankResult;
-import com.github.binarywang.wxpay.bean.entpay.EntPayRequest;
+import com.github.binarywang.wxpay.bean.entpay.*;
 import com.github.binarywang.wxpay.constant.WxPayConstants.CheckNameOption;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
@@ -10,7 +8,10 @@ import com.github.binarywang.wxpay.testbase.ApiTestModule;
 import com.google.inject.Inject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.annotations.*;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.concurrent.TimeUnit;
 
 /**
  * 
@@ -94,4 +95,57 @@ public class EntPayServiceImplTest {
   public void testQueryPayBank() throws Exception {
     this.logger.info(this.payService.getEntPayService().queryPayBank("123").toString());
   }
+
+
+
+  /**
+   * 发送企业红包
+   * @throws Exception the exception
+   */
+  @Test
+  public void testSendEnterpriseRedpack() {
+    EntPayRedpackRequest request = new EntPayRedpackRequest();
+    request.setMchId("1");
+    //商户单号
+    request.setMchBillNo(request.getMchId()+"20191202"+"1");
+    //企业微信corpid即为此appId
+    request.setWxAppId("1");
+//    request.setSenderName("1");
+//    request.setSenderHeaderMediaId("2");
+    request.setAgentId("1");
+    request.setReOpenid("1");
+    //目前企业微信api红包最低1块钱
+    request.setTotalAmount(1000);
+    request.setWishing("1");
+    request.setActName("1");
+    request.setRemark("1");
+
+    EntPayRedpackResult redpackResult = null;
+    try {
+      redpackResult = this.payService.getEntPayService().sendEnterpriseRedpack(request);
+    } catch (WxPayException e) {
+    }
+    this.logger.info(redpackResult.toString());
+  }
+
+  /**
+   * 查询企业红包
+   * @throws Exception
+   */
+  @Test
+  public void testQueryEnterpriseRedpack() throws Exception {
+    while (true) {
+      EntPayRedpackQueryRequest request = new EntPayRedpackQueryRequest();
+      request.setAppid("1");
+      request.setMchId("1");
+      request.setMchBillNo("1");
+
+      try {
+        EntPayRedpackQueryResult result = this.payService.getEntPayService().queryEnterpriseRedpack(request);
+        this.logger.info(result.toString());
+      } catch (Exception e) {
+      }
+      TimeUnit.SECONDS.sleep(3);
+    }
+  }
 }