要实现微信扫码找零(现金红包),首先必须申请一个商户号。本文采用的是服务商模式的商户号,给客户(子商户)开通。
但是开通现金红包条件不简单,我们先看一下官方说明。
单单是上面的入驻超过90天,联系交易30就很难满足(因为客户已开通微信支付,就需要使用)。
后来了解到只需要申请结算周期为T+7的商户号,就能够直接使用了。
于是乎,解决了最大的问题,接下来就是开发了,下面是部分代码,供参考。
1. 准备请求参数
PayRedPackBean.java
package com.pay.wechat.bo.redpack.bean;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import com.dlys.pay.wechat.util.Signature;
import com.tenet.util.uuid.UUIDUtil19;
/**
* 现金红包实体
*
* @author libaibai
* @version 1.0
*/
public class PayRedPackBean {
public String nonce_str = UUIDUtil19.uuid();
public String sign;
public String mch_billno; // 商户订单号,接口根据商户订单号支持重入,如出现超时可再调用
public String mch_id; // 商户号
public String sub_mch_id; // 子商户号
// 微信分配的公众账号ID(企业号corpid即为此appId)。接口传入的所有appid应该为公众号的appid
public String wxappid;
// 服务商模式下触达用户时的appid(可填服务商自己的appid)
public String msgappid;
public String send_name; // 红包发送者名称
public String re_openid; // 接受红包的用户 ,服务商模式下可填入msgappid下的openid。
public int total_amount; // 付款金额,单位份
public int total_num = 1;// 发放人总数
public String wishing; // 红包祝福语
public String client_ip; // 调用接口的机器Ip地址
public String act_name; // 活动名称
public String remark; // 备注
public String scene_id = "PRODUCT_1"; // 场景id,发放红包使用场景,红包金额大于200或者小于1元时必传
public PayRedPackBean(String mch_billno, String mch_id, String sub_mch_id, String wxappid,
String msgappid, String send_name, String re_openid, int total_amount, String wishing,
String client_ip, String act_name, String remark, String key) {
this.mch_billno = mch_billno;
this.mch_id = mch_id;
this.sub_mch_id = sub_mch_id;
this.wxappid = wxappid;
this.msgappid = msgappid;
this.send_name = send_name;
this.re_openid = re_openid;
this.total_amount = total_amount;
this.wishing = wishing;
this.client_ip = client_ip;
this.act_name = act_name;
this.remark = remark;
this.sign = Signature.getSign(toMap(), key);
}
public String getNonce_str() {
return nonce_str;
}
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getMch_billno() {
return mch_billno;
}
public void setMch_billno(String mch_billno) {
this.mch_billno = mch_billno;
}
public String getMch_id() {
return mch_id;
}
public void setMch_id(String mch_id) {
this.mch_id = mch_id;
}
public String getSub_mch_id() {
return sub_mch_id;
}
public void setSub_mch_id(String sub_mch_id) {
this.sub_mch_id = sub_mch_id;
}
public String getWxappid() {
return wxappid;
}
public void setWxappid(String wxappid) {
this.wxappid = wxappid;
}
public String getMsgappid() {
return msgappid;
}
public void setMsgappid(String msgappid) {
this.msgappid = msgappid;
}
public String getSend_name() {
return send_name;
}
public void setSend_name(String send_name) {
this.send_name = send_name;
}
public String getRe_openid() {
return re_openid;
}
public void setRe_openid(String re_openid) {
this.re_openid = re_openid;
}
public int getTotal_amount() {
return total_amount;
}
public void setTotal_amount(int total_amount) {
this.total_amount = total_amount;
}
public int getTotal_num() {
return total_num;
}
public void setTotal_num(int total_num) {
this.total_num = total_num;
}
public String getWishing() {
return wishing;
}
public void setWishing(String wishing) {
this.wishing = wishing;
}
public String getClient_ip() {
return client_ip;
}
public void setClient_ip(String client_ip) {
this.client_ip = client_ip;
}
public String getAct_name() {
return act_name;
}
public void setAct_name(String act_name) {
this.act_name = act_name;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getScene_id() {
return scene_id;
}
public void setScene_id(String scene_id) {
this.scene_id = scene_id;
}
public Map toMap() {
Map map = new HashMap();
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
Object obj;
try {
obj = field.get(this);
if (obj != null) {
map.put(field.getName(), obj);
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
return map;
}
}
public static String SENDREDPACK_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
/**
* 发送现金红包
*
* @param payRedPackBean 这个数据对象里面包含了API要求提交的各种数据字段
* @return API返回的数据
* @throws Exception
*/
public String requestRedPack(PayRedPackBean payRedPackBean) throws Exception {
super.apiURL = Config.SENDREDPACK_URL;
String responseString = sendPost(payRedPackBean);
return responseString;
}
/**
* 发送红包工具类
*
* @param mch_billno 订单号UUID
* @param appid
* @param mch_id
* @param sub_mch_id
* @param openId 接受人openId
* @param key
* @param send_name 发红包人名称
* @param total_amount
* @param client_ip
* @return
*/
public Map send(String mch_billno, String appid, String mch_id,
String sub_mch_id, String openId, String key, String send_name, int total_amount) {
String wishing = "找零";
String act_name = "找零";
String remark = "找零";
String client_ip = "127.0.0.1";
PayRedPackBean data = new PayRedPackBean(mch_billno, mch_id, sub_mch_id, appid, appid,
send_name, openId, total_amount, wishing, client_ip, act_name, remark, key);
try {
String xmlMsg = scanPayService.requestRedPack(data);
LOG.info("PayPackUtil-发送现金红包微信响应,xmlMsg=" + xmlMsg + ",send_name=" + send_name);
return XMLParser.getMapFromXML(xmlMsg);
} catch (Exception e) {
LOG.error("请求微信红包时出错!", e);
return null;
}
}
特别注意:本人向微信了解过,商户号是用户收钱的,不能仅仅用于发红包的,所有大家如果申请的商户号只用于发红包的话,就要特别注意了,一不小心就被风控了(本人未验证,有验证的同学也可以告诉我答案)
好了,接下来就可以愉快的使用微信扫码找零了,妈妈再也不用担心现金不够了。
小程序给用户发红包的两种方式,第一种调用小程序红包接口和领取红包接口这种场景为扫码打开小程序,适合线下推广;第二种调用关联微信支付的微信付款到零钱接口,现金可直接打到微信用户的零钱帐户。具体可参考这篇博文《用微信小程序发红包的两种方法》https://www.big4ever.com/article/7
【企业付款到零钱+现金红包】快捷快速开通详解https://shimo.im/docs/kqvcCKKxh96dYHtR
大佬求教 total_num 这个人数的作用是什么,如果写2会怎么样
妈妈从来也不用担心现金不够