微信授權(quán)

1教馆、配置微信公眾平臺(tái)服務(wù)器配置

微信公眾平臺(tái)_ 1.png

微信公眾平臺(tái)_ 2.png

校驗(yàn)?zāi)K代碼:

  • SignUtil (校驗(yàn)幫助類)
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
*類名: SignUtil </br>
*描述: 檢驗(yàn)signature 工具類 </br>
*開(kāi)發(fā)人員: souvc </br>
*創(chuàng)建時(shí)間:  2015-9-29 </br>
*發(fā)布版本:V1.0  </br>
 */
public class SignUtil {    
    // 與接口配置信息中的Token要一致
    private static String token = "souvcweixin";
    /**
    * 方法名:checkSignature</br>
    * 詳述:驗(yàn)證簽名</br>
    * 開(kāi)發(fā)人員:souvc</br>
    * 創(chuàng)建時(shí)間:2015-9-29  </br>
    * @param signature
    * @param timestamp
    * @param nonce
    * @return
    * @throws
     */
    public static boolean checkSignature(String signature, String timestamp,String nonce) {
        // 1.將token鳖擒、timestamp唉铜、nonce三個(gè)參數(shù)進(jìn)行字典序排序
        String[] arr = new String[] { ConfigUtil.getParameter("wx_token"), timestamp, nonce };
        Arrays.sort(arr);      
        // 2. 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }      
        content = null;
        // 3.將sha1加密后的字符串可與signature對(duì)比嵌施,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }
    /**
    * 方法名:byteToStr</br>
    * 詳述:將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串</br>
    * 開(kāi)發(fā)人員:souvc </br>
    * 創(chuàng)建時(shí)間:2015-9-29  </br>
    * @param byteArray
    * @return
    * @throws
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }
    /**
    * 方法名:byteToHexStr</br>
    * 詳述:將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串</br>
    * 開(kāi)發(fā)人員:souvc</br>
    * 創(chuàng)建時(shí)間:2015-9-29  </br>
    * @param mByte
    * @return
    * @throws
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        String s = new String(tempArr);
        return s;
    }
}
  • WeiXinConteroller (接收來(lái)自微信服務(wù)的請(qǐng)求)
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.sinsinet.module.Config;
import com.sinsinet.module.SNSUserInfo;
import com.sinsinet.module.WeixinOauth2Token;
import com.sinsinet.util.ConfigUtil;
import com.sinsinet.util.SignUtil;
import com.sinsinet.util.WeixinUtil;

@Controller
@RequestMapping("/weixin")
public class WeiXinConteroller {
    
    /**
     * 接收來(lái)自微信服務(wù)的請(qǐng)求
     */
    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        // 微信加密簽名
        String signature = request.getParameter("signature");
        // 時(shí)間戳
        String timestamp = request.getParameter("timestamp");
        // 隨機(jī)數(shù)
        String nonce = request.getParameter("nonce");
        // 隨機(jī)字符串
        String echostr = request.getParameter("echostr");

        PrintWriter out = response.getWriter();
        
        // 通過(guò)檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn),若校驗(yàn)成功則原樣返回echostr豪直,表示接入成功,否則接入失敗
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            out.print(echostr);
        }       
        out.close();
        out = null;
    }   
}

2度秘、網(wǎng)頁(yè)授權(quán)獲取用戶基本信息

微信公眾平臺(tái)_ - 3.png
  • 點(diǎn)擊修改進(jìn)入功能設(shè)置
QQ截圖20170807104329.png
  • 點(diǎn)擊設(shè)置 設(shè)置授權(quán)回調(diào)頁(yè)面域名


    QQ截圖20170807105236.png

微信網(wǎng)頁(yè)授權(quán)的詳細(xì)代碼

  • web.xml 配置
    <!-- 微信授權(quán)  - start -->
    <servlet>
        <servlet-name>oauthServlet</servlet-name>
        <servlet-class>com.sinsinet.service.OAuthServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>oauthServlet</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <!-- 微信授權(quán)  - end-->
  • OAuthServlet
import java.io.IOException;
import java.util.Date;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sinsinet.mapper.UserMapper;
import com.sinsinet.module.SNSUserInfo;
import com.sinsinet.module.User;
import com.sinsinet.module.WeixinOauth2Token;
import com.sinsinet.util.CommonUtil;
import com.sinsinet.util.ConfigUtil;
import com.sinsinet.util.TokenUtil;
import com.sinsinet.util.WeixinUtil;


