mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-10-31 10:38:42 +08:00 
			
		
		
		
	✨ #1309 增加发送和查询企业微信红包的接口
This commit is contained in:
		| @ -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 { | ||||||
|  |  | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -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; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -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; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -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; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -1,21 +1,20 @@ | |||||||
| package com.github.binarywang.wxpay.bean.request; | 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.config.WxPayConfig; | ||||||
| import com.github.binarywang.wxpay.exception.WxPayException; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||||
| import com.github.binarywang.wxpay.util.SignUtils; | import com.github.binarywang.wxpay.util.SignUtils; | ||||||
| import com.thoughtworks.xstream.XStream; | import com.thoughtworks.xstream.XStream; | ||||||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | import com.thoughtworks.xstream.annotations.XStreamAlias; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  | import lombok.experimental.Accessors; | ||||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||||
| import me.chanjar.weixin.common.util.BeanUtils; | import me.chanjar.weixin.common.util.BeanUtils; | ||||||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||||
| import me.chanjar.weixin.common.util.xml.XStreamInitializer; | 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; | 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") |   @XStreamAlias("sign_type") | ||||||
|   private String signType; |   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; |     return false; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 签名时,是否忽略sub_appid. | ||||||
|  |    * | ||||||
|  |    * @return the boolean | ||||||
|  |    */ | ||||||
|  |   protected boolean ignoreSubAppId() { | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   protected boolean ignoreSubMchId(){ | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 是否是企业微信字段 | ||||||
|  |    */ | ||||||
|  |   protected boolean isWxWorkSign(){ | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * 签名时,忽略的参数. |    * 签名时,忽略的参数. | ||||||
|    * |    * | ||||||
| @ -238,13 +272,17 @@ public abstract class BaseWxPayRequest implements Serializable { | |||||||
|       this.setMchId(config.getMchId()); |       this.setMchId(config.getMchId()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (!ignoreSubAppId()) { | ||||||
|       if (StringUtils.isBlank(getSubAppId())) { |       if (StringUtils.isBlank(getSubAppId())) { | ||||||
|         this.setSubAppId(config.getSubAppId()); |         this.setSubAppId(config.getSubAppId()); | ||||||
|       } |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!ignoreSubMchId()) { | ||||||
|       if (StringUtils.isBlank(getSubMchId())) { |       if (StringUtils.isBlank(getSubMchId())) { | ||||||
|         this.setSubMchId(config.getSubMchId()); |         this.setSubMchId(config.getSubMchId()); | ||||||
|       } |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (StringUtils.isBlank(getSignType())) { |     if (StringUtils.isBlank(getSignType())) { | ||||||
|       if (config.getSignType() != null && !ALL_SIGN_TYPES.contains(config.getSignType())) { |       if (config.getSignType() != null && !ALL_SIGN_TYPES.contains(config.getSignType())) { | ||||||
|  | |||||||
| @ -119,4 +119,28 @@ public interface EntPayService { | |||||||
|    * @throws WxPayException the wx pay exception |    * @throws WxPayException the wx pay exception | ||||||
|    */ |    */ | ||||||
|   EntPayBankQueryResult queryPayBank(EntPayBankQueryRequest request) throws WxPayException; |   EntPayBankQueryResult queryPayBank(EntPayBankQueryRequest request) throws WxPayException; | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 企业发送微信红包给个人用户 | ||||||
|  |    * <pre> | ||||||
|  |    *   文档地址:https://work.weixin.qq.com/api/doc | ||||||
|  |    *   接口地址: https://api.mch.weixin.qq.com/mmpaymkttransfers/sendworkwxredpack | ||||||
|  |    * </pre> | ||||||
|  |    * @param request 请求对象 | ||||||
|  |    * @return the wx pay send redpack result | ||||||
|  |    * @throws WxPayException the wx pay exception | ||||||
|  |    */ | ||||||
|  |   EntPayRedpackResult sendEnterpriseRedpack(EntPayRedpackRequest request) throws WxPayException; | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 企业发送微信红包查询 | ||||||
|  |    * <pre> | ||||||
|  |    *   文档地址:https://work.weixin.qq.com/api/doc | ||||||
|  |    *   接口地址: https://api.mch.weixin.qq.com/mmpaymkttransfers/queryworkwxredpack | ||||||
|  |    * </pre> | ||||||
|  |    * @param request 请求对象 | ||||||
|  |    * @return the wx pay send redpack result | ||||||
|  |    * @throws WxPayException the wx pay exception | ||||||
|  |    */ | ||||||
|  |   EntPayRedpackQueryResult queryEnterpriseRedpack(EntPayRedpackQueryRequest request) throws WxPayException; | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,35 +1,26 @@ | |||||||
| package com.github.binarywang.wxpay.service.impl; | package com.github.binarywang.wxpay.service.impl; | ||||||
|  |  | ||||||
| import java.io.File; | import com.github.binarywang.wxpay.bean.entpay.*; | ||||||
| import java.io.FileReader; | import com.github.binarywang.wxpay.bean.request.WxPayDefaultRequest; | ||||||
| import java.io.IOException; | import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; | ||||||
| import java.nio.charset.StandardCharsets; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||||
| import java.nio.file.Files; | import com.github.binarywang.wxpay.service.EntPayService; | ||||||
| import java.nio.file.Path; | import com.github.binarywang.wxpay.service.WxPayService; | ||||||
| import java.security.PublicKey; | import com.github.binarywang.wxpay.util.SignUtils; | ||||||
| import java.security.Security; |  | ||||||
| import javax.crypto.Cipher; |  | ||||||
|  |  | ||||||
| import org.apache.commons.codec.binary.Base64; | import org.apache.commons.codec.binary.Base64; | ||||||
| import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; | import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; | ||||||
| import org.bouncycastle.jce.provider.BouncyCastleProvider; | import org.bouncycastle.jce.provider.BouncyCastleProvider; | ||||||
| import org.bouncycastle.openssl.PEMParser; | import org.bouncycastle.openssl.PEMParser; | ||||||
| import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; | import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; | ||||||
|  |  | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayBankQueryRequest; | import javax.crypto.Cipher; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayBankQueryResult; | import java.io.File; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayBankRequest; | import java.io.FileReader; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayBankResult; | import java.nio.charset.StandardCharsets; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayQueryRequest; | import java.nio.file.Files; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayQueryResult; | import java.nio.file.Path; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayRequest; | import java.security.PublicKey; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayResult; | import java.security.Security; | ||||||
| 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; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * <pre> |  * <pre> | ||||||
| @ -140,6 +131,32 @@ public class EntPayServiceImpl implements EntPayService { | |||||||
|     return result; |     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 { |   private String encryptRSA(File publicKeyFile, String srcString) throws WxPayException { | ||||||
|     try { |     try { | ||||||
|       Security.addProvider(new BouncyCastleProvider()); |       Security.addProvider(new BouncyCastleProvider()); | ||||||
|  | |||||||
| @ -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<String, String> 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<String, String> sortParams = new TreeMap<>(sortedMap); | ||||||
|  |     Set<Map.Entry<String, String>> entries = sortParams.entrySet(); | ||||||
|  |     Iterator<Map.Entry<String, String>> 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(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * 校验签名是否正确. |    * 校验签名是否正确. | ||||||
|    * |    * | ||||||
|  | |||||||
| @ -1,8 +1,6 @@ | |||||||
| package com.github.binarywang.wxpay.service.impl; | package com.github.binarywang.wxpay.service.impl; | ||||||
|  |  | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayBankRequest; | import com.github.binarywang.wxpay.bean.entpay.*; | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayBankResult; |  | ||||||
| import com.github.binarywang.wxpay.bean.entpay.EntPayRequest; |  | ||||||
| import com.github.binarywang.wxpay.constant.WxPayConstants.CheckNameOption; | import com.github.binarywang.wxpay.constant.WxPayConstants.CheckNameOption; | ||||||
| import com.github.binarywang.wxpay.exception.WxPayException; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||||
| import com.github.binarywang.wxpay.service.WxPayService; | import com.github.binarywang.wxpay.service.WxPayService; | ||||||
| @ -10,7 +8,10 @@ import com.github.binarywang.wxpay.testbase.ApiTestModule; | |||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||||
| import org.testng.annotations.*; | import org.testng.annotations.Guice; | ||||||
|  | import org.testng.annotations.Test; | ||||||
|  |  | ||||||
|  | import java.util.concurrent.TimeUnit; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * <pre> |  * <pre> | ||||||
| @ -94,4 +95,57 @@ public class EntPayServiceImplTest { | |||||||
|   public void testQueryPayBank() throws Exception { |   public void testQueryPayBank() throws Exception { | ||||||
|     this.logger.info(this.payService.getEntPayService().queryPayBank("123").toString()); |     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); | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 酱油99号
					酱油99号