日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单的实现微信获取openid

發(fā)布時間:2025/3/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单的实现微信获取openid 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

微信公眾平臺獲取openid在公眾號的開發(fā)中有很多用途,前段時間為實現(xiàn)用戶使用公眾號在登錄一次以后可以免密登陸而使用了openid。開發(fā)過程中遇到了一些問題,在這里向需要且還沒有獲取到openid的米娜桑分享一下簡單的流程及部分代碼,和一些問題的解決方式,給初次接觸微信openid的朋友們一個參考。目的只在于獲取openid,至于優(yōu)化及應(yīng)用上諸君請自由發(fā)揮。


首先了解openid是什么,一個微信號與一個公眾號對應(yīng)一個固定不變的openid。所以一個微信號在一個公眾號下的openid是不變的,如果換了一個對應(yīng)的公眾號,那就是另一個openid了。且只有在微信自帶瀏覽器中打開的項目才可獲取到。
準備:

首先你要有一個公眾號,還有一個外網(wǎng)可訪問的域名,我的公眾號類型是企業(yè)號,這里就以企業(yè)號為例了。獲取openid需要的公眾號的 appid 和 secret(登陸公眾平臺 開發(fā)----->基本配置中的開發(fā)者ID(AppID)和 開發(fā)者密碼(AppSecret)就是)。其次是設(shè)置網(wǎng)頁授權(quán)域名(登陸公眾平臺 設(shè)置----->公眾號設(shè)置------>功能設(shè)置----->網(wǎng)頁授權(quán)域名 按步驟操作并設(shè)置就好),這個域名就是你獲取openid的web項目發(fā)布的域名,這里注意服務(wù)器請一定跑在80端口。


流程:

1.調(diào)用https://open.weixin.qq.com/connect/oauth2/authorize接口獲取到code

2.得到code作為一個參數(shù)調(diào)用https://api.weixin.qq.com/sns/oauth2/access_token接口獲取到openid


因為只是簡單的獲取到openid,這里只放兩個servlet與用到的工具類代碼:

第一個是獲取code用的WxCodeServlt

public class WxCodeServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//這里要將你的授權(quán)回調(diào)地址處理一下,否則微信識別不了
String redirect_uri=URLEncoder.encode("/*你的授權(quán)回調(diào)地址*/", "UTF-8");
//簡單獲取openid的話參數(shù)response_type與scope與state參數(shù)固定寫死即可
StringBuffer url=new StringBuffer("https://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri="+redirect_uri+
"&appid="+/*你的appid*/+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect");
response.sendRedirect(url.toString());//這里請不要使用get請求單純的將頁面跳轉(zhuǎn)到該url即可


}

當(dāng)用戶用微信進入我們的網(wǎng)頁并調(diào)用到WxCodeServlet之后,若參數(shù)無誤,設(shè)置的網(wǎng)頁授權(quán)域名正確,微信就會重定向頁面到我們提交的回調(diào)地址,同時我們想要的code也會被傳過來

而這個回調(diào)地址就是我們的第二個servlet WxOpenIdServlet

public class WxOpenIdServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String code = request.getParameter("code");//獲取code
Map params = new HashMap();
params.put("secret", "/*你的secret*/");
params.put("appid", "/*你的appid*/");
params.put("grant_type", "authorization_code");
params.put("code", code);
String result = HttpGetUtil.httpRequestToString(
"https://api.weixin.qq.com/sns/oauth2/access_token", params);
JSONObject jsonObject = JSONObject.fromObject(result);

String openid = jsonObject.get("openid").toString();
System.out.println("得到的openid為:"+openid);
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}


在這里我要補充一下了,一位朋友獲取到code后去請求卻被微信反悔了一個錯誤碼"errcode":40125,對應(yīng)的錯誤是appsecret無效,可是填寫的appsecret與公眾平臺中的appsecret一致。這個問題在開發(fā)時我也遇到過,解決方式是重置appsecret,當(dāng)初也沒在意,現(xiàn)在看來這個問題挺頻繁的,所以在這里再補充一下。


其中用到了一個工具類HttpGetUtil JSON需要的包這里就不說了

public class HttpGetUtil {

public static String httpRequestToString(String url,
Map<String,String> params) {
String result = null;
try {
InputStream is = httpRequestToStream(url, params);
BufferedReader in = new BufferedReader(new InputStreamReader(is,
"UTF-8"));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
result = buffer.toString();
} catch (Exception e) {
return null;
}
return result;
}

private static InputStream httpRequestToStream(String url,
Map<String, String> params) {
InputStream is = null;
try {
String parameters = "";
boolean hasParams = false;
for(String key : params.keySet()){
String value = URLEncoder.encode(params.get(key), "UTF-8");
parameters += key +"="+ value +"&";
hasParams = true;
}
if(hasParams){
parameters = parameters.substring(0, parameters.length()-1);
}


url += "?"+ parameters;

URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("contentType", "utf-8");
conn.setConnectTimeout(50000);
conn.setReadTimeout(50000);
conn.setDoInput(true);
//設(shè)置請求方式,默認為GET
conn.setRequestMethod("GET");


is = conn.getInputStream();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}

}

?


至此如果各個步驟都沒有出錯的話,當(dāng)我們的WxCodeServlet被調(diào)用后,控制臺就能打印出來剛才通過微信打開我們網(wǎng)頁并調(diào)用到WxCodeServlet的微信用戶對應(yīng)我們公眾平臺的openid了

注意問題:

1.網(wǎng)頁授權(quán)域名設(shè)置如果與提交的回調(diào)地址的域名不對應(yīng),微信是無法回調(diào)到的。

2.單純的獲取openid使用的授權(quán)方式是靜態(tài)授權(quán),不需要經(jīng)過用戶許可的(用戶看不到授權(quán)的過程),而想要獲取用戶的頭像昵稱等信息是另一種授權(quán)(用戶端會彈出授權(quán)窗口),在此就不介紹了。

3.提交的回調(diào)地址格式為 http://xxxx.xxxx.com/xxxxx/WxOpenIdServlet,使用java.net 包里的URLEncoder.encode("url","utf-8")處理后提交

4.如遇到問題,請耐心細心的回頭按步驟檢查資料信息以及代碼。

轉(zhuǎn)載于:https://www.cnblogs.com/niudaxianren/p/9999515.html

總結(jié)

以上是生活随笔為你收集整理的简单的实现微信获取openid的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。