传值:微信默认的金额为分
在jsp页面:var myCash =parseFloat(((document.getElementById("my_cash").value)*i)/100);(防止1.1*100=110.000000001的情况)
取值作比较时,硬数据库查出的数据应扩大100倍进行比较。传值前应进行倍数扩大。
生成的xml:
设置 将参数生成map
private static Map<String,String> getParamMap(String orderNNo,String openId,String myCash,String actName,String wishing,String remark) {
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("act_name", actName);//活动名称
paramMap.put("client_ip", clientIp);//接口调用机器IP地址
paramMap.put("mch_billno", orderNNo);//商户订单
paramMap.put("mch_id", mch_id);//商户号
paramMap.put("nonce_str", RoundUtil.getUUID());//随机字符串
paramMap.put("re_openid", openId);//用户openid
paramMap.put("remark", remark);//备注
paramMap.put("send_name", sendName);//发红包者名称
paramMap.put("total_amount", myCash);//付款金额
paramMap.put("total_num", "1");//红包发送总人数
paramMap.put("wishing", wishing);//红包祝福语
paramMap.put("wxappid", appid);//商户appid
paramMap.put("sign", getRedSignal(paramMap));//签名
return paramMap;
}
getOrderNo
public String getOrderNo() {
String order = mch_id + new SimpleDateFormat("yyyyMMddss").format(new Date());
Random r = new Random();
for (int i = 0; i < 2; i++) {
order += r.nextInt(9000) + 1000;
}
return order;
}
将 map拼装成xml
private static String createXML(Map<String, String> map){
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><xml>";
Set<String> set = map.keySet();
Iterator<String> i = set.iterator();
while(i.hasNext()){
String str = i.next();
xml+="<"+str+">"+"<![CDATA["+map.get(str)+"]]>"+"</"+str+">";
}
xml+="</xml>";
return xml;
}
getRedSignal
public static String getRedSignal(Map<String, String> params) {
SortedMap<String, String> packageParams = new TreeMap<String, String>();
for (Map.Entry<String, String> m : params.entrySet()) {
packageParams.put(m.getKey(), m.getValue().toString());
}
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 (!StringUtils.isEmpty(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key="+partnerkey);
System.out.println(sb.toString()+" EnvelopService.java");
String sign = RedMd5.MD5Encode(sb.toString(), charset).toUpperCase();
return sign;
}
发送xml请求
public static String doSend(String url, String data) throws Exception {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File(cerfile));//P12文件目录
try {
keyStore.load(instream, mch_id.toCharArray());//这里写密码..默认是你的MCHID
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, mch_id.toCharArray())
.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
try {
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(兼容; MSIE 8.0; Windows NT 6.0)");
httpost.setEntity(new StringEntity(data,"UTF-8"));
CloseableHttpResponse response = httpclient.execute(httpost);
try {
HttpEntity entity = response.getEntity();
String jsonStr = toStringInfo(response.getEntity(),charset);
EntityUtils.consume(entity);
return jsonStr;
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
取得返回值
String resXml = doSend(sendPacketUrl,xml);
//红包发送成功,状态判断
if(resXml.indexOf("<result_code><![CDATA[SUCCESS]]></result_code>")>-1) {
//发送成功
}