微信支付-发红包模块

This commit is contained in:
faymanwang
2020-05-15 14:35:23 +08:00
parent d8d9cd6a88
commit 871a983833
3 changed files with 251 additions and 4 deletions

View File

@@ -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<WxPayConfigStorage> {
public PayMessage createMessage(Map<String, Object> message) {
return WxPayMessage.create(message);
}
/**
* 发放裂变红包
* 裂变红包:一次可以发放一组红包。首先领取的用户为种子用户,种子用户领取一组红包当中的一个,并可以通过社交分享将剩下的红包给其他用户。裂变红包充分利用了人际传播的优势。
*
* @author: faymanwang 1057438332@qq.com
* @param redpackOrder 红包实体
* @return 返回发红包实体后的结果
*/
public Map<String, Object> sendgroupredpack(RedpackOrder redpackOrder) {
Map<String, Object> parameters = new TreeMap<String, Object>();
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<String, Object> gethbinfo (String mchBillno) {
Map<String, Object> 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<String, Object> 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());
}
}

View File

@@ -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~9a~zA~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;
}
}

View File

@@ -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;
}
}