对于微信支付,开发人员要作的其实不多,我这里就作了3样:建立二维码,支付成功以后的notify,还有定时查询支付是否成功.java
先说第一步:建立二维码.ajax
<img src="url" >
url为后台建立二维码程序的路径.spring
我用的是spring MVC,实例也就以此为准,下面是建立二维码的程序:服务器
/** * 建立二维码(用户帐户充值的二维码) * @throws UnsupportedEncodingException */ @RequestMapping("/url") public void url(String id) throws RootException, UnsupportedEncodingException { //fee表明须要支付的金钱,1表明1分.下面的100就是1块钱. Integer fee =100; //生成订单 .notifyUrl就是支付成功以后,微信会根据你给的路径,来提醒你,支付成功了,下面具体讲. String orderInfo = WeiXinPayCommUtil.createOrderInfo( id, "提示语", fee+"", notifyUrl ,IpUtil.getIpAddr(request) ); //调统一下单API 将返回预支付交易连接(code_url)生成二维码图片 String code_url = WeiXinPayCommUtil.httpOrder(orderInfo); try { int width = 230; int height = 230; String format = "png"; Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); BitMatrix bitMatrix = new MultiFormatWriter().encode(code_url, BarcodeFormat.QR_CODE, width, height, hints); ServletOutputStream out = null; out = response.getOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, format, out); out.flush(); out.close(); } catch (Exception e) { } }
接着页面上就会显示出你建立的二维码了.微信
第二步:支付成功以后的通知(项目放到服务器上以后才有用.):app
/** * 支付异步接受通知 * @throws RootException * @throws IOException * @throws JDOMException */ @RequestMapping("/payNotify") public void payNotify() throws RootException, IOException, JDOMException{ logger.info("WeiXinPay notify ..."); //读取参数 InputStream inputStream ; StringBuffer sb = new StringBuffer(); inputStream = request.getInputStream(); String s ; BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); while ((s = in.readLine()) != null){ sb.append(s); } in.close(); inputStream.close(); //解析xml成map Map<String, String> m = new HashMap<String, String>(); m = WeiXinXMLUtil.doXMLParse(sb.toString()); //过滤空 设置 TreeMap SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>(); Iterator<String> it = m.keySet().iterator(); while (it.hasNext()) { String parameter = (String) it.next(); String parameterValue = (String) m.get(parameter); String v = ""; if(null != parameterValue) { v = parameterValue.trim(); } packageParams.put(parameter, v); } // 帐号信息 String key = WeiXinPayConfig.key; // key logger.info(packageParams); //判断签名是否正确 if(WeiXinPayCommUtil.isTenpaySign("UTF-8", packageParams,key)) { //------------------------------ //处理业务开始 //------------------------------ String resXml = ""; if("SUCCESS".equals((String)packageParams.get("result_code"))){ // 这里是支付成功 //////////执行本身的业务逻辑//////////////// String mch_id = (String)packageParams.get("mch_id"); String openid = (String)packageParams.get("openid"); String is_subscribe = (String)packageParams.get("is_subscribe"); String out_trade_no = (String)packageParams.get("out_trade_no"); String total_fee = (String)packageParams.get("total_fee"); logger.info("mch_id:"+mch_id); logger.info("openid:"+openid); logger.info("is_subscribe:"+is_subscribe); logger.info("out_trade_no:"+out_trade_no); logger.info("total_fee:"+total_fee); //////////执行本身的业务逻辑//////////////// BaseVo vo2 = 业务逻辑代码. if(vo2.getMsg().equals("true")){ logger.info("支付成功"); //通知微信.异步确认成功.必写.否则会一直通知后台.八次以后就认为交易失败了. resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> "; }else{ logger.info("支付失败,错误信息:" + packageParams.get("err_code")); resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> "; } } else { logger.info("支付失败,错误信息:" + packageParams.get("err_code")); resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> "; } //------------------------------ //处理业务完毕 //------------------------------ BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream()); out.write(resXml.getBytes()); out.flush(); out.close(); } else{ logger.info("通知签名验证失败"); } }
最后一个就是定时检测是否支付成功,能够使用ajax异步
/** * 支付定时检测(用户支付) * @throws RootException * @throws IOException * @throws JDOMException * @author dingzefeng */ @RequestMapping("/payCheck") @ResponseBody public BaseVo payCheck(String id) throws RootException, IOException, JDOMException{ BaseVo vo = new BaseVo(); vo.setMsg("error"); try { if(!ValidateUtil.validateBlank(id)){ //生成查询xml String orderInfo = WeiXinPayCommUtil.selectOrderInfo(id); String result = WeiXinPayCommUtil.httpSelectOrder(orderInfo); if(result != null && result.equals("true")){ //业务逻辑代码 return vo; } }else{ vo.setMsg("error"); } } catch (Exception e) { e.printStackTrace(); } return vo; }
下面地址为微信支付的util包下载地址:http://pan.baidu.com/s/1eSmIoYA微信支付