From 871a9838337c783ad4431c2e4c7a959dc6f39ff7 Mon Sep 17 00:00:00 2001 From: faymanwang <1057438332@qq.com> Date: Fri, 15 May 2020 14:35:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98-=E5=8F=91?= =?UTF-8?q?=E7=BA=A2=E5=8C=85=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/wx/api/WxPayService.java | 60 ++++++- .../com/egzosn/pay/wx/bean/RedpackOrder.java | 152 ++++++++++++++++++ .../egzosn/pay/wx/bean/WxSendredpackType.java | 43 +++++ 3 files changed, 251 insertions(+), 4 deletions(-) create mode 100644 pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java create mode 100644 pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java index 2814e1f..845f1b9 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java @@ -12,11 +12,9 @@ import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.sign.encrypt.RSA2; import com.egzosn.pay.common.util.str.StringUtils; -import com.egzosn.pay.wx.bean.WxPayError; -import com.egzosn.pay.wx.bean.WxPayMessage; -import com.egzosn.pay.wx.bean.WxTransactionType; +import com.egzosn.pay.wx.bean.*; import com.egzosn.pay.common.util.XML; -import com.egzosn.pay.wx.bean.WxTransferType; + import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; @@ -757,4 +755,58 @@ public class WxPayService extends BasePayService { public PayMessage createMessage(Map message) { return WxPayMessage.create(message); } + + /** + * 发放裂变红包 + * 裂变红包:一次可以发放一组红包。首先领取的用户为种子用户,种子用户领取一组红包当中的一个,并可以通过社交分享将剩下的红包给其他用户。裂变红包充分利用了人际传播的优势。 + * + * @author: faymanwang 1057438332@qq.com + * @param redpackOrder 红包实体 + * @return 返回发红包实体后的结果 + */ + public Map sendgroupredpack(RedpackOrder redpackOrder) { + Map parameters = new TreeMap(); + redpackParam(redpackOrder, parameters); + parameters.put("amt_type", "ALL_RAND"); + parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDGROUPREDPACK), XML.getMap2Xml(parameters) , JSONObject.class); + } + + /** + * 查询红包记录 + * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包 + * 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。 + * + * @author: faymanwang 1057438332@qq.com + * @param mchBillno 商户发放红包的商户订单号 + * @return 返回查询结果 + */ + public Map gethbinfo (String mchBillno) { + Map parameters = this.getPublicParameters(); + parameters.put("mch_billno", mchBillno); + parameters.put("bill_type", "MCHT"); + parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + return requestTemplate.postForObject(getReqUrl( WxSendredpackType.GETHBINFO), XML.getMap2Xml(parameters) , JSONObject.class); + } + + /** + * 微信红包构造参数方法 + * @param redpackOrder 红包实体 + * @param parameters + */ + private void redpackParam(RedpackOrder redpackOrder, Map parameters) { + parameters.put(NONCE_STR, SignUtils.randomStr()); + parameters.put(MCH_ID, payConfigStorage.getPid()); + parameters.put("wxappid", payConfigStorage.getAppid()); + parameters.put("send_name", redpackOrder.getSendName()); + parameters.put("re_openid", redpackOrder.getReOpenid()); + parameters.put("mch_billno", redpackOrder.getMchBillno()); + parameters.put("total_amount", Util.conversionCentAmount(redpackOrder.getTotalAmount())); + parameters.put("total_num", redpackOrder.getTotalNum() > 0 ? redpackOrder.getTotalNum() : 1); + parameters.put("wishing", redpackOrder.getWishing()); + parameters.put("client_ip", StringUtils.isNotEmpty(redpackOrder.getIp()) ? redpackOrder.getIp() : "192.168.0.1"); + parameters.put("act_name", redpackOrder.getActName()); + parameters.put("remark", redpackOrder.getRemark()); + parameters.put("scene_id", redpackOrder.getSceneId()); + } } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java new file mode 100644 index 0000000..801f94f --- /dev/null +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java @@ -0,0 +1,152 @@ +package com.egzosn.pay.wx.bean; + +import java.math.BigDecimal; + +/** + * @description: + * @author: 保网 faymanwang 1057438332@qq.com + * @time: 2020/5/15 12:40 + */ +public class RedpackOrder { + /** + * 商户订单号(每个订单号必须唯一。取值范围:0~9,a~z,A~Z) + * 接口根据商户订单号支持重入,如出现超时可再调用 + */ + private String mchBillno; + + /** + * 商户名称:红包发送者名称 + */ + private String sendName; + + /** + * 用户openid + */ + private String reOpenid; + + /** + * 付款金额 每个红包金额必须在默认额度内(默认大于1元,小于200元,可在产品设置中自行申请调高额度) + */ + private BigDecimal totalAmount; + + /** + * 红包发放总人数 + * 普通红包:1 + * 裂变:必须介于(包括)3到20之间 + */ + private int totalNum; + + /** + * 红包祝福语 + */ + private String wishing; + + /** + * 操作者ip,根据支付平台所需进行设置 + */ + private String ip; + + /** + * 活动名称 + */ + private String actName; + + /** + * 备注 + */ + private String remark; + + /** + * 发放红包使用场景,红包金额大于200或者小于1元时必传 + * PRODUCT_1:商品促销 + * PRODUCT_2:抽奖 + * PRODUCT_3:虚拟物品兑奖 + * PRODUCT_4:企业内部福利 + * PRODUCT_5:渠道分润 + * PRODUCT_6:保险回馈 + * PRODUCT_7:彩票派奖 + * PRODUCT_8:税务刮奖 + */ + private String sceneId; + + + public String getMchBillno() { + return mchBillno; + } + + public void setMchBillno(String mchBillno) { + this.mchBillno = mchBillno; + } + + public String getSendName() { + return sendName; + } + + public void setSendName(String sendName) { + this.sendName = sendName; + } + + public String getReOpenid() { + return reOpenid; + } + + public void setReOpenid(String reOpenid) { + this.reOpenid = reOpenid; + } + + public BigDecimal getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(BigDecimal totalAmount) { + this.totalAmount = totalAmount; + } + + public int getTotalNum() { + return totalNum; + } + + public void setTotalNum(int totalNum) { + this.totalNum = totalNum; + } + + public String getWishing() { + return wishing; + } + + public void setWishing(String wishing) { + this.wishing = wishing; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getActName() { + return actName; + } + + public void setActName(String actName) { + this.actName = actName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSceneId() { + return sceneId; + } + + public void setSceneId(String sceneId) { + this.sceneId = sceneId; + } +} diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java new file mode 100644 index 0000000..6e114b2 --- /dev/null +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java @@ -0,0 +1,43 @@ +package com.egzosn.pay.wx.bean; + +import com.egzosn.pay.common.bean.TransferType; + +/** + * @description: + * @author: faymanwang + * @time: 2020/5/14 20:11 + */ +public enum WxSendredpackType implements TransferType { + /** + * 现金红包-发放红包接口 + */ + SENDREDPACK("mmpaymkttransfers/sendredpack"), + /** + * 现金红包-发放裂变红包 + */ + SENDGROUPREDPACK("mmpaymkttransfers/sendgroupredpack"), + /** + * 现金红包-查询红包记录 + */ + GETHBINFO ("mmpaymkttransfers/gethbinfo"), + /** + * 小程序 + */ + SENDMINIPROGRAMHB ("mmpaymkttransfers/sendminiprogramhb") + + ; + + WxSendredpackType(String method) { + this.method = method; + } + private String method; + + @Override + public String getType() { + return this.name(); + } + @Override + public String getMethod() { + return this.method; + } +}