微信公众平台H5支付
2019獨角獸企業重金招聘Python工程師標準>>>
首先說明一點但凡平臺開發接口開發都不會太難最主要的一點是看文檔~看文檔~看文檔。 按照文檔,第一步,預下單。 **推薦看文檔** [API列表統一下單](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)值得注意的是openid值的獲取, 直接貼代碼這里輸入代碼`
/*** 微信統一下單* * @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,即在點擊“去支付”按鈕的時候跳轉到微信平臺進行自動授權然后跳轉會指定頁面,也可在系統登錄的時候就進行授權跳轉。貼代碼注意加粗代碼即可。還是推薦看文檔 授權跳轉 頁面跳轉授權
<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為你要授權之后跳轉回來的url
/*** * 活動報名* * @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 輸入鏈接說明 遇到不懂的地方或者缺少的參數請往上看文檔。 主要具體步驟有
最后貼一下我的發起支付的頁面代碼,我只能幫你們到這里了,剩下的就是調試了。
<%@ 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();//configvar 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,// 必填,簽名,見附錄1jsApiList: ['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的頁面也要授權了的。至于具體要哪些授權,地方太多了慢慢找吧。
轉載于:https://my.oschina.net/u/566297/blog/512675
總結
以上是生活随笔為你收集整理的微信公众平台H5支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 串联谐振技术分析
- 下一篇: arduino c语言pdf,ardui