Java 反射机制详解及实例反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧!           一,先看一下反射的概念:              主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。             反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!             看概念很晕的,继续往下看。       二,反射机制的作用:              1,反编译:.class-->.Java              2,通过反射机制访问java对象的属性,方法,构造方法等;             这样好像更容易理解一些,下边我们具体看怎么实现这些功能。      三,在这里先看一下sun为我们提供了那些反射机制中的类:java.lang.Class; java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method;java.lang.reflect.Modifier;            很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。         四,具体功能实现:                1,反射机制获取类有三种方法,我们来获取Employee类型//第一种方式: Classc1 = Class.forName("Employee"); //第二种方式: //java中每个类型都有class 属性. Classc2 = Employee.class; //第三种方式: //java语言中任何一个java对象都有getClass 方法 Employeee = new Employee(); Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)      2,创建对象:获取类以后我们来创建它的对象,利用newInstance:Class c =Class.forName("Employee"); //创建此Class 对象所表示的类的一个新实例 Objecto = c.newInstance(); //调用了Employee的无参数构造方法.     3,获取属性:分为所有的属性和指定的属性:      a,先看获取所有的属性的写法://获取整个类 Class c = Class.forName("java.lang.Integer"); //获取所有的属性? Field[] fs = c.getDeclaredFields(); //定义可变长的字符串,用来存储属性 StringBuffer sb = new StringBuffer(); //通过追加的方法,将每个属性拼接到此字符串中 //最外边的public定义 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); //里边的每一个属性 for(Field field:fs){ sb.append("\t");//空格 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 sb.append(field.getName()+";\n");//属性的名字+回车 } sb.append("}"); System.out.println(sb);        b,获取特定的属性,对比着传统的方法来学习:public static void main(String[] args) throws Exception{ <span style="white-space:pre"> </span>//以前的方式: /* User u = new User(); u.age = 12; //set System.out.println(u.age); //get */ //获取类 Class c = Class.forName("User"); //获取id属性 Field idF = c.getDeclaredField("id"); //实例化这个类赋给o Object o = c.newInstance(); //打破封装 idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 //给o对象的id属性赋值"110" idF.set(o, "110"); //set //get System.out.println(idF.get(o)); }  4,获取方法,和构造方法,不再详细描述,只来看一下关键字: 方法关键字 含义 getDeclaredMethods() 获取所有的方法 getReturnType() 获得方法的放回类型 getParameterTypes() 获得方法的传入参数类型 getDeclaredMethod("方法名",参数类型.class,……) 获得特定的方法     构造方法关键字 含义 getDeclaredConstructors() 获取所有的构造方法 getDeclaredConstructor(参数类型.class,……) 获取特定的构造方法     父类和父接口 含义 getSuperclass() 获取某类的父类 getInterfaces() 获取某类实现的接口          这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。   五,反射加配置文件,使我们的程序更加灵活:             在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:             当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容: <configuration> lt;appSettings> <add key="" value=""/> lt;/appSettings> </configuration>  反射的写法:   assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);            这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。                     当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!    综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

