mirror of
https://gitee.com/egzosn/pay-java-parent.git
synced 2026-06-08 10:24:03 +08:00
微信支付-发红包模块
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user