/**
* 類名: OAuthServlet </br>
* 描述: 授權(quán)后的回調(diào)請(qǐng)求處理 </br>
* 開(kāi)發(fā)人員: souvc </br>
* 創(chuàng)建時(shí)間:  2015-11-27 </br>
* 發(fā)布版本:V1.0  </br>
 */
public class OAuthServlet extends HttpServlet {
    
    @Resource
    UserMapper mUserMapper;
    
    private static final long serialVersionUID = -1847238807216447030L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

        // 用戶同意授權(quán)后,能獲取到code
        String code = request.getParameter("code");
        String state = request.getParameter("state");
        
        // 用戶同意授權(quán)
        if (!"authdeny".equals(code)) {
            // 獲取網(wǎng)頁(yè)授權(quán)access_token
            WeixinOauth2Token weixinOauth2Token = WeixinUtil.getOauth2AccessToken(ConfigUtil.getParameter("wx_AppId"),ConfigUtil.getParameter("wx_AppSecret"),code);
            // 網(wǎng)頁(yè)授權(quán)接口訪問(wèn)憑證
            String accessToken = weixinOauth2Token.getAccessToken();
            // 用戶標(biāo)識(shí)
            String openId = weixinOauth2Token.getOpenId();
            // 獲取用戶信息
            SNSUserInfo snsUserInfo = WeixinUtil.getSNSUserInfo(accessToken, openId);
            
            User user = mUserMapper.findByOpenid(openId);
            if (user == null) {
                user.setOpenid(snsUserInfo.getOpenId());
                user.setWxName(snsUserInfo.getNickname());
                user.setSex(snsUserInfo.getSex());
                user.setRole(3);
                user.setCreateTime(new Date());
                mUserMapper.insert(user);
                user = mUserMapper.findByOpenid(openId);
            }

            // 設(shè)置要傳遞的參數(shù)
            request.setAttribute("user", user);
            request.setAttribute("state", state);
        }
        // 跳轉(zhuǎn)到index.jsp
        request.getRequestDispatcher("index.jsp").forward(request, response);
    }
}
  • WeixinOauth2Token
public class WeixinOauth2Token {
    
    // 網(wǎng)頁(yè)授權(quán)接口調(diào)用憑證
    private String accessToken;
    // 憑證有效時(shí)長(zhǎng)
    private int expiresIn;
    // 用于刷新憑證
    private String refreshToken;
    // 用戶標(biāo)識(shí)
    private String openId;
    // 用戶授權(quán)作用域
    private String scope;

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public int getExpiresIn() {
        return expiresIn;
    }

    public void setExpiresIn(int expiresIn) {
        this.expiresIn = expiresIn;
    }

    public String getRefreshToken() {
        return refreshToken;
    }

    public void setRefreshToken(String refreshToken) {
        this.refreshToken = refreshToken;
    }

    public String getOpenId() {
        return openId;
    }

    public void setOpenId(String openId) {
        this.openId = openId;
    }

    public String getScope() {
        return scope;
    }

    public void setScope(String scope) {
        this.scope = scope;
    }

}
  • SNSUserInfo
import java.util.List;

/**
* 類名: SNSUserInfo </br>
* 描述: 通過(guò)網(wǎng)頁(yè)授權(quán)獲取的用戶信息 </br>
* 開(kāi)發(fā)人員: souvc </br>
* 創(chuàng)建時(shí)間:  2015-11-27 </br>
* 發(fā)布版本:V1.0  </br>
 */
public class SNSUserInfo {
    // 用戶標(biāo)識(shí)
    private String openId;
    // 用戶昵稱
    private String nickname;
    // 性別(1是男性,2是女性剑梳,0是未知)
    private int sex;
    // 國(guó)家
    private String country;
    // 省份
    private String province;
    // 城市
    private String city;
    // 用戶頭像鏈接
    private String headImgUrl;
    // 用戶特權(quán)信息
    private List<String> privilegeList;

    public String getOpenId() {
        return openId;
    }

    public void setOpenId(String openId) {
        this.openId = openId;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getHeadImgUrl() {
        return headImgUrl;
    }

    public void setHeadImgUrl(String headImgUrl) {
        this.headImgUrl = headImgUrl;
    }

    public List<String> getPrivilegeList() {
        return privilegeList;
    }

    public void setPrivilegeList(List<String> privilegeList) {
        this.privilegeList = privilegeList;
    }
}
  • WeixinUtil
import java.awt.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sinsinet.module.SNSUserInfo;
import com.sinsinet.module.WeixinOauth2Token;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;



public class WeixinUtil {
    
