微信app支付詳細教程

微信支付做爲三大支付之一,愈來愈多的客戶要求產品中添加微信支付   可是網上能找到可用的demo不多  php

因此寫一篇本身寫微信支付的過程,但願能給有須要的開發者一點幫助。java

下面讓咱們來進入正題數據庫

 

1準備工做apache

首先得去微信開放平臺申請app支付權限   當申請成功後會收到一封郵件   這裏面有個商店號 MCH_ID 和PARTNER_ID 注意這倆 實際上是同樣的,都是商店號,可是json

經過上圖咱們能夠看到   不一樣接口 對應的字段並不同   (有意思嗎  就不能統一一下)但其實都是一個商店號api

而後咱們還須要拿到一些key值  下面代碼有介紹  就不一一說來源了緩存

拿到這些值以後咱們就能夠進行下一步了服務器

2寫支付邏輯微信

我寫的代碼以下  關鍵點都加上了註解網絡

@Api(tags = {"支付接口"})
@RestController
@RequestMapping(value = "weixinMobile")
public class WeixinMobilePayController {
private static final Logger logger = LoggerFactory.getLogger(WeixinMobilePayController.class);



@RequestMapping(value="dop",method=RequestMethod.POST)
public JsonBack dopay(HttpServletRequest request, JsonBack jsonBack,HttpServletResponse response,String membertoken,int num,String id) throws Exception {

Member mem= MemberServiceImp.loginMemberMap.get("token");
if(mem.getMemberToken().equals(membertoken)){
MemberLevel level = memberLevelService.getMemberLevelById(id);
int x = Integer.parseInt(level.getLevelMoney());
int cc=x * num*100;//微信以分爲單位,若是數據庫裏面的價格沒擴大100的話這裏要乘以100
String total_fee =cc+"";
String body=ConstantUtil.BODY;
String mch_id=ConstantUtil.MCH_ID;
String currTime = PayCommonUtil.getCurrTime();
String strTime = currTime.substring(8, currTime.length());
String strRandom = PayCommonUtil.buildRandom(4) + "";
String nonce_str = strTime + strRandom;
String notify_url=ConstantUtil.NOTIFY_URL;//回調地址  必須能直接訪問  不是二級域名也能夠
String out_trade_no=String.valueOf(UUID.next()); // 訂單號
String timestamp=WXUtil.getTimeStamp();
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
packageParams.put("appid",ConstantUtil.APP_ID);
packageParams.put("mch_id",mch_id);
packageParams.put("nonce_str",nonce_str);
packageParams.put("body",body);// 商品描述
packageParams.put("out_trade_no", out_trade_no);// 商戶訂單號
packageParams.put("total_fee", total_fee);// 總金額
String addr = AddressUtils.getIpAddr(request);
packageParams.put("spbill_create_ip", addr);// 發起人IP地址
packageParams.put("notify_url", notify_url);// 回調地址
packageParams.put("trade_type", "APP");// 交易類型
packageParams.put("time_start",timestamp);
String sign = PayCommonUtil.createSign("UTF-8", packageParams,ConstantUtil.APP_KEY);
packageParams.put("sign", sign);// 簽名
String requestXML = PayCommonUtil.getRequestXml(packageParams);
String resXml = HttpUtil.postData(ConstantUtil.NOTIFY_URL, requestXML);
Map map = XMLUtil.doXMLParse(resXml);
String returnCode = (String) map.get("return_code");
String returnMsg = (String) map.get("return_msg");
logger.info("result:"+returnMsg);
if("SUCCESS".equals(returnCode)){
String resultCode = (String) map.get("result_code");
String prepay_id = (String) map.get("prepay_id");
String noncestr=(String) map.get("nonce_str");
if("SUCCESS".equals(resultCode)){
System.out.println("獲取prepay_id成功"+prepay_id);//必須獲取到這個prepay_id纔算微信承認了你的第一次簽名
//這裏寫預下單業務邏輯
SortedMap<Object, Object> packageParam = new TreeMap<Object, Object>();
// ConfigUtil.commonParams(packageParams);
packageParam.put("appid",ConstantUtil.APP_ID);
packageParam.put("partnerid",mch_id);
packageParam.put("noncestr",noncestr);
packageParam.put("prepayid",prepay_id);// 商品描述
packageParam.put("package", "Sign=WXPay");// 商戶訂單號
packageParam.put("timestamp",timestamp);
String sign1 = PayCommonUtil.createSign("UTF-8", packageParam,ConstantUtil.APP_KEY);//這裏是二次簽名  前臺要拿到去調起微信支付,若是這個錯了的話會在前臺報簽名錯誤
map.put("partnerid", mch_id);
map.put("timestamp", timestamp);
map.put("package","Sign=WXPay");
map.put("retcode", "0");
map.put("sign", sign1);
jsonBack = new JsonBack(true, "success", map);
}}
}else{
jsonBack = new JsonBack(false, "token不一致", null);
}
return jsonBack;
}

3 寫回調邏輯

 

微信會根據你的回調地址去請求回調的action  而且地址必須是網絡地址  能直接訪問  並且不能攜帶參數

代碼以下

@RequestMapping(value="WXP",method=RequestMethod.POST)
public void WXPayBack(HttpServletRequest request, HttpServletResponse response){
String resXml = "";
Member mem= MemberServiceImp.loginMemberMap.get("token");

try {
//解析XML
Map<String, String> map = MobileUtil.parseXml(request);
String return_code = map.get("return_code");//狀態
String out_trade_no = map.get("out_trade_no");//訂單號
if (return_code.equals("SUCCESS")) {
if (out_trade_no != null) {
//處理訂單邏輯

這裏面能夠根據訂單號來查詢到付款買的什麼

而後在預訂單里加一個是否付款的狀態來限制只能執行一次業務邏輯

不然就須要返回給微信一個success            

resXml = "<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>";
} catch (Exception e1) {
// TODO Auto-generated catch block
logger.warn("新增服務失敗");
}

}
else{
logger.warn("該用戶已經買過金卡");
}
}else{
logger.info("已經購買會員完成");
}

}else{
//logger.warn("[payPage]根據id查詢等級沒有查詢到記錄,levelId="+levelId);
}
}else{
logger.info("callback fail:{}",out_trade_no);
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[報文爲空]]></return_msg>" + "</xml> ";
}
} catch (Exception e) {
logger.error("callback fail",e);
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[報文爲空]]></return_msg>" + "</xml> ";
}
}

