国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 阿里云部署的Java網(wǎng)站和微信開發(fā)調(diào)試心得技巧(下)

阿里云部署的Java網(wǎng)站和微信開發(fā)調(diào)試心得技巧(下)

時間:2022-08-06 21:27:01 | 來源:網(wǎng)站運(yùn)營

時間:2022-08-06 21:27:01 來源:網(wǎng)站運(yùn)營

阿里云部署的Java網(wǎng)站和微信開發(fā)調(diào)試心得技巧(下) 五,微信測試號的申請與連接以電子雜志微信用戶信息 在咱們自己的程序里面關(guān)系編寫的servlet以響應(yīng)微信號 在接下來的步驟中,我們將在測試號里面設(shè)置接口配置信息的網(wǎng)址,一經(jīng)設(shè)置,微信公眾號便會發(fā)請求到我們設(shè)置好的URL去,我們必須編寫程序應(yīng)答才能順利連通微信公眾號,因此咱們需要關(guān)系編寫相應(yīng)的響應(yīng)程序 需要關(guān)系編寫類兩個 【SignUtil】

package com.imooc.o2o.util.weixin;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;/** * 微信請求校驗(yàn)工具類 */public class SignUtil { // 與接口配置信息中的Token要一致 private static String token = "myo2o"; /** * 驗(yàn)證簽名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序 Arrays.sort(arr); 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"); // 將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 將sha1加密后的字符串可與signature對比,標(biāo)識該請求來源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串 * * @param mByte * @return */ 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; }}【W(wǎng)echatController】

package com.imooc.o2o.web.wechat;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.imooc.o2o.util.wechat.SignUtil;@Controller//一會在設(shè)置的URL里面就設(shè)置上這個路由@RequestMapping("wechat")public class WechatController { private static Logger log = LoggerFactory.getLogger(WechatController.class); @RequestMapping(method = { RequestMethod.GET }) public void doGet(HttpServletRequest request, HttpServletResponse response) { log.debug("weixin get..."); // 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。 String signature = request.getParameter("signature"); // 時間戳 String timestamp = request.getParameter("timestamp"); // 隨機(jī)數(shù) String nonce = request.getParameter("nonce"); // 隨機(jī)字符串 String echostr = request.getParameter("echostr"); // 通過檢驗(yàn)signature對請求進(jìn)行校驗(yàn),若校驗(yàn)成功則原樣返回echostr,表示接入成功,否則接入失敗 PrintWriter out = null; try { out = response.getWriter(); if (SignUtil.checkSignature(signature, timestamp, nonce)) { log.debug("weixin get success...."); out.print(echostr); } } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) out.close(); } }}之后重新部署一版最新的程序

訪問微信測試號登錄頁面,通過打開自己手機(jī)的微信,一掃掃登錄 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

展示進(jìn)入到測試號頁面后,分別看到如下信息 【測試號信息】 APPID:開發(fā)者ID,是公眾號開發(fā)識別碼,配合開發(fā)者密碼可以調(diào)用微信公眾號接口,如獲取微信昵稱等 appsecret:開發(fā)者密碼,是檢驗(yàn)公眾號開發(fā)身份的密碼,具有極高的安全性。切記不要把密碼交給第三方開發(fā)者或者編寫到代碼里

【接口配置信息】 URL:是開發(fā)者用來接收微信消息和事件的接口URL 令牌:由開發(fā)者可以任意填寫,用作生成簽名(該Token會和接口URL中含有Token進(jìn)行比對,從而驗(yàn)證安全性)

【JS接口安全 域名】域名:想調(diào)用jssdk(如想要通過微信公眾號js接口獲取地圖等工具)必須得填寫此域名,在此域名的范圍內(nèi)才能調(diào)用jssdk工具,注意這里必須是域名,不是帶有HTTP之類的URL 直接這里填寫回復(fù)時http://o2o.yitiaojieinfo.com

【測試號二維碼】 里面所有游戲了測試號二維碼以及已經(jīng)關(guān)注了的用戶信息

【體驗(yàn)接口權(quán)限表】 這里主要介紹【|網(wǎng)頁服務(wù)】里面的【|網(wǎng)頁帳號】 |網(wǎng)頁帳號主要用來設(shè)置的OAuth2.0里面的網(wǎng)頁授權(quán)域名,用戶在網(wǎng)頁授權(quán)頁同意授權(quán)給公眾號后,微信會將授權(quán)數(shù)據(jù)傳給一個回調(diào)頁面,回調(diào)頁面需在此域名下,以確保安全可靠。沙盒號回調(diào)地址支持域名和IP,正式公眾號回調(diào)地址只支持域名。直接這里設(shè)置為http://o2o.yitiaojieinfo.com

有不清楚的地方可以直接參考微信官方文檔 https://mp.weixin.qq.com / wiki?t = resource / res_main&id = mp1421135319 接下來需要編寫自己的程序以獲取關(guān)注此公眾號的用戶信息 需要編寫5個類WechatLoginController.java,UserAccessToken.java,WechatUser.java,WechatUtil.java以及MyX509TrustManager.java 【W(wǎng)echatLoginController】主要用來獲取已關(guān)注此微信號的用戶信息 做相應(yīng)處理

package com.imooc.o2o.web.wechat;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.imooc.o2o.dto.UserAccessToken;import com.imooc.o2o.dto.WechatUser;import com.imooc.o2o.util.wechat.WeiXinUserUtil;@Controller@RequestMapping("wechatlogin")/** * 獲取關(guān)注公眾號之后的微信用戶信息的接口,如果在微信瀏覽器里訪問 * https://open.weixin.qq.com/connect/oauth2/authorize?appid=您的appId&redirect_uri=http://o2o.yitiaojieinfo.com/o2o/wechatlogin/logincheck&role_type=1&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect * 則這里將會獲取到code,之后再可以通過code獲取到access_token 進(jìn)而獲取到用戶信息 * * @author xiangze * */public class WechatLoginController { private static Logger log = LoggerFactory.getLogger(WechatLoginController.class); @RequestMapping(value = "/logincheck", method = { RequestMethod.GET }) public String doGet(HttpServletRequest request, HttpServletResponse response) { log.debug("weixin login get..."); // 獲取微信公眾號傳輸過來的code,通過code可獲取access_token,進(jìn)而獲取用戶信息 String code = request.getParameter("code"); // 這個state可以用來傳我們自定義的信息,方便程序調(diào)用,這里也可以不用 // String roleType = request.getParameter("state"); log.debug("weixin login code:" + code); WechatUser user = null; String openId = null; if (null != code) { UserAccessToken token; try { // 通過code獲取access_token token = WeiXinUserUtil.getUserAccessToken(code); log.debug("weixin login token:" + token.toString()); // 通過token獲取accessToken String accessToken = token.getAccessToken(); // 通過token獲取openId openId = token.getOpenId(); // 通過access_token和openId獲取用戶昵稱等信息 user = WeiXinUserUtil.getUserInfo(accessToken, openId); log.debug("weixin login user:" + user.toString()); request.getSession().setAttribute("openId", openId); } catch (IOException e) { log.error("error in getUserAccessToken or getUserInfo or findByOpenId: " + e.toString()); e.printStackTrace(); } } // ======todo begin====== // 前面咱們獲取到openId后,可以通過它去數(shù)據(jù)庫判斷該微信帳號是否在我們網(wǎng)站里有對應(yīng)的帳號了, // 沒有的話這里可以自動創(chuàng)建上,直接實(shí)現(xiàn)微信與咱們網(wǎng)站的無縫對接。 // ======todo end====== if (user != null) { // 獲取到微信驗(yàn)證的信息后返回到指定的路由(需要自己設(shè)定) return "frontend/index"; } else { return null; } }}【UserAccessToken】用戶的accessToken實(shí)體類,用來接收的accessToken以及OpenID的等信息

package com.imooc.o2o.dto;import com.fasterxml.jackson.annotation.JsonProperty;/** * 用戶授權(quán)token * * @author xiangze * */public class UserAccessToken { // 獲取到的憑證 @JsonProperty("access_token") private String accessToken; // 憑證有效時間,單位:秒 @JsonProperty("expires_in") private String expiresIn; // 表示更新令牌,用來獲取下一次的訪問令牌,這里沒太大用處 @JsonProperty("refresh_token") private String refreshToken; // 該用戶在此公眾號下的身份標(biāo)識,對于此微信號具有唯一性 @JsonProperty("openid") private String openId; // 表示權(quán)限范圍,這里可省略 @JsonProperty("scope") private String scope; public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } public String getExpiresIn() { return expiresIn; } public void setExpiresIn(String 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; } @Override public String toString() { return "accessToken:" + this.getAccessToken() + ",openId:" + this.getOpenId(); }}【W(wǎng)echatUser】微信用戶實(shí)體類,用來接收昵稱openid等用戶信息

package com.imooc.o2o.dto;import java.io.Serializable;import com.fasterxml.jackson.annotation.JsonProperty;/** * 微信用戶實(shí)體類 * * @author xiangze * */public class WechatUser implements Serializable { /** * */ private static final long serialVersionUID = -4684067645282292327L; // openId,標(biāo)識該公眾號下面的該用戶的唯一Id @JsonProperty("openid") private String openId; // 用戶昵稱 @JsonProperty("nickname") private String nickName; // 性別 @JsonProperty("sex") private int sex; // 省份 @JsonProperty("province") private String province; // 城市 @JsonProperty("city") private String city; // 區(qū) @JsonProperty("country") private String country; // 頭像圖片地址 @JsonProperty("headimgurl") private String headimgurl; // 語言 @JsonProperty("language") private String language; // 用戶權(quán)限,這里沒什么作用 @JsonProperty("privilege") private String[] privilege; 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 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 getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getHeadimgurl() { return headimgurl; } public void setHeadimgurl(String headimgurl) { this.headimgurl = headimgurl; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public String[] getPrivilege() { return privilege; } public void setPrivilege(String[] privilege) { this.privilege = privilege; } @Override public String toString() { return "openId:" + this.getOpenId() + ",nikename:" + this.getNickName(); }}【W(wǎng)echatUtil】主要用來提交HTTPS請求給微信獲取用戶信息

package com.imooc.o2o.util.wechat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ConnectException;import java.net.URL;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.fasterxml.jackson.core.JsonParseException;import com.fasterxml.jackson.databind.JsonMappingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.imooc.o2o.dto.UserAccessToken;import com.imooc.o2o.dto.WechatUser;/** * 微信工具類 * * @author xiangze * */public class WechatUtil { private static Logger log = LoggerFactory.getLogger(WechatUtil.class); /** * 獲取UserAccessToken實(shí)體類 * * @param code * @return * @throws IOException */ public static UserAccessToken getUserAccessToken(String code) throws IOException { // 測試號信息里的appId String appId = "您的appId"; log.debug("appId:" + appId); // 測試號信息里的appsecret String appsecret = "您的appsecret"; log.debug("secret:" + appsecret); // 根據(jù)傳入的code,拼接出訪問微信定義好的接口的URL String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code"; // 向相應(yīng)URL發(fā)送請求獲取token json字符串 String tokenStr = httpsRequest(url, "GET", null); log.debug("userAccessToken:" + tokenStr); UserAccessToken token = new UserAccessToken(); ObjectMapper objectMapper = new ObjectMapper(); try { // 將json字符串轉(zhuǎn)換成相應(yīng)對象 token = objectMapper.readValue(tokenStr, UserAccessToken.class); } catch (JsonParseException e) { log.error("獲取用戶accessToken失敗: " + e.getMessage()); e.printStackTrace(); } catch (JsonMappingException e) { log.error("獲取用戶accessToken失敗: " + e.getMessage()); e.printStackTrace(); } catch (IOException e) { log.error("獲取用戶accessToken失敗: " + e.getMessage()); e.printStackTrace(); } if (token == null) { log.error("獲取用戶accessToken失敗。"); return null; } return token; } /** * 獲取WechatUser實(shí)體類 * * @param accessToken * @param openId * @return */ public static WechatUser getUserInfo(String accessToken, String openId) { // 根據(jù)傳入的accessToken以及openId拼接出訪問微信定義的端口并獲取用戶信息的URL String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN"; // 訪問該URL獲取用戶信息json 字符串 String userStr = httpsRequest(url, "GET", null); log.debug("user info :" + userStr); WechatUser user = new WechatUser(); ObjectMapper objectMapper = new ObjectMapper(); try { // 將json字符串轉(zhuǎn)換成相應(yīng)對象 user = objectMapper.readValue(userStr, WechatUser.class); } catch (JsonParseException e) { log.error("獲取用戶信息失敗: " + e.getMessage()); e.printStackTrace(); } catch (JsonMappingException e) { log.error("獲取用戶信息失敗: " + e.getMessage()); e.printStackTrace(); } catch (IOException e) { log.error("獲取用戶信息失敗: " + e.getMessage()); e.printStackTrace(); } if (user == null) { log.error("獲取用戶信息失敗。"); return null; } return user; } /** * 發(fā)起https請求并獲取結(jié)果 * * @param requestUrl * 請求地址 * @param requestMethod * 請求方式(GET、POST) * @param outputStr * 提交的數(shù)據(jù) * @return json字符串 */ public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) { StringBuffer buffer = new StringBuffer(); try { // 創(chuàng)建SSLContext對象,并使用我們指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 從上述SSLContext對象中得到SSLSocketFactory對象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); httpUrlConn.setSSLSocketFactory(ssf); httpUrlConn.setDoOutput(true); httpUrlConn.setDoInput(true); httpUrlConn.setUseCaches(false); // 設(shè)置請求方式(GET/POST) httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect(); // 當(dāng)有數(shù)據(jù)需要提交時 if (null != outputStr) { OutputStream outputStream = httpUrlConn.getOutputStream(); // 注意編碼格式,防止中文亂碼 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 將返回的輸入流轉(zhuǎn)換成字符串 InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); // 釋放資源 inputStream.close(); inputStream = null; httpUrlConn.disconnect(); log.debug("https buffer:" + buffer.toString()); } catch (ConnectException ce) { log.error("Weixin server connection timed out."); } catch (Exception e) { log.error("https request error:{}", e); } return buffer.toString(); }}【MyX509TrustManager】主要繼承X509TrustManager做HTTPS證書信任管理器

package com.imooc.o2o.util.wechat;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;/** * 證書信任管理器(用于https請求) * * @author xiangze * */public class MyX509TrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; }}之后重新打包一個新的war包并發(fā)到服務(wù)器tomcat webapps目錄下 發(fā)布成功后,關(guān)注你自己的測試號(即掃描測試號的那個二維碼),然后在手機(jī)微信里面或者微信開發(fā)者工具里訪問相應(yīng)鏈接: https://open.weixin.qq.com/connect/oauth2/authorize?appid=您的appid&redirect_uri = http://o2o.yitiaojieinfo.com/o2o/wechatlogin/logincheck&role_type=1&response_type=code&scope=snsapi_userinfo&state=1 #wechat_redirect

之后查看日志信息,發(fā)現(xiàn)便能確實(shí)能夠到電子雜志的用戶信息了

至此咱們已經(jīng)從無到有完成了阿里云部署的Java網(wǎng)站和微信公眾號的開發(fā),文章雖長,但是干貨多多,都是傻瓜式的配置,希望大家喜歡。 注意事項(xiàng):

  1. 由于Tomcat的咱們沒有調(diào)優(yōu),啟動較慢,建議每次重啟等待幾分鐘再去訪問,否則會假死,需要?dú)⒌粼僦貑?/li>
  2. 經(jīng)過認(rèn)證的微信服務(wù)號跟測試號其實(shí)是一樣的,大家可以按照上述去配置



作者: xiangzepro

鏈接:http://www.imooc.com/article/20584

來源:慕課網(wǎng)

本文原創(chuàng)發(fā)布于慕課網(wǎng) ,轉(zhuǎn)載請注明出處,謝謝合作!

關(guān)鍵詞:技巧,部署

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