使用前注意事项:1、由于Java面向对象编程的特性, 在命名时应尽量选择名词2、驼峰命名法(Camel-Case): 当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首字母以小写开头,每个单词首字母大写(第一个单词除外)。如:myFirstName一 包名的书写规范 (Package)推荐使用公司或机构的顶级域名为包名的前缀,目的是保证各公司/机构内所使用的包名的唯一性。包名全部为小写字母,且具有实际的区分意义。1.1 一般要求1、选择有意义的名字,能快速地传达该类的用途。2、所有包的命名必须采用小写英文字母。1.2 实际应用应用系统中经常应用分层,Dao层(数据库访问)、Service层(业务处理)、Web层(页面控制action类)。1、包名的前几个为固定名称, 如果是网站的话,采用网站的域名的反写,如果域名还没有确定的话,采用公司固定的几个名称。如:net.vschool2、在包名的接下来一个单词为模块的名称。如:用户模块,包名为net.vschool.user3、关于模块的访问操作,采用分层形式,一般分为:Dao层操作:一般定义在net.vschool.xxx.dao 中,其中xxx为模块名称。Service层操作:一般定义在net.vschool.xxx.servie中。web层操作:一般定义在 net.vschool.xxx.action中。如下关于用户模块的例子:net.vschool.usernet.vschool.user.daonet.vschool.user.actionnet.vschool.user.service二 类名的书写规范 (Class)类名必须使用名词,如果一个类名内含多个单词,那么各个单词第一个字母大写,后续字母小写,起伏呈驼峰状,人称驼峰式命名。给类名命名时,必须保证准确、简洁且容易理解。尽量使用完整单词,避免使用缩写词(除了大家公认的)2.1 类的命名2.1.1 一般要求1、选择有意义的名字,能快速地传达该类的用途。2、参照java驼峰命名法,类名的首字母必须采用大写的形式,如果类名为多词组合而成的话,那么每个词的首字母必须采用大写。如:StudentAnswer.java3、当要区别接口类和实现类的时候,可以在类的后面加上“Impl”。如:接口类:UserInterface.java   接口实现类:UserInterfaceImp4、推荐实体类没有后缀名。2.1.2 实际应用应用系统中经常应用分层,Dao层(数据库访问)、Service层(业务处理)、Web层(页面控制action类),每一层的类的名称尽量带上该层后缀。1、Dao层a、接口类:采用JavaBean+Interface+Dao的形式来定义,即,实体对象+Interface+Dao。   如:用户对象接口类: UserInterfaceDao,其中xxx为模块名称。b、实现类:采用JavaBean+Interface+Impl+Dao的形式来定义,即,实体对象         +Interface+Impl+Dao。 如:用户对象实现类:UserInterfaceImplDao2、Service层a、接口类:采用Xxx+Interface+Service的形式来定义,即,模块+Interface+Service。     如:用户管理接口类:UserMsgInterfaceServiecb、实现类:采用Xxx+Interface+Impl+Service的形式来定义,即,模块+Interface+Impl+Service。如:用户管理实现类:UserMsgInterfaceImplServiec3、Web层(action类)a、实现类:采用县 Xxx+Operator+Action的形式来定义,即,模块+操作+Action。如        用户模块User+删除操作Delete+Action = UserDeleteAction2.1 变量的命名2.2.1 普通变量2.2.2.1 一般要求1、选择有意义的名字,能快速地传达该变量的用途。2、参照java驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。2.2.2.2 实际应用1、变量命名采用基本结构为typeVariableName,使用3字符前缀来表示数据类型。例如,定义一个整形变量:intDocCount,其中int表明数据类型,后面为表意的英文名,每个单词首字母大写。数据类型或对象类型变量前缀备注bytebye1、做数组用时,再加前缀-a,如字符串数组:astr,2、自定义类型的变量可以采用本身的名称,把首字母改为小写。3、采用名称要能代表在方法中的意义。如果员工列表:employeeListcharchrfloatfltbooleanblnInteger/intintshortshtLong/longlngDouble/doubledblstringstr2、变量使用技巧:a、在一段函数中不使用同一个变量表示前后意义不同的两个数值。b、除非是在循环中,否则一般不推荐使用单个字母作为变量名,i、j、k等只作为小型循环的循环索引变量。c、避免用Flag来命名状态变量。d、用Is来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开发人员能够更为清楚的理解布尔变量所代表的意义。  e、如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些区域中使用intCnt,而在另一些区域中又使用intCount,就会给代码增加不必要的复杂性。建议变量名中尽量不要出现缩写。   2.2.2 静态变量1、选择有意义的名字,能快速地传达该变量的用途。2、参照java驼峰命名法,采用全部大写的形式来书写,对于采用多词合成的变量采用“_”来连接各单词。如:USER_LIST2.3 方法的命名2.3.1 一般要求1、选择有意义的名字,能快速地传达该方法的用途。2、参照java驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。2.3.2 实际应用1、方法表示一种行为,它代表一种动作,最好是一个动词或者动词词组或者第一个单词为一个动词。2、属性方法:以get/set开头,其后跟字段名称,字段名称首字母大写。如:getUserName()3、数据层方法:只能以insert(插入),delete(删除),update(更新),select(查找),count(统计)开头,其他层方法避免以这个5个单词开头,以免造成误解。4、服务层方法,根据方法的行为命名,只描述方法的意义,而不采用方法的目的命名。比如系统的添加新用户,用户可以前台注册,也可以管理员后台添加,方法会被重用,所以最好不要用使用register,采用add会更好写。避免使用与web层相关的方法。5、Web层方法最好是贴近web的语言,如register,login,logout等方法。三 注释的书写规范 (Javadoc)Java除了可以采用我们常见的注释方式(//、/* */)之外,Java语言规范还定义了一种特殊的注释,也就是我们所说的Javadoc注释,以/**开头,而以*/结束, Javadoc 注释可以被自动转为在线文档,省去了单独编写程序文档的麻烦。 推荐使用。Javadoc注释主要涉及范围:类、属性、方法。例如:   复制代码 代码如下:package org.ietf.jgss;import java.net.InetAddress;import java.util.Arrays;/** * 该类的整体性描述。 * * @author 作者 * @version 1.0, 05/22/07 * @since 1.0 */public class ChannelBinding {/** * 对该变量的备注信息 */private InetAddress initiator;/** * 对该变量的备注信息 */private InetAddress acceptor;/** * 对该变量的备注信息 */    private  byte[] appData;       /**     * 对该类的构造函数的备注信息。     *     * @param initAddr 对参数的备注。     * @param acceptAddr对参数的备注。     * @param appData对参数的备注。     */    public ChannelBinding(InetAddress initAddr, InetAddress acceptAddr,              byte[] appData) {         initiator = initAddr;         acceptor = acceptAddr;         if (appData != null) {              this.appData = new byte[appData.length];              java.lang.System.arraycopy(appData, 0, this.appData, 0,                   appData.length);         }    }     /**     * 对该类的具体一函数的备注信息     *     * @param obj 参数的备注信息     * @return 返回值的备注信息     */    public boolean equals(Object obj) {         if (this == obj)              return true;         if (! (obj instanceof ChannelBinding))              return false;         ChannelBinding cb = (ChannelBinding) obj;         return Arrays.equals(appData, cb.appData);    }}四 其他书写规范4.1 Jsp页面名称的书写规范1.全部采用小写的英文字符和”_ ”组成。2.整体采用模块名+操作的形式。如:user_view.jsp3.Jsp页面尽可能与action的意思对应,如UserListAction 对应者user_list.jsp接口:使用驼峰式命名。除了用名词外,还可以用形容词命名(体现其功能特性)方法:规定用动词命名,适合用驼峰式命名,但与类名的最大区别在于,首字母必须小写变量:规定为名词,其他同“方法”命名方式一样。变量名非常关键,应含有具体意义且易于理解,一般不允许使用单个字母做变量名。除非一些临时性变量,像在循环中使用到的计数器等。在使用单个字母做变量名时,一般I、J、K用来命名整形变量。常量:规定全用大写字母表示,如果名字必须用多个单词来表示,那么各单词间用“-“分隔。常量要求必须意义明确,能表达出常量的含义。

通过下面一张图看下要实现的功能,具体详情如下所示:现在我就来介绍些软件的其它功能。希望大家有所受益。模拟人为搜索商品在刷单的时候,不能直接拿到一个商品网址就进入购买页面吧,得模拟人为搜索。在这一个过程中有两个难点:1)商品列表的异步加载 ; 2)翻页并且截图;在园子里,我就不在关公面前耍大刀了。直接上关键代码:i:搜索商品,并且翻页public bool? SearchProduct(TaskDetailModel taskDetailData){bool? result = null;bool isIndex = true;bool isList = true;WebBrowserTask.Instance.SetProperties();WebBrowserTask.Instance.ClearDocumentCompleted();WebBrowserTask.Instance.DocumentCompleted += (wbSenderSearch, wbESearch) =>{System.Windows.Forms.WebBrowser currentWB = wbSenderSearch as System.Windows.Forms.WebBrowser;System.Windows.Forms.HtmlDocument currentDoc = currentWB.Document;mshtml.HTMLDocument currentDom = currentDoc.DomDocument as mshtml.HTMLDocument;String wbUrl = wbESearch.Url.ToString();if (currentWB.ReadyState == System.Windows.Forms.WebBrowserReadyState.Complete){#region 首页搜索if (wbUrl.Contains("www.taobao.com")){if (isIndex == true){isIndex = false;taskDetailData.DetailRemark = String.Format(@"输入关键字""{0}""搜索商品……", taskDetailData.TaskName);Func<bool> func = () =>{bool asynctag = false;System.Threading.Thread.Sleep(5000);asynctag = true;return asynctag;};func.BeginInvoke((ar) =>{bool asyncresult = func.EndInvoke(ar);if (asyncresult){System.Windows.Forms.HtmlElement heee = currentDoc.GetElementById("J_SearchTab");String classname = heee.GetAttribute("classname");System.Windows.Forms.HtmlElement hitem = heee.Children[0];System.Windows.Forms.HtmlElementCollection heclis = hitem.Children;System.Windows.Forms.HtmlElement li1 = heclis[0];System.Windows.Forms.HtmlElement li2 = heclis[1];System.Windows.Forms.HtmlElement li3 = heclis[2];foreach (System.Windows.Forms.HtmlElement li in heclis){String liclass = li.GetAttribute("classname");if (liclass.Contains("selected")){System.Windows.Forms.HtmlElement q = currentDoc.GetElementById("q");System.Windows.Forms.HtmlElement btnsearch = currentDoc.GetElementById("J_TSearchForm").Children[0].Children[0];if (q != null && btnsearch != null){q.Focus();q.SetAttribute("value", taskDetailData.TaskName);btnsearch.Focus();string savePath = Path.Combine(UserData.WorkBenchDirectory, taskDetailData.TaskDetailCode, String.Format("搜索提交.jpg", ""));CaptureImage.CaptureWebPageArea(currentDom, savePath);btnsearch.InvokeMember("click");}}}}},null);}}#endregion 首页搜索#region 商品列表if (wbUrl.Contains("s.taobao.com")){if (isList == true){isList = false;Func<bool> func = () =>{bool asynctag = false;asynctag = true;return asynctag;};func.BeginInvoke((ar) =>{bool asyncresult = func.EndInvoke(ar);if (asyncresult){//解析每页商品String clickProductURL = TurningAndParsePage(currentDoc, taskDetailData);result = true;}},null);}}#endregion 商品列表}}; //DocumentCompleted结束System.Windows.Application.Current.Dispatcher.Invoke(new System.Action(() =>{WebBrowserTask.Instance.Navigate("https://www.taobao.com/");}));for (int i = 0; i < 120; i++){System.Threading.Thread.Sleep(1000);if (result != null){break;}}return result;} ii:因为每个页面都是异常加载的,选择适当的时机对网页进行截图截取整个网页:/*因为包含了控件,如果在了线程里调用,必须用Invoke方法System.Windows.Application.Current.Dispatcher.Invoke(new System.Action(() =>{//htmlDoc.Window.ScrollTo(new System.Drawing.Point(5000, htmlDoc.Body.ScrollRectangle.Height));string savePath = string.Format(@"D:\{0}.jpg", Guid.NewGuid().ToString());CaptureImage.CaptureWebPage(webBrowserTask, savePath);}), System.Windows.Threading.DispatcherPriority.Background);*//// <summary>/// 截取整个网页/// </summary>/// <param name="web"></param>/// <param name="savePath"></param>public static void CaptureWebPage(System.Windows.Forms.WebBrowser web, String savePath){Rectangle body = web.Document.Body.ScrollRectangle;Rectangle docRectangle = new Rectangle(){Location = new Point(0, 0),Size = new Size(body.Width, body.Height)};web.Dock = DockStyle.None;web.Width = docRectangle.Width;web.Height = docRectangle.Height;Rectangle imgRectangle = docRectangle;using (Bitmap bitmap = new Bitmap(imgRectangle.Width, imgRectangle.Height)){IViewObject ivo = web.Document.DomDocument as IViewObject;using (Graphics g = Graphics.FromImage(bitmap)){IntPtr hdc = g.GetHdc();ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref imgRectangle, ref docRectangle, IntPtr.Zero, 0);g.ReleaseHdc(hdc);}bitmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);bitmap.Dispose();}} 截取网页的某个区域:/// <summary>/// 截取网页的一部份/// </summary>/// <param name="htmlDom"></param>/// <param name="savePath"></param>public static void CaptureWebPageArea(mshtml.HTMLDocument htmlDom, String savePath){String saveDir = System.IO.Path.GetDirectoryName(savePath);if (!System.IO.Directory.Exists(saveDir)){System.IO.Directory.CreateDirectory(saveDir);}Rectangle docRectangle = new Rectangle(){Location = new Point(0, 0),//Size = new Size(htmlDom.body.offsetWidth, htmlDom.body.offsetHeight)Size = new Size((int)System.Windows.SystemParameters.PrimaryScreenWidth, (int)System.Windows.SystemParameters.PrimaryScreenHeight)};Rectangle imgRectangle = docRectangle;using (Bitmap bitmap = new Bitmap(imgRectangle.Width, imgRectangle.Height)){IViewObject ivo = htmlDom as IViewObject;using (Graphics g = Graphics.FromImage(bitmap)){IntPtr hdc = g.GetHdc();ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref imgRectangle, ref docRectangle, IntPtr.Zero, 0);g.ReleaseHdc(hdc);}bitmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);bitmap.Dispose();}} 在这代码里有很多有趣的片段。有心的朋友会发现。

学习笔记:  1、String拼接会创建一个新的String对象,存储拼接后的字符串;    StringBuffer拼接是直接在本身拼接,会即时刷新。  2.String只能拼接String类型的字符串;    StringBuffer能够拼接所有的类型的值。public class Test { public static void main(String[] args) { String str1="abc"; String str2="cba"; //使用Stirng的concat拼接 String s1=str1.concat(str2); String s2=str2.concat(str1); System.out.println("使用concat互相拼接:"+s1+":"+s2); //使用StringBuffer的append拼接 StringBuffer sb1=new StringBuffer(str1); StringBuffer sb2=new StringBuffer(str2);<br> StringBuffer s3=sb1.append(sb2); StringBuffer s4=sb2.append(sb1); System.out.println("使用StringBuffer互相拼接:"+s3+":"+s4);<br> System.out.println("s3.append(s3):"+s3.append(s3)); //输出结果为:s3.append(s3):abccbaabccba System.out.println("s3:"+s3);         //输出结果为:s3:abccbaabccba   System.out.println(s1.concat(s2)==s1);//false,拼接会重新创建一个String(String的长度是不可变的) System.out.println(s3.append(s1)==s3);//true,StringBuffer是对自己进行操作会即时刷新 <br>                    int num=123;          /*str1.concat(num);---此处报错*/          StringBuffer s5=s4.append(num);          System.out.println("s5:"+s5); } }  输出结果是:使用concat互相拼接1:abccba:cbaabc使用StringBuffer互相拼接1:abccba:cbaabccbas3.append(s3):abccbaabccbas3:abccbaabccbafalsetrues5:cbaabccba123以上所述是小编给大家介绍的Java中String与StringBuffer拼接的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验。一、配置公众号微信支付  需要我们配置微信公众号支付地址和测试白名单。比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/那此处配置www.xxx.com/shop/pay/二、开发流程借用微信公众号支付api(地址 http://pay.weixin.qq.com/wiki/doc/api/index.PHP?chapter=7_4),我们需要开发的为红色标记出的。如下:三、向微信服务器端下订单调用统一下单接口,这样就能获取微信支付的prepay_id(http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1)。在调用该接口前有几个字段是H5支付必须填写的openid3.1 获取openid可以通过网页授权形式(http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)在微信中发送如下链接https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=要跳转的下订单的url&response_type=code&scope=snsapi_base&state=123#wechat_redirect3.2 下订单获取prepay_id代码如下,实际上是通过post发送一个xml 文件,获取微信服务器端发送过来的prepay_id。import java.io.ByteArrayInputStream; import javaioIOException; import javaioInputStream; import javaioUnsupportedEncodingException; import javautilDate; import javautilHashMap; import javautilIterator; import javautilMap; import javautilMapEntry; import javautilRandom; import javaxservlethttpHttpServletRequest; import javaxservlethttpHttpServletResponse; import orgapachecommonscodecdigestDigestUtils; import orgspringframeworkstereotypeController; import orgspringframeworkwebbindannotationRequestMapping; import orgxmlpullvXmlPullParser; import orgxmlpullvXmlPullParserException; import orgxmlpullvXmlPullParserFactory; import comfasterxmljacksondatabindJsonNode; import comgsonoauthOauth; import comgsonoauthPay; import comgsonutilHttpKit; import comsyutilDatetimeUtil; import comsyutilJsonUtil; @Controller @RequestMapping("/pay") public class WXPayController { @RequestMapping(value = "wxprepaydo") public void jspay(HttpServletRequest request, HttpServletResponse response, String callback) throws Exception { // 获取openid String openId = SessionUtilgetAtt(request, "openId"); if (openId == null) { openId = getUserOpenId(request); } String appid = "wx16691fcb0523c1a4"; String paternerKey = "ININGFENG1234567fdfwfdfd1ss234567"; String out_trade_no = getTradeNo(); Map<String, String> paraMap = new HashMap<String, String>(); paraMapput("appid", appid); paraMapput("attach", "测试"); paraMapput("body", "测试购买支付"); paraMapput("mch_id", "10283271"); paraMapput("nonce_str", create_nonce_str()); paraMapput("openid", openId); paraMapput("out_trade_no", out_trade_no); paraMapput("spbill_create_ip", getAddrIp(request)); paraMapput("total_fee", "1"); paraMapput("trade_type", "JSAPI"); paraMapput("notify_url", "http://wwwxxxco/bank/page/wxnotify"); String sign = getSign(paraMap, paternerKey); paraMapput("sign", sign); // 统一下单 https://apimchweixinqqcom/pay/unifiedorder String url = "https://apimchweixinqqcom/pay/unifiedorder"; String xml = ArrayToXml(paraMap); String xmlStr = HttpKitpost(url, xml); // 预付商品id String prepay_id = ""; if (xmlStrindexOf("SUCCESS") != -1) { Map<String, String> map = doXMLParse(xmlStr); prepay_id = (String) mapget("prepay_id"); } Map<String, String> payMap = new HashMap<String, String>(); payMapput("appId", appid); payMapput("timeStamp", create_timestamp()); payMapput("nonceStr", create_nonce_str()); payMapput("signType", "MD5"); payMapput("package", "prepay_id=" + prepay_id); String paySign = getSign(payMap, paternerKey); payMapput("pg", prepay_id); payMapput("paySign", paySign); WebUtilresponse(response, WebUtilpackJsonp(callback, JsonUtilwarpJsonNodeResponse(JsonUtilobjectToJsonNode(payMap))toString())); } /** * map转成xml * * @param arr * @return */ public String ArrayToXml(Map<String, String> arr) { String xml = "<xml>"; Iterator<Entry<String, String>> iter = arrentrySet()iterator(); while (iterhasNext()) { Entry<String, String> entry = iternext(); String key = entrygetKey(); String val = entrygetValue(); xml += "<" + key + ">" + val + "</" + key + ">"; } xml += "</xml>"; return xml; } // 获取openId private String getUserOpenId(HttpServletRequest request) throws Exception { String code = requestgetParameter("code"); if (code == null) { String openId = requestgetParameter("openId"); return openId; } Oauth o = new Oauth(); String token = ogetToken(code); JsonNode node = JsonUtilStringToJsonNode(token); String openId = nodeget("openid")asText(); return openId; } private String create_nonce_str() { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; String res = ""; for (int i = 0; i < 16; i++) { Random rd = new Random(); res += charscharAt(rdnextInt(charslength() - 1)); } return res; } private String getAddrIp(HttpServletRequest request){ return requestgetRemoteAddr(); } private String create_timestamp() { return LongtoString(SystemcurrentTimeMillis() / 1000); } private String getTradeNo(){ String timestamp = DatetimeUtilformatDate(new Date(), DatetimeUtilDATETIME_PATTERN); return "HZNO" + timestamp; } private String getSign(Map<String, String> params, String paternerKey ) throws UnsupportedEncodingException { String string1 = PaycreateSign(params, false); String stringSignTemp = string1 + "&key=" + paternerKey; String signValue = DigestUtilsmd5Hex(stringSignTemp)toUpperCase(); return signValue; } private Map<String, String> doXMLParse(String xml) throws XmlPullParserException, IOException { InputStream inputStream = new ByteArrayInputStream(xmlgetBytes()); Map<String, String> map = null; XmlPullParser pullParser = XmlPullParserFactorynewInstance() newPullParser(); pullParsersetInput(inputStream, "UTF-8"); // 为xml设置要解析的xml数据 int eventType = pullParsergetEventType(); while (eventType != XmlPullParserEND_DOCUMENT) { switch (eventType) { case XmlPullParserSTART_DOCUMENT: map = new HashMap<String, String>(); break; case XmlPullParserSTART_TAG: String key = pullParsergetName(); if (keyequals("xml")) break; String value = pullParsernextText(); mapput(key, value); break; case XmlPullParserEND_TAG: break; } eventType = pullParsernext(); } return map; } } 四、H5支付H5支付其实很简单,只需要调用微信内嵌浏览器的js方法就行(http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_7)<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="spring" uri="http://wwwspringframeworkorg/tags" %> <% String path = requestgetContextPath(); String basePath = requestgetScheme() + "://" + requestgetServerName() + ":" + requestgetServerPort() + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 01 Transitional//EN" "http://wwwworg/TR/html4/loosedtd"> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=0, maximum-scale=0, user-scalable=0" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="format-detection" content="telephone=no" /> <title>测试支付</title> <link href="/css/csscss?v=0" rel="stylesheet" type="text/css"> </head> <body> <div class="index_box"> <div class="apply_name">微信js支付测试</div> <div class="branch_con"> <ul> <li><span class="name">测试支付信息</span></li> </ul> <p class="cz_btn"><a href="javascript:pay();" class="btn_1">立即支付</a></p> </div> </div> <script type="text/javascript" src="/js/zeptominjs"></script> <script type="text/javascript" src="/js/commonjs"></script> <script type="text/javascript"> var appId = urlparameter("appId"); var timeStamp = urlparameter("timeStamp"); var nonceStr = urlparameter("nonceStr"); var pg = urlparameter("pg"); var signType = urlparameter("signType"); var paySign = urlparameter("paySign"); function onBridgeReady(){ WeixinJSBridgeinvoke( 'getBrandWCPayRequest', { "appId" : appId, //公众号名称,由商户传入 "timeStamp": timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : nonceStr, //随机串 "package" : "prepay_id=" + pg, "signType" : signType, //微信签名方式: "paySign" : paySign //微信签名 }, function(res){ if(reserr_msg == "get_brand_wcpay_request:ok" ) { alert("支付成功"); } // 使用以上方式判断前端返回,微信团队郑重提示:reserr_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 } ); } function pay(){ if (typeof WeixinJSBridge == "undefined"){ if( documentaddEventListener ){ documentaddEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (documentattachEvent){ documentattachEvent('WeixinJSBridgeReady', onBridgeReady); documentattachEvent('onWeixinJSBridgeReady', onBridgeReady); } }else{ onBridgeReady(); } } </script> </body> </html> 效果如下以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

分类:36salon手机版

时间:2016-04-01 15:06:52