@@ -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,12 +272,16 @@ public abstract class BaseWxPayRequest implements Serializable { | |||||
this.setMchId(config.getMchId()); | 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())) { | if (StringUtils.isBlank(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 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 javax.crypto.Cipher; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileReader; | import java.io.FileReader; | ||||
import java.io.IOException; | |||||
import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
import java.nio.file.Files; | import java.nio.file.Files; | ||||
import java.nio.file.Path; | import java.nio.file.Path; | ||||
import java.security.PublicKey; | import java.security.PublicKey; | ||||
import java.security.Security; | import java.security.Security; | ||||
import javax.crypto.Cipher; | |||||
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; | |||||
/** | /** | ||||
* <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()); | ||||
@@ -91,7 +91,7 @@ public class SignUtils { | |||||
if (shouldSign) { | if (shouldSign) { | ||||
toSign.append(key).append("=").append(value).append("&"); | toSign.append(key).append("=").append(value).append("&"); | ||||
} | |||||
} | |||||
} | } | ||||
toSign.append("key=").append(signKey); | 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<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.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.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); | |||||
} | |||||
} | |||||
} | } |