微信发送红包接口

/**
*红包工具类
*/
public class HongBaoUtil {
	private String nonce_str;// 随机字符串
    private String sign;// 签名
    private String mch_billno;// 商户订单号
    private String mch_id;// 商户号
    private String wxappid;// 公众账号
    private String send_name;// 商户名称
    private String re_openid;// 用户
    private int total_amount;// 付款金额
    private int total_num;// 红包发放总人数
    private String wishing;// 红包祝福语
    private String client_ip;// Ip地址
    private String act_name;// 活动名称
    private String remark;// 备注

    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 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 getWxappid() {
        return wxappid;
    }

    public void setWxappid(String wxappid) {
        this.wxappid = wxappid;
    }

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

//发送红包

                            String noncestr = "Wm3WZYTPz0wzccnW";                            
                            HongBaoUtil entry = new HongBaoUtil();
							entry.setAct_name("影像界最强大脑");
				        	entry.setClient_ip("127.0.0.1");
				        	entry.setMch_id("120700770");
				        	entry.setNonce_str(noncestr);
				        	entry.setRe_openid(cacUser.getOpenid());
				        	entry.setRemark("影像界最强大脑活动答对奖金红包");
				        	entry.setSend_name("aaa");
				        	entry.setTotal_amount(100);//红包金额
				        	entry.setTotal_num(1);
				        	entry.setWishing("恭喜您回答正确,再接再厉!");
				        	entry.setWxappid(WXConfig.appid);//微信公众号appid
//商户订单号
							String mchBillnos = cacUser.getId()+"c"+userBonus.getId()+"a"+System.currentTimeMillis();
							entry.setMch_billno(mchBillnos);
							Map<String, Object> returnmap = sendRedPack(entry);
                            if(returnmap.get("return_code").toString().equals("SUCCESS"))                                            
                            {
                                System.out.println("发送成功");
                            }
//发送红包
	 public  Map<String, Object> sendRedPack(HongBaoUtil redPack) throws Exception{
        String sign = createSendRedPackOrderSign(redPack);
        redPack.setSign(sign);
        StringBuilder string = new StringBuilder();
        string.append("<xml>");//
        string.append("<nonce_str><![CDATA["+redPack.getNonce_str()+"]]></nonce_str>");
        string.append("<sign><![CDATA["+redPack.getSign()+"]]></sign>");
        string.append("<mch_billno><![CDATA["+redPack.getMch_billno()+"]]></mch_billno>");
        string.append("<mch_id><![CDATA["+redPack.getMch_id()+"]]></mch_id>");
        string.append("<wxappid><![CDATA["+redPack.getWxappid()+"]]></wxappid>");
        string.append("<send_name><![CDATA["+redPack.getSend_name()+"]]></send_name>");
        string.append("<re_openid><![CDATA["+redPack.getRe_openid()+"]]></re_openid>");
        string.append("<total_amount><![CDATA["+redPack.getTotal_amount()+"]]></total_amount>");
        string.append("<total_num><![CDATA["+redPack.getTotal_num()+"]]></total_num>");
        string.append("<wishing><![CDATA["+redPack.getWishing()+"]]></wishing>");
        string.append("<client_ip><![CDATA["+redPack.getClient_ip()+"]]></client_ip>");
        string.append("<act_name><![CDATA["+redPack.getAct_name()+"]]></act_name>");
        string.append("<remark><![CDATA["+redPack.getRemark()+"]]></remark>");
        string.append("</xml>");
        String response = ssl("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack",string.toString());
        
//        System.out.println("-->response-->"+response);
        
        Map<String, Object> map = xml2map(response, false); 
        return map;
    }


public String createSendRedPackOrderSign(HongBaoUtil redPack){
    	SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>(); 
    	
        packageParams.put("act_name",redPack.getAct_name());
        packageParams.put("client_ip",redPack.getClient_ip());
        packageParams.put("mch_billno",redPack.getMch_billno());
        packageParams.put("mch_id",redPack.getMch_id());
        packageParams.put("nonce_str",redPack.getNonce_str());
        packageParams.put("re_openid",redPack.getRe_openid());
        packageParams.put("remark",redPack.getRemark());
        packageParams.put("send_name",redPack.getSend_name());
        packageParams.put("total_amount",redPack.getTotal_amount());
        packageParams.put("total_num",redPack.getTotal_num());
        packageParams.put("wishing",redPack.getWishing());
        packageParams.put("wxappid",redPack.getWxappid());
        return PayCommonUtil.createSign("UTF-8", packageParams,WXConfig.MCH_API_KEY);
    }


private String ssl(String url,String data){
        StringBuffer message = new StringBuffer();
        try {
            KeyStore keyStore  = KeyStore.getInstance("PKCS12");
            //秘钥
            FileInputStream instream = new FileInputStream(new File("/var/tomcat-8.0.30/aaa/webapps/ROOT/file/apiclient_cert.p12"));
            try {
            	keyStore.load(instream, "1267047700".toCharArray());//密码
			}finally {
				instream.close();
			}
            
            SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "1267047701".toCharArray()).build();
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
            CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
            HttpPost httpost = new HttpPost(url);

            httpost.addHeader("Connection", "keep-alive");
            httpost.addHeader("Accept", "*/*");
            httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            httpost.addHeader("Host", "api.mch.weixin.qq.com");
            httpost.addHeader("X-Requested-With", "XMLHttpRequest");
            httpost.addHeader("Cache-Control", "max-age=0");
            httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
            httpost.setEntity(new StringEntity(data, "UTF-8"));

            CloseableHttpResponse response = httpclient.execute(httpost);
            try {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    System.out.println("Response content length: " + entity.getContentLength());
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
                    String text;
                    while ((text = bufferedReader.readLine()) != null) {
                        message.append(text);
                    }
                }
                EntityUtils.consume(entity);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                response.close();
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        } 
        return message.toString();
    }
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

