/**
*红包工具类
*/
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