4  工具類

上面用到的工具類以下

package com.zhjt.health.testpay;

public class ConstantUtil {
    /**
     * 微信開發平臺應用ID 下面參數都不完整  須要寫入本身的參數
     */
    public static final String APP_ID="wx60e8c9b5b7";
    /**
     * 應用對應的憑證
     */
    public static final String APP_SECRET="85cae8f9";
    /**
     * 應用對應的密鑰
     */
    
   
    public static final String APP_KEY="wffgg";
    /**
     * 微信支付商戶號 1500906271 
     */
    public static final String MCH_ID="271";
    /**
     * 商品描述
     */
    public static final String BODY="yunyi";
    /**
     * 商戶號對應的密鑰
     */
    public static final String PARTNER_key="2121.";
    
    /**
     * 商戶id
     */
    public static final String PARTNER_ID="1";
    /**
     * 常量固定值
     */
    public static final String GRANT_TYPE="client_credential";
    /**
     * 獲取預支付id的接口url
     */
    public static String GATEURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    /**
     * 微信服務器回調通知url
     */
    public static String NOTIFY_URL="http://106.14.15.78:8090/weck";
   
    public static String NOTIFY_URL2="http://106.14.15.78:8090/wec";
    public static String NOTIFY_URL3="http://106.14.15.78:8090/wei;
}
ConstantUtil

 

package com.zhjt.health.util.pay;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
/**
 * http請求(這裏用戶獲取訂單url生成二維碼)
 * 建立者 科幫網
 * 建立時間    2017年7月31日
 *
 */
public class HttpUtil {
    private final static int CONNECT_TIMEOUT = 5000; // in milliseconds
    private final static String DEFAULT_ENCODING = "UTF-8";

    public static String postData(String urlStr, String data) {
         String postData  = postData2(urlStr, data, null);
         System.out.println(postData+"測試postDate");
         return postData;
    }

    public static String postData(String urlStr, String data, String contentType) {
        
        BufferedReader reader = null;
        System.out.println("跳進來了");
        try {
            URL url = new URL(urlStr);
            System.out.println(url+"測試URL");
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            conn.setConnectTimeout(CONNECT_TIMEOUT);
            conn.setReadTimeout(CONNECT_TIMEOUT);
            if (contentType != null)
                conn.setRequestProperty("content-type", contentType);
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);
            if (data == null)
                data = "";
            writer.write(data);
            writer.flush();
            writer.close();

            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
                sb.append("\r\n");
            }
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null)
                    reader.close();
            } catch (IOException e) {
            }
        }
        return null;
    }
    
    
     public static String postData2(String urlStr, String data, String contentType) {
            BufferedReader reader = null;  
            try {  
                URL url = new URL(urlStr);  
                URLConnection conn = url.openConnection();  
                conn.setDoOutput(true);  
                conn.setConnectTimeout(CONNECT_TIMEOUT);  
                conn.setReadTimeout(CONNECT_TIMEOUT);  
                if(contentType != null)  
                    conn.setRequestProperty("content-type", contentType);  
                OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);  
                if(data == null)  
                    data = "";  
                writer.write(data);   
                writer.flush();  
                writer.close();    
      
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));  
                StringBuilder sb = new StringBuilder();  
                String line = null;  
                while ((line = reader.readLine()) != null) {  
                    sb.append(line);  
                    sb.append("\r\n");  
                }  
                return sb.toString();  
            } catch (IOException e) {  
                e.printStackTrace();
            } finally {  
                try {  
                    if (reader != null)  
                        reader.close();  
                } catch (IOException e) {  
                }  
            }  
            return null;  
        }  
}
HttpUtil

 

package com.zhjt.health.util.pay;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

public class PayCommonUtil {
    /**
     * 是否簽名正確,規則是:按參數名稱a-z排序,遇到空值的參數不參加簽名。 
     * @Author  科幫網
     * @param characterEncoding
     * @param packageParams
     * @param API_KEY
     * @return  boolean
     * @Date    2017年7月31日
     * 更新日誌
     * 2017年7月31日  科幫網 首次建立
     *
     */
    @SuppressWarnings({ "rawtypes"})
    public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  
        StringBuffer sb = new StringBuffer();  
        Set es = packageParams.entrySet();  
        Iterator it = es.iterator();  
        while(it.hasNext()) {  
            Map.Entry entry = (Map.Entry)it.next();  
            String k = (String)entry.getKey();  
            String v = (String)entry.getValue();  
            if(!"sign".equals(k) && null != v && !"".equals(v)) {  
                sb.append(k + "=" + v + "&");  
            }  
        }  
        sb.append("key=" + API_KEY);  
        //算出摘要  
        String mysign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase();  
        String tenpaySign = ((String)packageParams.get("sign")).toLowerCase();  
        return tenpaySign.equals(mysign);  
    }  
    /** 
     * @author 
     * @date 2016-4-22 
     * @Description:sign簽名 
     * @param characterEncoding 
     *            編碼格式 
     * @param parameters 
     *            請求參數 
     * @return 
     */  
    @SuppressWarnings({ "rawtypes"})
    public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  
        StringBuffer sb = new StringBuffer();  
        Set es = packageParams.entrySet();  
        Iterator it = es.iterator();  
        while (it.hasNext()) {  
            Map.Entry entry = (Map.Entry) it.next();  
            String k = (String) entry.getKey();  
            String v = (String) entry.getValue();  
            if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {  
                sb.append(k + "=" + v + "&");  
            }  
        }  
        sb.append("key=" + API_KEY);  
        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  
        return sign;  
    }  
  
   /**
    * 將請求參數轉換爲xml格式的string
    * @Author  科幫網
    * @param parameters
    * @return  String
    * @Date    2017年7月31日
    * 更新日誌
    * 2017年7月31日  科幫網 首次建立
    *
    */
    @SuppressWarnings({ "rawtypes"})
    public static String getRequestXml(SortedMap<Object, Object> parameters) {  
        StringBuffer sb = new StringBuffer();  
        sb.append("<xml>");  
        Set es = parameters.entrySet();  
        Iterator it = es.iterator();  
        while (it.hasNext()) {  
            Map.Entry entry = (Map.Entry) it.next();  
            String k = (String) entry.getKey();  
            String v = (String) entry.getValue();  
            if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {  
                sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");  
            } else {  
                sb.append("<" + k + ">" + v + "</" + k + ">");  
            }  
        }  
        sb.append("</xml>");  
        return sb.toString();  
    }  
  
   /**
    * 取出一個指定長度大小的隨機正整數. 
    * @Author  科幫網
    * @param length
    * @return  int
    * @Date    2017年7月31日
    * 更新日誌
    * 2017年7月31日  科幫網 首次建立
    *
    */
    public static int buildRandom(int length) {  
        int num = 1;  
        double random = Math.random();  
        if (random < 0.1) {  
            random = random + 0.1;  
        }  
        for (int i = 0; i < length; i++) {  
            num = num * 10;  
        }  
        return (int) ((random * num));  
    }  
  
    /** 
     * 獲取當前時間 yyyyMMddHHmmss 
     *  
     * @return String 
     */  
    public static String getCurrTime() {  
        Date now = new Date();  
        SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");  
        String s = outFormat.format(now);  
        return s;  
    }
}
PayCommonUtil
package com.zhjt.health.util;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
/**
 * XML解析
 * 建立者 科幫網
 * 建立時間    2017年7月31日
 *
 */
