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


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

新手請參考博文: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);
                    }
                })
            });
        });
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM