java服务端微信APP支付接口详解
一、微信APP支付接入商户服务中心
[申请流程指引](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=84f23b4e9746c5963128711f225476cfd49ccf8c&lang=zh_CN)
二、开始开发
1、配置相关的配置信息
1.1、配置appid(Android)、mch_id(ios)、微信支付后的回调地址
sys.properties配置文件: appid=wx***************1 mch_id=1********2 notify_url=http://6*.***.***.**/returnmsg.do //回调通知的地址,一定是要可以直接访问的地址
2、微信支付–下单
@ResponseBody @RequestMapping(value="/weixinpay.do",produces="text/html;charset=UTF-8",method={RequestMethod.POST}) publicstaticStringweixinpay(Stringbody,//商品描述 Stringdetail,//商品详情 Stringattach,//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 Stringout_trade_no,//商户系统内部的订单号,32个字符内、可包含字母,其他说明见商户订单号 Stringtotal_price,//订单总金额,单位为分,详见支付金额 Stringspbill_create_ip//用户端实际ip )throwsException{ WeixinConfigUtilsconfig=newWeixinConfigUtils(); //参数组 Stringappid=config.appid;//微信开放平台审核通过的应用APPID System.out.println("appid是:"+appid); Stringmch_id=config.mch_id; System.out.println("mch_id是:"+mch_id); Stringnonce_str=RandCharsUtils.getRandomString(16); System.out.println("随机字符串是:"+nonce_str); body=body;//"测试微信支付0.01_2"; detail=detail;//"0.01_元测试开始"; //attach=attach;//"备用参数,先留着,后面会有用的"; //Stringout_trade_no=OrderUtil.getOrderNo();//"2015112500001000811017342394"; doubletotalfee=0; try{ totalfee=Double.parseDouble(total_price);////单位是分,即是0.01元 }catch(Exceptione){ totalfee=0; } inttotal_fee=(int)(totalfee*100); spbill_create_ip=spbill_create_ip;//"127.0.0.1"; Stringtime_start=RandCharsUtils.timeStart(); System.out.println(time_start); Stringtime_expire=RandCharsUtils.timeExpire(); System.out.println(time_expire); Stringnotify_url=config.notify_url; System.out.println("notify_url是:"+notify_url); Stringtrade_type="APP"; //参数:开始生成签名 SortedMap
2.1、微信支付签名算法sign
packagecom.wx.weixincontroller.pay.weixin.Utils; importjava.util.Iterator; importjava.util.Map; importjava.util.Set; importjava.util.SortedMap; importcom.wx.weixin.utils.MD5Utils; /** *微信支付签名 *@authoriYjrg_xiebin *@date2016年10月25日下午4:47:07 */ publicclassWXSignUtils{ //http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3 //商户Key:改成公司申请的即可 //32位密码设置地址:http://www.sexauth.com/jdex1hvufnm1sdcb0e81t36k0d0f15nc privatestaticStringKey="***cb**e**ef**c*e*d***e*fd***cb*"; /** *微信支付签名算法sign *@paramcharacterEncoding *@paramparameters *@return */ @SuppressWarnings("rawtypes") publicstaticStringcreateSign(StringcharacterEncoding,SortedMapparameters){ StringBuffersb=newStringBuffer(); Setes=parameters.entrySet();//所有参与传参的参数按照accsii排序(升序) Iteratorit=es.iterator(); while(it.hasNext()){ Map.Entryentry=(Map.Entry)it.next(); Stringk=(String)entry.getKey(); Objectv=entry.getValue(); if(null!=v&&!"".equals(v) &&!"sign".equals(k)&&!"key".equals(k)){ sb.append(k+"="+v+"&"); } } sb.append("key="+Key); System.out.println("字符串拼接后是:"+sb.toString()); Stringsign=MD5Util.MD5Encode(sb.toString(),characterEncoding).toUpperCase(); returnsign; } }
2.2、POST提交XML格式的参数
packagecom.wx.weixincontroller.pay.weixin.Utils; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.OutputStream; importjava.io.OutputStreamWriter; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; importjava.net.URL; importjavax.net.ssl.HttpsURLConnection; importcom.com.wx.weixin.wxcontroller.pay.weixin.entity.Unifiedorder; /** *post提交xml格式的参数 *@authoriYjrg_xiebin *@date2016年10月25日下午3:33:38 */ publicclassHttpXmlUtils{ /** *开始post提交参数到接口 *并接受返回 *@paramurl *@paramxml *@parammethod *@paramcontentType *@return */ publicstaticStringxmlHttpProxy(Stringurl,Stringxml,Stringmethod,StringcontentType){ InputStreamis=null; OutputStreamWriteros=null; try{ URL_url=newURL(url); HttpURLConnectionconn=(HttpURLConnection)_url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestProperty("Content-type","text/xml"); conn.setRequestProperty("Pragma:","no-cache"); conn.setRequestProperty("Cache-Control","no-cache"); conn.setRequestMethod("POST"); os=newOutputStreamWriter(conn.getOutputStream()); os.write(newString(xml.getBytes(contentType))); os.flush(); //返回值 is=conn.getInputStream(); returngetContent(is,"utf-8"); }catch(MalformedURLExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ if(os!=null){os.close();} if(is!=null){is.close();} }catch(IOExceptione){ e.printStackTrace(); } } returnnull; } /** *解析返回的值 *@paramis *@paramcharset *@return */ publicstaticStringgetContent(InputStreamis,Stringcharset){ StringpageString=null; InputStreamReaderisr=null; BufferedReaderbr=null; StringBuffersb=null; try{ isr=newInputStreamReader(is,charset); br=newBufferedReader(isr); sb=newStringBuffer(); Stringline=null; while((line=br.readLine())!=null){ sb.append(line+"\n"); } pageString=sb.toString(); }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(is!=null){ is.close(); } if(isr!=null){ isr.close(); } if(br!=null){ br.close(); } }catch(IOExceptione){ e.printStackTrace(); } sb=null; } returnpageString; } /** *构造xml参数 *@paramxml *@return */ publicstaticStringxmlInfo(Unifiedorderunifiedorder){ //构造xml参数的时候,至少又是个必传参数 /* **/ if(unifiedorder!=null){ StringBufferbf=newStringBuffer(); bf.append(" wx2421b1c4370ec43b 支付测试 JSAPI支付测试10000100 1add1a30ac87aa2db72f57a2375d8fec http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 1415659990 14.23.150.211 1 JSAPI 0CB01533B8C1EF103065174F50BCA001 "); bf.append(" "); returnbf.toString(); } return""; } /** *post请求并得到返回结果 *@paramrequestUrl *@paramrequestMethod *@paramoutput *@return */ publicstaticStringhttpsRequest(StringrequestUrl,StringrequestMethod,Stringoutput){ try{ URLurl=newURL(requestUrl); HttpsURLConnectionconnection=(HttpsURLConnection)url.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestMethod(requestMethod); if(null!=output){ OutputStreamoutputStream=connection.getOutputStream(); outputStream.write(output.getBytes("UTF-8")); outputStream.close(); } //从输入流读取返回内容 InputStreaminputStream=connection.getInputStream(); InputStreamReaderinputStreamReader=newInputStreamReader(inputStream,"utf-8"); BufferedReaderbufferedReader=newBufferedReader(inputStreamReader); Stringstr=null; StringBufferbuffer=newStringBuffer(); while((str=bufferedReader.readLine())!=null){ buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream=null; connection.disconnect(); returnbuffer.toString(); }catch(Exceptionex){ ex.printStackTrace(); } return""; } }"); bf.append(" "); bf.append(" "); bf.append(" "); bf.append(""); bf.append(" "); bf.append(" "); bf.append(" "); bf.append(" "); bf.append(" "); bf.append(" "); bf.append(" "); bf.append(" "); bf.append(" "); bf.append("
3、微信支付–回调通知业务处理
//通知处理类 @ResponseBody @RequestMapping(value="/returnmsg.do",produces="text/html;charset=UTF-8",method={RequestMethod.POST}) publicStringreturnmsg(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{ //解析结果存储在HashMap Mapmap=newHashMap (); InputStreaminputStream=request.getInputStream(); //读取输入流 SAXReaderreader=newSAXReader(); Documentdocument=reader.read(inputStream); //得到xml根元素 Elementroot=document.getRootElement(); //得到根元素的所有子节点 List elementList=root.elements(); //遍历所有子节点 for(Elemente:elementList){ map.put(e.getName(),e.getText()); } JSONObjectjson=JSONObject.fromObject(map); System.out.println("===消息通知的结果:"+json.toString()+"=========================="); System.out.println("===return_code==="+map.get("return_code")); System.out.println("===return_msg==="+map.get("return_msg")); System.out.println("===out_trade_no==="+map.get("out_trade_no")); //验证签名的过程 //判断是否支付成功 if(map.get("return_code").equals("SUCCESS")){ /** *支付成功之后的业务处理 */ //释放资源 inputStream.close(); inputStream=null; //bis.close(); return"SUCCESS"; } } if(map.get("return_code").equals("FAIL")){ /** *支付失败后的业务处理 */ //释放资源 inputStream.close(); inputStream=null; return"SUCCESS"; } } //释放资源 inputStream.close(); inputStream=null; return"SUCCESS"; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。