public class XMLUtil {
    /**
     * 解析xml,返回第一級元素鍵值對。若是第一級元素有子節點,則此節點的值是子節點的xml數據。
     * 
     * @param strxml
     * @return
     * @throws JDOMException
     * @throws IOException
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static Map doXMLParse(String strxml) throws JDOMException, IOException {
        strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");

        if (null == strxml || "".equals(strxml)) {
            return null;
        }

        Map m = new HashMap();

        InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(in);
        Element root = doc.getRootElement();
        List list = root.getChildren();
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Element e = (Element) it.next();
            String k = e.getName();
            String v = "";
            List children = e.getChildren();
            if (children.isEmpty()) {
                v = e.getTextNormalize();
            } else {
                v = XMLUtil.getChildrenText(children);
            }

            m.put(k, v);
        }

        // 關閉流
        in.close();

        return m;
    }

    /**
     * 獲取子結點的xml
     * 
     * @param children
     * @return String
     */
    @SuppressWarnings({ "rawtypes" })
    public static String getChildrenText(List children) {
        StringBuffer sb = new StringBuffer();
        if (!children.isEmpty()) {
            Iterator it = children.iterator();
            while (it.hasNext()) {
                Element e = (Element) it.next();
                String name = e.getName();
                String value = e.getTextNormalize();
                List list = e.getChildren();
                sb.append("<" + name + ">");
                if (!list.isEmpty()) {
                    sb.append(XMLUtil.getChildrenText(list));
                }
                sb.append(value);
                sb.append("</" + name + ">");
            }
        }

        return sb.toString();
    }

}
XMLUtil
package com.zhjt.health.util.pay;

import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.google.gson.Gson;
/**
 * 微信H5支付工具類
 * 建立者 科幫網
 * 建立時間    2017年7月31日
 */
