1. 程式人生 > >java微信支付--------公眾號內H5調起支付

java微信支付--------公眾號內H5調起支付

記錄 catch 配置參數 null pid 工具 請求 exception The

謹以此做記錄,方便下次實現,不適合新手拷貝,如有指教,歡迎留言討論!

新手請參考博文:https://blog.csdn.net/javaYouCome/article/details/79473743,致謝該博主!

微信支付官方文檔:https://pay.weixin.qq.com/wiki/doc/api/index.html

記錄幾個容易出問題的點:

1、參與簽名的參數名大小寫保持與官方文檔一致,

2、在商戶平臺配置支付目錄,類似配置js安全接口域名

3、調用統一下單接口獲取prepay_id=參數(參數簽名浪費了很多時間,註意參數名保持一致)

主要代碼:

後臺調用統一下單接口:參數簽名工具類來自微信官方支付demo

/**
     * 統一下單接口,獲取prepay_id
     * @param request
     * @return
     */
    @RequestMapping(value = "/unifiedOrder", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, String> unifiedOrder(HttpServletRequest request,String openId,String totalFee) {
        try {
            
// 不帶properties擴展名的文件名 ResourceBundle wx = ResourceBundle.getBundle("wx"); // 統一下單 https://api.mch.weixin.qq.com/pay/unifiedorder String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //拼接統一下單地址參數 Map<String, String> paraMap = new
HashMap<String, String>(); //獲取請求ip地址 String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getRemoteAddr(); } if(ip.indexOf(",")!=-1){ String[] ips = ip.split(","); ip = ips[0].trim(); } String appid = wx.getString("wx_appid"); paraMap.put("appid", appid); paraMap.put("body", "********"); paraMap.put("mch_id", "****"); paraMap.put("nonce_str", WXPayUtil.generateNonceStr()); paraMap.put("openid", openId); paraMap.put("out_trade_no", new Date().getTime()+"");//訂單號 paraMap.put("spbill_create_ip", ip); paraMap.put("total_fee",totalFee); paraMap.put("trade_type", "JSAPI"); paraMap.put("notify_url",wx.getString("red_url") + "/callback.do");// 此路徑是微信服務器調用支付結果通知路徑隨意寫 String sign = WXPayUtil.generateSignature(paraMap, "********"); paraMap.put("sign", sign); String xml = WXPayUtil.mapToXml(paraMap);//將所有參數(map)轉xml格式 System.out.println(xml); String xmlStr = wxMpService.post(unifiedorder_url, xml); //發送post請求"統一下單接口"返回預支付id:prepay_id //以下內容是返回前端頁面的json數據 String prepay_id = "";//預支付id if (xmlStr.indexOf("SUCCESS") != -1) { Map<String, String> map = WXPayUtil.xmlToMap(xmlStr); prepay_id = (String) map.get("prepay_id"); } Map<String, String> payMap = new HashMap<String, String>(); payMap.put("appId", appid); payMap.put("timeStamp", WXPayUtil.getCurrentTimestamp()+""); payMap.put("nonceStr", WXPayUtil.generateNonceStr()); payMap.put("signType", "MD5"); payMap.put("package", "prepay_id=" + prepay_id); String paySign = WXPayUtil.generateSignature(payMap, "*******"); payMap.put("paySign", paySign); String xml2 = WXPayUtil.mapToXml(payMap);//將所有參數(map)轉xml格式 System.out.println(xml2); return payMap; } catch (Exception e) { e.printStackTrace(); return null; } } @RequestMapping(value="/callback",method=RequestMethod.GET) public String callBack(HttpServletRequest request,HttpServletResponse response){ //System.out.println("微信支付成功,微信發送的callback信息,請註意修改訂單信息"); InputStream is = null; try { is = request.getInputStream();//獲取請求的流信息(這裏是微信發的xml格式所有只能使用流來讀) String xml = WXPayUtil.inputStream2String(is, "UTF-8"); Map<String, String> notifyMap = WXPayUtil.xmlToMap(xml);//將微信發的xml轉map if(notifyMap.get("return_code").equals("SUCCESS")){ //支付成功 } //告訴微信服務器收到信息了,不要在調用回調action了========這裏很重要回復微信服務器信息用流發送一個xml即可 response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>"); is.close(); } catch (Exception e) { e.printStackTrace(); } return null; }

前臺jssdk接收配置參數,調起支付:

//支付
    function pay(price){
        $.get("${basePath}/pay/unifiedOrder.do",{"openId":"${sessionScope.openId }","totalFee":price},function(data,status){
            wx.ready(function() { 
                wx.chooseWXPay({
                    timestamp: data.timeStamp, // 支付簽名時間戳,註意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付後臺生成簽名使用的timeStamp字段名需大寫其中的S字符
                    nonceStr: data.nonceStr, // 支付簽名隨機串,不長於 32 位
                    package: data.package, // 統一支付接口返回的prepay_id參數值,提交格式如:prepay_id=\*\*\*)
                    signType: data.signType, // 簽名方式,默認為‘SHA1‘,使用新版支付需傳入‘MD5‘
                    paySign: data.paySign, // 支付簽名
                    success: function (res) {
                        // 支付成功後的回調函數
                        alert(1);
                    }
                })
            });
        });
    }

java微信支付--------公眾號內H5調起支付