import org.apache.log4j.Logger;

public class PayCommonUtil {
    
	public static Logger logger = Logger.getLogger(PayCommonUtil.class);
    /**
     * 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
     * @return boolean
     */  
    public static boolean isTenpaySign(String characterEncoding, SortedMap<String, Object> packageParams, String API_KEY) {  
        StringBuffer sb = new StringBuffer();  
        Set es = packageParams.entrySet();  
        Iterator it = es.iterator();  
        while(it.hasNext()) {  
            Map.Entry entry = (Map.Entry)it.next();  
            String k = (String)entry.getKey();  
            String v = (String)entry.getValue();  
            if(!"sign".equals(k) && null != v && !"".equals(v)) {  
                sb.append(k + "=" + v + "&");  
            }  
        }  
          
        sb.append("key=" + API_KEY);  
          
        //算出摘要  
        String mysign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase();  
        String tenpaySign = ((String)packageParams.get("sign")).toLowerCase();  
 
        return tenpaySign.equals(mysign);  
    }  
 
    /**
     * @author
     * @date 2016-4-22
     * @Description:sign签名
     * @param characterEncoding
     *            编码格式
     * @param parameters
     *            请求参数
     * @return
     */  
    public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  
        StringBuffer sb = new StringBuffer();  
        Set es = packageParams.entrySet();  
        Iterator it = es.iterator();  
        while (it.hasNext()) {  
            Map.Entry entry = (Map.Entry) it.next();  
            String k = (String) entry.getKey();  
            String v = "";
            try {
                v = (String) entry.getValue();
            } catch (Exception e) {
                // TODO: handle exception
                v = entry.getValue() + "";
            }
             
            if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {  
                sb.append(k + "=" + v + "&");  
            }  
        }  
        sb.append("key=" + API_KEY);  
        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  
        return sign;  
    }  
   
    /**
     * @author
     * @date 2016-4-22
     * @Description:将请求参数转换为xml格式的string
     * @param parameters
     *            请求参数
     * @return
     */  
    public static String getRequestXml(SortedMap<Object, Object> parameters) {  
        StringBuffer sb = new StringBuffer();  
        sb.append("<xml>");  
        Set es = parameters.entrySet();  
        Iterator it = es.iterator();  
        while (it.hasNext()) {  
            Map.Entry entry = (Map.Entry) it.next();  
            String k = (String) entry.getKey();
            String v = "";
            try {
                v = (String) entry.getValue();
            } catch (Exception e) {
                // TODO: handle exception
                v = entry.getValue() + "";
            }
             
            if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {  
                sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");  
            } else {  
                sb.append("<" + k + ">" + v + "</" + k + ">");  
            }  
        }  
        sb.append("</xml>");  
        return sb.toString();  
    }  
 
    /**
     * 取出一个指定长度大小的随机正整数.
     *  
     * @param length
     *            int 设定所取出随机数的长度。length小于11
     * @return int 返回生成的随机数。
     */  
    public static int buildRandom(int length) {  
        int num = 1;  
        double random = Math.random();  
        if (random < 0.1) {  
            random = random + 0.1;  
        }  
        for (int i = 0; i < length; i++) {  
            num = num * 10;  
        }  
        return (int) ((random * num));  
    }  
 
    /**
     * 获取当前时间 yyyyMMddHHmmss
     *  
     * @return String
     */  
    public static String getCurrTime() {  
        Date now = new Date();  
        SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");  
        String s = outFormat.format(now);  
        return s;  
    }  
}
public class MD5Util {

	private static String byteArrayToHexString(byte b[]) {
		StringBuffer resultSb = new StringBuffer();
		for (int i = 0; i < b.length; i++)
			resultSb.append(byteToHexString(b[i]));

		return resultSb.toString();
	}

	private static String byteToHexString(byte b) {
		int n = b;
		if (n < 0)
			n += 256;
		int d1 = n / 16;
		int d2 = n % 16;
		return hexDigits[d1] + hexDigits[d2];
	}

	public static String MD5Encode(String origin, String charsetname) {
		String resultString = null;
		try {
			resultString = new String(origin);
			MessageDigest md = MessageDigest.getInstance("MD5");
			if (charsetname == null || "".equals(charsetname))
				resultString = byteArrayToHexString(md.digest(resultString
						.getBytes()));
			else
				resultString = byteArrayToHexString(md.digest(resultString
						.getBytes(charsetname)));
		} catch (Exception exception) {
		}
		return resultString;
	}

	private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
			"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

}

所需JAR包连接:https://download.csdn.net/download/huidanyige/12035923

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值