    static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
    
    
    
    /**
     * 獲取網(wǎng)頁(yè)授權(quán)憑證
     * 
     * @param appId 公眾賬號(hào)的唯一標(biāo)識(shí)
     * @param appSecret 公眾賬號(hào)的密鑰
     * @param code
     * @return WeixinAouth2Token
     */
    public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {
        WeixinOauth2Token wat = null;
        // 拼接請(qǐng)求地址
        String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        requestUrl = requestUrl.replace("APPID", appId);
        requestUrl = requestUrl.replace("SECRET", appSecret);
        requestUrl = requestUrl.replace("CODE", code);
        // 獲取網(wǎng)頁(yè)授權(quán)憑證
        JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
        if (null != jsonObject) {
            try {
                wat = new WeixinOauth2Token();
                wat.setAccessToken(jsonObject.getString("access_token"));
                wat.setExpiresIn(jsonObject.getInt("expires_in"));
                wat.setRefreshToken(jsonObject.getString("refresh_token"));
                wat.setOpenId(jsonObject.getString("openid"));
                wat.setScope(jsonObject.getString("scope"));
            } catch (Exception e) {
                wat = null;
                int errorCode = jsonObject.getInt("errcode");
                String errorMsg = jsonObject.getString("errmsg");
                log.error("獲取網(wǎng)頁(yè)授權(quán)憑證失敗 errcode:{} errmsg:{}", errorCode, errorMsg);
            }
        }
        return wat;
    }
    
    /**
     * 通過(guò)網(wǎng)頁(yè)授權(quán)獲取用戶信息
     * 
     * @param accessToken 網(wǎng)頁(yè)授權(quán)接口調(diào)用憑證
     * @param openId 用戶標(biāo)識(shí)
     * @return SNSUserInfo
     */
    @SuppressWarnings( { "deprecation", "unchecked" })
    public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {
        SNSUserInfo snsUserInfo = null;
        // 拼接請(qǐng)求地址
        String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
        requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
        // 通過(guò)網(wǎng)頁(yè)授權(quán)獲取用戶信息
        JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);

        if (null != jsonObject) {
            try {
                snsUserInfo = new SNSUserInfo();
                // 用戶的標(biāo)識(shí)
                snsUserInfo.setOpenId(jsonObject.getString("openid"));
                // 昵稱
                snsUserInfo.setNickname(jsonObject.getString("nickname"));
                // 性別(1是男性唆貌,2是女性,0是未知)
                snsUserInfo.setSex(jsonObject.getInt("sex"));
                // 用戶所在國(guó)家
                snsUserInfo.setCountry(jsonObject.getString("country"));
                // 用戶所在省份
                snsUserInfo.setProvince(jsonObject.getString("province"));
                // 用戶所在城市
                snsUserInfo.setCity(jsonObject.getString("city"));
                // 用戶頭像
                snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
                // 用戶特權(quán)信息
                snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class));
            } catch (Exception e) {
                snsUserInfo = null;
                int errorCode = jsonObject.getInt("errcode");
                String errorMsg = jsonObject.getString("errmsg");
                log.error("獲取用戶信息失敗 errcode:{} errmsg:{}", errorCode, errorMsg);
            }
        }
        return snsUserInfo;
    }
}
  • 發(fā)送https請(qǐng)求方法(我的放在l了CommonUtil里)
     * 發(fā)送https請(qǐng)求
     * 
     * @param requestUrl 請(qǐng)求地址
     * @param requestMethod 請(qǐng)求方式(GET垢乙、POST)
     * @param outputStr 提交的數(shù)據(jù)
     * @return JSONObject(通過(guò)JSONObject.get(key)的方式獲取json對(duì)象的屬性值)
     */
    public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
        JSONObject jsonObject = null;
        try {
            // 創(chuàng)建SSLContext對(duì)象锨咙,并使用我們指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 從上述SSLContext對(duì)象中得到SSLSocketFactory對(duì)象
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setSSLSocketFactory(ssf);
            
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 設(shè)置請(qǐng)求方式(GET/POST)
            conn.setRequestMethod(requestMethod);

            // 當(dāng)outputStr不為null時(shí)向輸出流寫數(shù)據(jù)
            if (null != outputStr) {
                OutputStream outputStream = conn.getOutputStream();
                // 注意編碼格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }

            // 從輸入流讀取返回內(nèi)容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }

            // 釋放資源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            conn.disconnect();
            jsonObject = JSONObject.fromObject(buffer.toString());
        } catch (ConnectException ce) {
            log.error("連接超時(shí):{}", ce);
        } catch (Exception e) {
            log.error("https請(qǐng)求異常:{}", e);
        }
        return jsonObject;
    }
  • MyX509TrustManager (信任管理器 )
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;

