packagecom.dcqq.common.utils.wx;importjava.security.MessageDigest;publicclassMD5{privatestaticStringbyteArrayToHexString(byte b[]){StringBuffer resultSb =newStringBuffer();for(int i =0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}privatestaticStringbyteToHexString(byte b){int n = b;if(n <0)n +=256;int d1 = n /16;int d2 = n %16;return hexDigits[d1]+ hexDigits[d2];}publicstaticStringMD5Encode(String origin,String charsetname){String resultString =null;try{resultString =newString(origin);MessageDigest md =MessageDigest.getInstance("MD5");if(charsetname ==null||"".equals(charsetname))resultString =byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString =byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));}catch(Exception exception){}return resultString;}privatestaticfinalString hexDigits[]={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};}
packagecom.dcqq.common.utils.wx;importjava.text.SimpleDateFormat;importjava.util.*;publicclassPayCommonUtil{/*** 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。* @return boolean*/publicstaticbooleanisTenpaySign(String characterEncoding,SortedMap<Object,Object> packageParams,StringAPI_KEY){StringBuffer sb =newStringBuffer();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 =MD5.MD5Encode(sb.toString(), characterEncoding).toLowerCase();String tenpaySign =((String)packageParams.get("sign")).toLowerCase();//System.out.println(tenpaySign + " " + mysign);return tenpaySign.equals(mysign);}/*** @author* @Description:sign签名 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3* @param characterEncoding* 编码格式* @param parameters* 请求参数* @return*/publicstaticStringcreateSign(String characterEncoding,SortedMap<String,Object> packageParams,StringAPI_KEY){StringBuffer sb =newStringBuffer();Set es = packageParams.entrySet();Iterator it = es.iterator();while(it.hasNext()){Map.Entry entry =(Map.Entry) it.next();String k = entry.getKey().toString();String v = entry.getValue().toString();if(null!= v &&!"".equals(v)&&!"sign".equals(k)&&!"key".equals(k)){sb.append(k +"="+ v +"&");}}sb.append("key="+API_KEY);System.out.println(sb.toString());String sign =MD5.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}/*** @author* @Description:将请求参数转换为xml格式的string* @param parameters* 请求参数* @return*/publicstaticStringgetRequestXml(SortedMap<String,Object> parameters){StringBuffer sb =newStringBuffer();sb.append("<xml>");Set es = parameters.entrySet();Iterator it = es.iterator();while(it.hasNext()){Map.Entry entry =(Map.Entry) it.next();String k = entry.getKey().toString();String v = entry.getValue().toString();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 返回生成的随机数。*/publicstaticintbuildRandom(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*/publicstaticStringgetCurrTime(){Date now =newDate();SimpleDateFormat outFormat =newSimpleDateFormat("yyyyMMddHHmmss");String s = outFormat.format(now);return s;}}
packagecom.dcqq.common.utils.wx;importorg.jdom.Document;importorg.jdom.Element;importorg.jdom.JDOMException;importorg.jdom.input.SAXBuilder;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;publicclassXMLUtil{publicstaticMapdoXMLParse(String strxml)throwsJDOMException,IOException{strxml = strxml.replaceFirst("encoding=\".*\"","encoding=\"UTF-8\"");if(null== strxml ||"".equals(strxml)){returnnull;}Map m =newHashMap();InputStream in =newByteArrayInputStream(strxml.getBytes("UTF-8"));SAXBuilder builder =newSAXBuilder();Document doc = builder.build(in);Element root = doc.getRootElement();List list = root.getChildren();Iterator it = list.iterator();while(it.hasNext()){Element e =(Element) it.next();String k = e.getName();String v ="";List children = e.getChildren();if(children.isEmpty()){v = e.getTextNormalize();}else{v =XMLUtil.getChildrenText(children);}m.put(k, v);}//关闭流in.close();return m;}/*** 获取子结点的xml* @param children* @return String*/publicstaticStringgetChildrenText(List children){StringBuffer sb =newStringBuffer();if(!children.isEmpty()){Iterator it = children.iterator();while(it.hasNext()){Element e =(Element) it.next();String name = e.getName();String value = e.getTextNormalize();List list = e.getChildren();sb.append("<"+ name +">");if(!list.isEmpty()){sb.append(XMLUtil.getChildrenText(list));}sb.append(value);sb.append("</"+ name +">");}}return sb.toString();}}
Windows Server虚拟化性能终极优化:KVM virtio驱动完整部署指南 【免费下载链接】kvm-guest-drivers-windows Windows paravirtualized drivers for QEMU\KVM 项目地址: https://gitcode.com/gh_mirrors/kv/kvm-guest-drivers-windows
在Windows Server虚拟化…
DIY玩家必备:使用FlashGBX写入自定义ROM到Game Boy闪存卡教程
DIY玩家必备:使用FlashGBX写入自定义ROM到Game Boy闪存卡教程 【免费下载链接】FlashGBX Reads and writes Game Boy and Game Boy Advance cartridge data. Supported hardware: GBxCart RW, GBFlash, Joey Jr, Game Bub 项目地址: https://gitcode.com/gh_mirro…
LaserWeb4终极指南:如何轻松掌控你的激光切割机 【免费下载链接】LaserWeb4 Collaborative effort on the next version of LaserWeb / CNCWeb 项目地址: https://gitcode.com/gh_mirrors/la/LaserWeb4
LaserWeb4是一款强大的开源激光切割软件,让…
从零构建企业级智能监控系统:Frigate 0.18.0终极部署指南
从零构建企业级智能监控系统:Frigate 0.18.0终极部署指南 【免费下载链接】frigate NVR with realtime local object detection for IP cameras 项目地址: https://gitcode.com/GitHub_Trending/fr/frigate
还在为传统监控系统的延迟、云端依赖和复杂配置而烦…