一个简单的微信小程序支付demo
生活随笔
收集整理的這篇文章主要介紹了
一个简单的微信小程序支付demo
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個簡單的微信小程序支付demo
// .wxml <button bindtap='payment'>支付 0.01</button>// .js //在這里演示支付的過程,獲取openid不做解釋 payment: function () { var that = this; console.log('openid=' + app.globalData.openid);//請求后臺發起支付,獲取5個參數,data中放入支付的總額及其openid //請求為示例 wx.request({ url: 'https://服務器域名/****/wx_pay', data: { openid: app.globalData.openid, money: "0.01" }, // method: 'POST', // header: { "Content-Type": "application/json;charset=UTF-8"}, success: res => { console.log("服務端返回訂單號"); if (res ) { //接受的5個參數,調用這個方法成功,微信就會彈出輸入密碼的界面 wx.requestPayment({ timeStamp: res.data.data.timeStamp, nonceStr: res.data.data.nonceStr, package: res.data.data.package, signType: res.data.data.signType, paySign: res.data.data.paySign,success: payRes => { //支付成功后,可以做一些邏輯判斷 console.log('支付成功!'); console.dir(payRes); }, fail: payFail => { console.log('支付失敗!'); console.dir(payFail); } }) } else { console.log('后臺沒有接受到5個參數'); } }, fail: fail => { console.log('支付獲取參數失敗!'); console.dir(fail); } }) }@RequestMapping("wx_pay") public Result<?> generateSignature(@RequestParam String openid , @RequestParam String money) throws Exception {Map<String, String> reqParams = new HashMap<>();//微信分配的小程序IDreqParams.put("appid",APPID);//微信支付分配的商戶號reqParams.put("mch_id", MCH_ID);//隨機字符串reqParams.put("nonce_str", WXPayUtil.generateNonceStr());//簽名類型reqParams.put("sign_type", "MD5");//充值訂單 商品描述reqParams.put("body", "-測試-充值訂單-微信小程序");//商戶訂單號reqParams.put("out_trade_no", WXPayUtil.createBillNo() );//訂單總金額,單位為分reqParams.put("total_fee", WXPayUtil.getMoney(money) );//終端IPreqParams.put("spbill_create_ip", "127.0.0.1");//通知地址reqParams.put("notify_url", NOTIFY_URL);//交易類型reqParams.put("trade_type", "JSAPI");//用戶標識 、openid(在接口文檔中 如果交易類型設置成'JSAPI'則必須傳入openid)reqParams.put("openid", openid);//第一次簽名String sign = WXPayUtil.generateSignature(reqParams, MCHAPI_KEY);reqParams.put("sign", sign);/** 調用支付定義下單API,返回預付單信息 prepay_id*/String xmlResult = HttpUtil.doSSLPost(WxProgramPayConfig.UNIFIED_ORDER_URL, WXPayUtil.mapToXml(reqParams));//解析統一下單返回結果的xmlMap<String, String> result = WXPayUtil.xmlToMap(xmlResult);//返回狀態碼String return_code = (String) result.get("return_code");String return_Msg = String.valueOf(result.get("return_msg"));//預付單信息String prepay_id = result.get("prepay_id");/** 小程序調起支付數據簽名*/Map<String, String> packageParams = new HashMap<String, String>();if(return_code == "SUCCESS" || return_code.equals("SUCCESS")){//返回的預付單信息packageParams.put("appId",APPID);//這邊要將返回的時間戳轉化成字符串,不然小程序端調用wx.requestPayment方法會報簽名錯誤packageParams.put("timeStamp", String.valueOf(WXPayUtil.getCurrentTimestampMs()));packageParams.put("nonceStr", WXPayUtil.generateNonceStr());packageParams.put("package", "prepay_id=" + prepay_id);packageParams.put("signType", "MD5");//再次簽名,這個簽名用于小程序端調用wx.requesetPayment方法String packageSign = WXPayUtil.generateSignature(packageParams, MCHAPI_KEY);packageParams.put("paySign", packageSign);logger.info("=======================第二次簽名:" + packageSign + "=====================");return ResultGenerator.genSuccessResult(packageParams);}else{logger.info("支付返回狀態碼錯誤 ===>" + return_code);logger.info("支付返回狀態碼錯誤 ===>" + WXPayUtil.getMsg(return_code));return ResultGenerator.genSuccessResult(return_code);}}/*** 微信小程序支付成功回調函數* @param request* @param response* @throws Exception*/@ApiIgnore@RequestMapping("/WeChatNotify")public void weChatNotify(HttpServletRequest request,HttpServletResponse response) throws Exception {logger.info("【進入微信支付回調通知】");BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream()));String line = null;StringBuilder sb = new StringBuilder();while((line = br.readLine())!=null){sb.append(line);}br.close();// 解析xml成mapMap<String, String> map = new HashMap<String, String>();map = XMLUtil.doXMLParse(sb.toString());String resXml = "";System.out.println("接收到的報文:" + sb.toString());// 過濾空 設置 TreeMapSortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();Iterator it = map.keySet().iterator();while (it.hasNext()) {String parameter = (String) it.next();String parameterValue = map.get(parameter);String v = "";if (null != parameterValue) {v = parameterValue.trim();}packageParams.put(parameter, v);}String returnCode = (String) map.get("return_code");if("SUCCESS".equals(returnCode)){//驗證簽名是否正確if (PayCommonUtil.isTenpaySign("UTF-8", packageParams, MCHAPI_KEY)) {// 這里是支付成功/**此處添加自己的業務邏輯代碼start**/ // String mch_id = (String) packageParams.get("mch_id"); // String openid = (String) packageParams.get("openid");String out_trade_no = (String) packageParams.get("out_trade_no"); //訂單號 // String prepay_id = (String) packageParams.get("prepay_id");Integer total_fee = Integer.parseInt((String)packageParams.get("total_fee"));String attach = (String)packageParams.get("attach"); //商家數據包,原樣返回------擴展字段 // JSONObject json = JSON.parseObject(attach); // String notifyUrl = json.getString("notifyUrl");// /**此處添加自己的業務邏輯代碼end**///通知微信服務器已經支付成功resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";}}else{resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"+ "<return_msg><![CDATA[報文為空]]></return_msg>" + "</xml> ";}System.out.println(resXml);System.out.println("微信支付回調數據結束");BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();}總結
以上是生活随笔為你收集整理的一个简单的微信小程序支付demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序Demo大全
- 下一篇: cocoapods 命令