/**
* 類名: MyX509TrustManager </br>
* 描述:信任管理器 </br>
* 開(kāi)發(fā)人員: souvc </br>
* 創(chuàng)建時(shí)間:  2015-11-27 </br>
* 發(fā)布版本:V1.0  </br>
 */
public class MyX509TrustManager implements X509TrustManager {

    // 檢查客戶端證書(shū)
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }

    // 檢查服務(wù)器端證書(shū)
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }

    // 返回受信任的X509證書(shū)數(shù)組
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

3、測(cè)試

  • 在微信客戶端中打開(kāi)此鏈接

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
需要修改的地方:

(1)替換自己的AppID
(2)將redirect_url換成自己的授權(quán)請(qǐng)求鏈接URL追逮。注意這個(gè)連接需要經(jīng)過(guò)UTF-8編碼酪刀。
(3)需要修改scope。需要彈出頁(yè)面則要修改為snsapi_userinfo 钮孵。

參考文檔

http://www.cnblogs.com/liuhongfeng/p/5099149.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骂倘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巴席,更是在濱河造成了極大的恐慌历涝,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾唉,死亡現(xiàn)場(chǎng)離奇詭異荧库,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赵刑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門分衫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人般此,你說(shuō)我怎么就攤上這事蚪战。” “怎么了恤煞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屎勘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我居扒,道長(zhǎng)概漱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任喜喂,我火速辦了婚禮瓤摧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玉吁。我一直安慰自己照弥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布进副。 她就那樣靜靜地躺著这揣,像睡著了一般悔常。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上给赞,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天机打,我揣著相機(jī)與錄音,去河邊找鬼片迅。 笑死残邀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柑蛇。 我是一名探鬼主播芥挣,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耻台!你這毒婦竟也來(lái)了空免?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粘我,失蹤者是張志新(化名)和其女友劉穎鼓蜒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體征字,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡都弹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匙姜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畅厢。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氮昧,靈堂內(nèi)的尸體忽然破棺而出框杜,到底是詐尸還是另有隱情,我是刑警寧澤袖肥,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布咪辱,位于F島的核電站,受9級(jí)特大地震影響椎组,放射性物質(zhì)發(fā)生泄漏油狂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一寸癌、第九天 我趴在偏房一處隱蔽的房頂上張望专筷。 院中可真熱鬧,春花似錦蒸苇、人聲如沸磷蛹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)味咳。三九已至庇勃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間槽驶,已是汗流浹背匪凉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捺檬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓贸铜,卻偏偏與公主長(zhǎng)得像堡纬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒿秦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1烤镐、從微信server獲取code 拼接一個(gè)url如下發(fā)送給微信服務(wù)器(url拼接的php代碼待添加) https...
    夏弦閱讀 4,206評(píng)論 1 4
  • 因?yàn)榻?jīng)常要用進(jìn)行微信H5開(kāi)發(fā),所以對(duì)網(wǎng)頁(yè)授權(quán)做下記錄 準(zhǔn)備: 需要一個(gè)已認(rèn)證的微信服務(wù)號(hào)(認(rèn)證貌似要交錢的)然后進(jìn)...
    SteveLaw1124閱讀 4,148評(píng)論 0 50
  • 微信是一個(gè)在開(kāi)發(fā)中經(jīng)常會(huì)使用到的平臺(tái)棍鳖,比如微信登錄炮叶、授權(quán)、支付渡处、分享镜悉。今天我們來(lái)看看如何在自己的應(yīng)用里面集成微信授...
    西木柚子閱讀 11,005評(píng)論 3 18
  • 其實(shí)這是第二次下水了侣肄。第一次是下海,在樂(lè)島海上公園醇份,跟我的兩個(gè)朋友手拉手漂在大海里稼锅,因?yàn)槲覀兌疾粫?huì)游泳,又怕浪花把...
    島民小事事兒閱讀 379評(píng)論 0 1