public class MobileUtil {
    /**
     * 獲取用戶openID
     * @Author  科幫網
     * @param code
     * @return  String
     * @Date    2017年7月31日
     * 更新日誌
     * 2017年7月31日  科幫網 首次建立
     *
     */
    public static String getOpenId(String code){
        if (code != null) {
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
                    + "appid="+ ConfigUtil.APP_ID
                    + "&secret="+ ConfigUtil.APP_SECRET + "&code="
                    +code + "&grant_type=authorization_code";
            String returnData = getReturnData(url);
            Gson gson = new Gson();
            OpenIdClass openIdClass = gson.fromJson(returnData,
                    OpenIdClass.class);
            if (openIdClass.getOpenid() != null) {
                return openIdClass.getOpenid();
            }
        }
        return "**************";
    }
    public static String getReturnData(String urlString) {
        String res = "";
        try {
            URL url = new URL(urlString);
            java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url
                    .openConnection();
            conn.connect();
            java.io.BufferedReader in = new java.io.BufferedReader(
                    new java.io.InputStreamReader(conn.getInputStream(),
                            "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                res += line;
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }
    /**
     * 回調request 參數解析爲map格式
     * @Author  科幫網
     * @param request
     * @return
     * @throws Exception  Map<String,String>
     * @Date    2017年7月31日
     * 更新日誌
     * 2017年7月31日  科幫網 首次建立
     *
     */
    @SuppressWarnings("unchecked")
    public static Map<String, String> parseXml(HttpServletRequest request)
            throws Exception {
        // 解析結果存儲在HashMap
        Map<String, String> map = new HashMap<String, String>();
        InputStream inputStream = request.getInputStream();
        // 讀取輸入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);
        // 獲得xml根元素
        Element root = document.getRootElement();
        // 獲得根元素的全部子節點
        List<Element> elementList = root.elements();
        // 遍歷全部子節點
        for (Element e : elementList)
            map.put(e.getName(), e.getText());
        // 釋放資源
        inputStream.close();
        inputStream = null;
        return map;
    }
}
MobileUtil
package com.zhjt.health.entity;

import java.util.Map;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel
public class JsonBack {
    
    
    @ApiModelProperty(value = "是否成功", required = true)
    private boolean success;
    
    @ApiModelProperty(value = "返回消息", required = true)
    private String message;
    
    @ApiModelProperty(value = "其餘", required = false)
    private Map<String, Object> map;

    
    
    public JsonBack() {
        super();
    }


    public JsonBack(boolean success, String message, Map<String, Object> map) {
        super();
        this.success = success;
        this.message = message;
        this.map = map;
    }


    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }



    public Map<String, Object> getMap() {
        return map;
    }


    public void setMap(Map<String, Object> map) {
        this.map = map;
    }
    
    
    

}
JsonBack

 

package com.zhjt.health.util.pay;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;

/**
 * 根據IP地址獲取詳細的地域信息
 * 建立者 科幫網
 * 建立時間    2017年7月31日
 *
 */
public class AddressUtils { 
    /**
     *
     * @param content
     *            請求的參數 格式爲:name=xxx&pwd=xxx
     * @param encoding
     *            服務器端請求編碼。如GBK,UTF-8等
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String getAddresses(String ip) throws UnsupportedEncodingException {
        String urlStr ="http://ip.taobao.com/service/getIpInfo.php";
        String returnStr = getResult(urlStr, ip);
        if (returnStr != null) {
            // 處理返回的省市區信息
            String[] temp = returnStr.split(",");
            if (temp.length < 3) {
                return "0";// 無效IP,局域網測試
            }
            String region = (temp[5].split(":"))[1].replaceAll("\"", "");
            region = decodeUnicode(region);// 省份

            String country = "";
            String area = "";
            // String region = "";
            String city = "";
            String county = "";
            String isp = "";
            for (int i = 0; i < temp.length; i++) {
                switch (i) {
                case 1:
                    country = (temp[i].split(":"))[2].replaceAll("\"", "");
                    country = decodeUnicode(country);// 國家
                    break;
                case 3:
                    area = (temp[i].split(":"))[1].replaceAll("\"", "");
                    area = decodeUnicode(area);// 地區
                    break;
                case 5:
                    region = (temp[i].split(":"))[1].replaceAll("\"", "");
                    region = decodeUnicode(region);// 省份
                    break;
                case 7:
                    city = (temp[i].split(":"))[1].replaceAll("\"", "");
                    city = decodeUnicode(city);// 市區
                    break;
                case 9:
                    county = (temp[i].split(":"))[1].replaceAll("\"", "");
                    county = decodeUnicode(county);// 地區
                    break;
                case 11:
                    isp = (temp[i].split(":"))[1].replaceAll("\"", "");
                    isp = decodeUnicode(isp); // ISP公司
                    break;
                }
            }
            String address = region+city;
            if(StringUtils.isBlank(address)){
                address = "地球村";
            }
            return address;
        }
        return null;
    }

    /**
     * @param urlStr
     *            請求的地址
     * @param content
     *            請求的參數 格式爲:name=xxx&pwd=xxx
     * @param encoding
     *            服務器端請求編碼。如GBK,UTF-8等
     * @return
     */
    private static String getResult(String urlStr, String ip) {
        URL url = null;
        HttpURLConnection connection = null;
        try {
            url = new URL(urlStr);
            connection = (HttpURLConnection) url.openConnection();// 新建鏈接實例
            /**
             * 超時錯誤 由 2s改成5s
             */
            connection.setConnectTimeout(5000);// 設置鏈接超時時間,單位毫秒
            connection.setReadTimeout(5000);// 設置讀取數據超時時間,單位毫秒
            connection.setDoOutput(true);// 是否打開輸出流 true|false
            connection.setDoInput(true);// 是否打開輸入流true|false
            connection.setRequestMethod("POST");// 提交方法POST|GET
            connection.setUseCaches(false);// 是否緩存true|false
            connection.connect();// 打開鏈接端口
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打開輸出流往對端服務器寫數據
            out.writeBytes("ip="+ip);// 寫數據,也就是提交你的表單 name=xxx&pwd=xxx
            out.flush();// 刷新
            out.close();// 關閉輸出流
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));// 往對端寫完數據對端服務器返回數據
            // ,以BufferedReader流來讀取
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            reader.close();
            return buffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();// 關閉鏈接
            }
        }
        return null;
    }

    /**
     * unicode 轉換成 中文
     * @param theString
     * @return
     */
    public static String decodeUnicode(String theString) {
        char aChar;
        int len = theString.length();
        StringBuffer outBuffer = new StringBuffer(len);
        for (int x = 0; x < len;) {
            aChar = theString.charAt(x++);
            if (aChar == '\\') {
                aChar = theString.charAt(x++);
                if (aChar == 'u') {
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = theString.charAt(x++);
                        switch (aChar) {
                        case '0':
                        case '1':
                        case '2':
                        case '3':
                        case '4':
                        case '5':
                        case '6':
                        case '7':
                        case '8':
                        case '9':
                            value = (value << 4) + aChar - '0';
                            break;
                        case 'a':
                        case 'b':
                        case 'c':
                        case 'd':
                        case 'e':
                        case 'f':
                            value = (value << 4) + 10 + aChar - 'a';
                            break;
                        case 'A':
                        case 'B':
                        case 'C':
                        case 'D':
                        case 'E':
                        case 'F':
                            value = (value << 4) + 10 + aChar - 'A';
                            break;
                        default:
                            throw new IllegalArgumentException("Malformed      encoding.");
                        }
                    }
                    outBuffer.append((char) value);
                } else {
                    if (aChar == 't') {
                        aChar = '\t';
                    } else if (aChar == 'r') {
                        aChar = '\r';
                    } else if (aChar == 'n') {
                        aChar = '\n';
                    } else if (aChar == 'f') {
                        aChar = '\f';
                    }
                    outBuffer.append(aChar);
                }
            } else {
                outBuffer.append(aChar);
            }
        }
        return outBuffer.toString();
    }
    /**
     * 獲取IP地址
     * @Author  科幫網
     * @param request
     * @return  String
     * @Date    2017年7月31日
     * 更新日誌
     * 2017年7月31日  科幫網 首次建立
     *
     */
    public static String getIpAddr(HttpServletRequest request)
    {
        String ip = request.getHeader("X-Real-IP");
        if(!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip))
            return ip;
        ip = request.getHeader("X-Forwarded-For");
        if(!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip))
        {
            int index = ip.indexOf(',');
            if(index != -1)
               return ip.substring(0, index);
            else
                return ip;
        }
        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.getHeader("HTTP_CLIENT_IP");
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
            ip = request.getRemoteAddr();
        if(ip==null||ip!=null&&ip.indexOf("0:0:0:0:0:0:0")!=-1){
            return "127.0.0.1";
        }
        return ip;
    }
}  
AddressUtils
相關文章
相關標籤/搜索