首先说明一点但凡平台开发接口开发都不会太难最主要的一点是看文档~看文档~看文档。 按照文档,第一步,预下单。 **推荐看文档** [API列表统一下单](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
值得注意的是openid值的获取, 直接贴代码这里输入代码`javascript
/** * 微信统一下单 * * @param fenpay * @param orderStr * @return */ private String placOrder(int fenpay, String orderStr, String subject) { Object openid = WebUtils.getSessionAttribute("openid"); if (openid == null) { throw new ServiceException("没有得到微信受权,不能使用微信支付"); } String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; SortedMap<String, String> sm = new TreeMap<String, String>(); // 添加三个固定的参数 sm.put("appid", WeiXinUtil.APPID); sm.put("mch_id", WeiXinUtil.MCH_ID); sm.put("notify_url", WeiXinUtil.NOTIFY_URL); sm.put("trade_type", WeiXinUtil.TRADE_TYPE); sm.put("nonce_str", RandomStringGenerator.getRandomStringByLength(8)); sm.put("body", subject); sm.put("out_trade_no", orderStr); sm.put("total_fee", String.valueOf(fenpay)); sm.put("spbill_create_ip", "127.0.0.1"); // 如今写死的 // sm.put("openid", "oMEZLt3zK-GrAnkHRsHxKOaDONpM"); // String openidStr = openid.toString(); sm.put("openid", openidStr); getLogger().debug("opendid:" + openid); String sign = WeiXinUtil.createSign(sm); getLogger().debug("sign:" + sign); String xml = XmlUtil.createXml(sm, sign); getLogger().debug("post:" + xml); String result = HttpClientUtil.postXML(url, xml); getLogger().debug("result:" + result); Map<String, String> xmlmap = XmlUtil.parseXml(result); // 返回预支付标识 String prepay_id = xmlmap.get("prepay_id"); // 凡是拿不到prepay_id都通通归结为下单失败 if (StringUtils.isEmpty(prepay_id)) { throw new ServiceException("微信下单失败"); } return "prepay_id=" + prepay_id; }
我是经过受权跳转的方式获取openid,即在点击“去支付”按钮的时候跳转到微信平台进行自动受权而后跳转会指定页面,也可在系统登陆的时候就进行受权跳转。贴代码注意加粗代码便可。仍是推荐看文档 受权跳转 页面跳转受权php
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${payUrl2}&response_type=code&state=${user.uid}&scope=snsapi_base" class="paymentbtn">
redirect_uri为你要受权以后跳转回来的urlcss
/** * * 活动报名 * * @return */ @SuppressWarnings("unchecked") public String payApply() { Map<String, Object> user = (Map<String, Object>) WebUtils.getSessionAttribute("user"); ** // 得到微信支付返回来的state,用来存储登陆用户的uid这个时候从新从接口中 String state = WebUtils.getParameter("state");** getLogger().info("获取受权以后的state" + state); if (user == null && StringUtils.isNotEmpty(state)) { Map<String, Object> map = new HashMap<String, Object>(); map.put("uid", state); String userStr = HttpClientUtil.doGet("http://120.24.240.104/bikeapi/?m=user&a=get_user", map); user = (Map<String, Object>) JSON.parse(userStr); ActionContext.getContext().getSession().put("user", user); } if (getActivityId() == null) { return "activityerror"; } Activity av = activityService.findById(getActivityId()); setActivity(av); ** // 得到用户的openid,支付的时候须要用到 String code = WebUtils.getParameter("code");** // String code = "021ed6c6c2f9b4689e166d7d0ea9caaD"; if (StringUtils.isEmpty(code)) { // 不能得到支付受权 setMsg("得到微信支付受权失败,不能使用微信支付"); } else { ** // ------------一下为获取openid的代码 String url = "https://api.weixin.qq.com/sns/oauth2/access_token"; Map<String, Object> map = new HashMap<String, Object>(); map.put("appid", WeiXinUtil.APPID); map.put("secret", WeiXinUtil.APPSECRET); map.put("code", code); map.put("grant_type", "authorization_code"); try { // 受权字符串 String authStr = HttpClientUtil.doPost(url, map); JSONObject json = new JSONObject(authStr); String openid = json.getString("openid"); // 把他set到session中,这应该是最简单的了吧 WebUtils.getSession().setAttribute("openid", openid);** } catch (Exception e) { e.printStackTrace(); setMsg("得到微信支付受权失败,不能使用微信支付"); } } // 没有登陆不能报名 if (user != null) { // 查询当前用户的余额,若是查不到那么就是0元咯 BigDecimal balance = userService.findBalanceByUid(Long.valueOf(user.get("uid").toString())); this.setUserBalance(balance); return "payapply"; } else { fromUrl = "/index/index!login.action?from_url=/activity/activity!apply.action?id=" + String.valueOf(getActivityId()); return "login"; } }
好的,完成了统一下单以后你应该获取到一个package格式为prepay_id=123456789这样子的订单信息,那么接下来就能够在页面发起支付请求了。 刚开始的时候我按照文档的发起H5支付,结果怎么调试都不成功,相信不少朋友也是在这个地方遇到问题 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 这个应该是官方文档没更新的缘由,新版的微信中已经支持这种发起支付调用,而应该采用JSSDK发起支付请求。直接看到支付的api 输入连接说明 遇到不懂的地方或者缺乏的参数请往上看文档。 主要具体步骤有
html
最后贴一下个人发起支付的页面代码,我只能帮大家到这里了,剩下的就是调试了。java
<%@ page contentType="text/html;charset=UTF-8" %> <%@ include file="/common/header.jsp" %> <title>微信支付</title> <link rel="stylesheet" type="text/css" href="css/activity.css"> <script type="text/javascript" charset="UTF-8" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> function pay(){ var appId = $('#appId').val(); var timeStamp = $('#timeStamp').val(); var nonceStr = $('#nonceStr').val(); var pk = $('#package').val(); var signType = $('#signType').val(); var paySign = $('#paySign').val(); //config var timeStamp2 = $('#timeStamp2').val(); var nonceStr2 = $('#nonceStr2').val(); var signature = $('#signature').val(); // var activityId = $('#activityId').val(); wx.config({ debug: false, // 开启调试模式,调用的全部api的返回值会在客户端alert出来,若要查看传入的参数,能够在pc端打开,参数信息会经过log打出,仅在pc端时才会打印。 appId: appId, // 必填,公众号的惟一标识 timestamp:timeStamp2 , // 必填,生成签名的时间戳 nonceStr: nonceStr2, // 必填,生成签名的随机串 signature: signature,// 必填,签名,见附录1 jsApiList: ['chooseWXPay'] // 必填,须要使用的JS接口列表,全部JS接口列表见附录2 }); wx.ready(function(){ // config信息验证后会执行ready方法,全部接口调用都必须在config接口得到结果以后,config是一个客户端的异步操做,因此若是须要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则能够直接调用,不须要放在ready函数中。 wx.chooseWXPay({ timestamp: timeStamp, // 支付签名时间戳,注意微信jssdk中的全部使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: nonceStr, // 支付签名随机串,不长于 32 位 package: pk, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: paySign, // 支付签名 complete: function (res) { // 支付成功后的回调函数 location.href=basePath+'/activityorder/activity-order!list.action?activityId='+activityId; } }); }); } </script> </head> <body onload="pay()"> <input id="activityId" type="hidden" value="${activityId}" /> <input id="appId" type="hidden" value="${payparam.appId}" /> <input id="timeStamp" type="hidden" value="${payparam.timeStamp}" /> <input id="nonceStr" type="hidden" value="${payparam.nonceStr}" /> <input id="package" type="hidden" value="${payparam.package1}" /> <input id="signType" type="hidden" value="${payparam.signType}" /> <input id="paySign" type="hidden" value="${payparam.paySign}" /> <input id="timeStamp2" type="hidden" value="${apijsmap.timestamp}" /> <input id="nonceStr2" type="hidden" value="${apijsmap.noncestr}" /> <input id="signature" type="hidden" value="${apijsmap.signature}" /> </body> </html>
最后记得在公众平台的公众权限配置,你发起支付的页面必定要是在公众平台设置了受权的页面,调用jsjdk的页面也要受权了的。至于具体要哪些受权,地方太多了慢慢找吧。json