


Explication détaillée de l'exemple d'obtention de l'authentification d'autorisation de page Web OAuth2.0 et d'obtention d'informations utilisateur pour le développement de WeChat
Apr 26, 2017 pm 02:58 PM Récemment, nous avons implémenté une fonction de connexion d'autorisation d'association d'utilisateurs entre les comptes publics WeChat et les utilisateurs de leur propre site Web. L'objectif principal est que les utilisateurs suivent le compte public et cliquent sur le centre des membres et sur une page Web. une autorisation qui nécessite une autorisation d'association appara?tra?: Autorisation de page Web OAuth2.0, Ensuite, l'utilisateur accepte d'obtenir des informations sur l'utilisateur, d'associer l'utilisateur au site Web, puis l'utilisateur peut se connecter à l'aide de WeChat .
Ce que nous faisons cette fois, c'est traiter chaque paramètre de retour pour obtenir des données dans la couche Action de Java.
1. Outils utilisés :
1. ngrok, utilise le v?tre Le local See More la machine est mappée sur le réseau public, afin qu'elle puisse être testée et développée à tout moment ??> 2. Placez le fichier dans le répertoire Tomcat et exécutez ngrok -config ngrok.cfg -subdomain xinzhi 8080
3. L'outil ngrok est sur le réseau MOOC @LAOBI look 2. Compte de test du compte public WeChat, testez à tout moment, assurez-vous d'abord qu'il n'y a pas de problèmes sous le compte test avant de transplanter le compte public.
2. Utilisez-le pour envoyer une requête Http en Java, puis renvoyez les paramètres JSON, obtenez les paramètres JSON, puis traitez-les.
Tout d'abord, récupérez le compte de test du compte public et mettez-le dans le fichier de propriétés afin que nous puissions l'appeler ou le remplacer. Par exemple?: veuillez utiliser httpsCode des propriétés
Cette url est l'adresse que nous mappons au réseau externe , dont nous aurons besoin plus tard. Ensuite, deux classes d'outils sont nécessaires. La fonction de cette classe d'outils est d'obtenir la valeur de retour après l'envoi d'une requête http dans Java Action
AppID = wxf00**c3dd2ebfa0 AppSecret = 3cb220755f****506dc35391aa5c03ec url = https://xinzhi.tunnel.mobi
WeixinUtil.java et MyX509TrustManager.java
Code Java Pour les requêtes https, nous avons besoin d'un gestionnaire de confiance de certificat. Cette classe de gestionnaire doit être définie par nous-mêmes, mais elle doit implémenter l'interface X509TrustManager. comme suit?:
Code Java
package com.zhtx.common.util; import java.io.BufferedReader; 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; /** * 公眾平臺通用接口工具類 * * @author xinz * @date 2015-10-14 */ public class WeixinUtil { private static Logger log = LoggerFactory.getLogger(WeixinUtil.class); /** * 發(fā)起https請求并獲取結(jié)果 * * @param requestUrl 請求地址 * @param requestMethod 請求方式(GET、POST) * @param outputStr 提交的數(shù)據(jù) * @return JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值) */ public static String httpRequest(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(); } catch (ConnectException ce) { log.error("Weixin server connection timed out."); } catch (Exception e) { log.error("https request error:{}", e); } return buffer.toString(); } }
WeChat renvoie une classe de paramètres POJO?:
Code Java
package com.zhtx.common.util; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; /** * 證書信任管理器(用于https請求) * * @author xinz * @date 2015-10-14 */ 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; } }
Classe de vérification des informations d'identification d'autorisation?: Code Java
private String openid; //用戶的唯一標(biāo)識 private String nickname;//用戶昵稱 private Integer sex;// 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知 private String province;//用戶個人資料填寫的省份 private String city;//普通用戶個人資料填寫的城市 private String country;// 國家,如中國為CN private String headimgurl; // 用戶頭像,最后一個數(shù)值代表正方形頭像大?。ㄓ?、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空。若用戶更換頭像,原有頭像URL將失效。 private String privilege;// 用戶特權(quán)信息,json 數(shù)組,如微信沃卡用戶為(chinaunicom) private String unionid;// 只有在用戶將公眾號綁定到微信開放平臺帳號后,才會出現(xiàn)該字段。詳見:獲取用戶個人信息(UnionID機(jī)制) private String access_token;
Code d'échange pour l'autorisation de page Web access_tokenCode Java
private String access_token; private String expires_in; private String refresh_token; private String openid; private String scope; private String unionid;
關(guān)于微信頭像的,獲取的是一個http的url,則需要將圖片下載到服務(wù)器存儲,然后獲得相對路徑:
Java代碼
/** * 使用url或者h(yuǎn)ttp存入文件 * @Title: fileUpload * @param @param fileUrl 文件url,可以是http * @param @param path 文件存儲路徑 * @return void * @throws xinz */ public static void fileUpload (String fileUrl,String path){ //讀取文件 String s1 = fileUrl; java.io.InputStream is = null; //定義一個輸入流。 BufferedInputStream bis = null;//定義一個帶緩沖的輸入流 。 //寫到本地 BufferedOutputStream bos = null; //定義一個帶緩沖的輸出流。 try{ java.net.URL url = new java.net.URL(s1);//創(chuàng)建一個URL對象。 is = url.openStream();//打開到此 URL 的連接并返回一個用于從該連接讀入的 InputStream。 bis = new java.io.BufferedInputStream(is); File file = new File(path); if(!file.exists()){ //測試此抽象路徑名表示的文件或目錄是否存在。 file.createNewFile(); //創(chuàng)建此抽象路徑名表示的文件或目錄。 } bos = new BufferedOutputStream(new FileOutputStream(file));; byte[] b = new byte[1024]; //創(chuàng)建字節(jié)數(shù)組。 while(bis.read(b)!=-1){//輸入流中的數(shù)據(jù)如果還有下一行(!=-1)將繼續(xù)循環(huán) bos.write(b);//將字節(jié)數(shù)組寫入輸出流。 } }catch(Exception e){ System.out.println(e.toString()); }finally{ try{ bos.flush();//刷新此緩沖的輸出流。 bis.close(); //關(guān)閉此輸入流 。 }catch(Exception e){ System.out.println(e.toString()); } } }
現(xiàn)在是基礎(chǔ)工作都做完了,現(xiàn)在開發(fā)代碼的開發(fā),在微信開發(fā)文檔中 http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 有提到每一個步驟,然后我們按照這個步驟開發(fā):
1第一步:用戶同意授權(quán),獲取code
2第二步:通過code換取網(wǎng)頁授權(quán)access_token
3第三步:刷新access_token(如果需要)
4第四步:拉取用戶信息(需scope為 snsapi_userinfo)
5附:檢驗授權(quán)憑證(access_token)是否有效
第一步:用戶同意授權(quán),獲取code
這里的url就是前面所準(zhǔn)備在properties中的url了。
Java代碼
/** * 微信用戶授權(quán) * @Title: wechatOauth * @param @param request * @param @param response * @param @param model * @param @return * @return String * @throws xinz */ @RequestMapping("wechatOauth") public String wechatOauth(HttpServletRequest request,HttpServletResponse response,Model model) { /** * 1 第一步:用戶同意授權(quán),獲取code */ //首先拿到微信公眾號的AppID、AppSecret等參數(shù) String AppID = ZhtxHelper.getApplicationResourcesProp("sendSms","AppID"); String urlOpen = ZhtxHelper.getApplicationResourcesProp("sendSms","url"); //如果用戶授權(quán)成功則跳轉(zhuǎn)到此url String loginUrl = ""+urlOpen+"/zhtx-wap/weixin/getAccessToken"; //用戶授權(quán),獲取code String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + "appid="+AppID+"" + "&redirect_uri="+loginUrl+"" + "&response_type=code" + "&scope=snsapi_userinfo" + "&state=123#wechat_redirect"; //forward redirect return "redirect:"+url+""; }
第二步:通過code換取網(wǎng)頁授權(quán)access_token
Java代碼
/** * 通過code換取網(wǎng)頁授權(quán)access_token * @Title: getAccessToken * @param @param request * @param @param response * @param @param model * @param @return * @return String * @throws xinz */ @RequestMapping("getAccessToken") public String getAccessToken(HttpServletRequest request,HttpServletResponse response,Model model) { //獲取到返回的參數(shù) try { //首先拿到微信公眾號的AppID、AppSecret等參數(shù) String AppID = ZhtxHelper.getApplicationResourcesProp("sendSms","AppID"); String AppSecret = ZhtxHelper.getApplicationResourcesProp("sendSms","AppSecret"); String code = request.getParameter("code"); String url = null; if(code!=null){ /** * 2 第二步:通過code換取網(wǎng)頁授權(quán)access_token */ //用戶授權(quán),獲取code url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + "appid="+AppID+"" + "&secret="+AppSecret+"" + "&code="+code+"" + "&grant_type=authorization_code"; String requestMethod = "GET"; String outputStr = ""; String httpRequest = WeixinUtil.httpRequest(url, requestMethod, outputStr); System.out.println("通過code換取網(wǎng)頁授權(quán)access_token="+httpRequest); AccessTokenModel accTok = JSON.parseObject(httpRequest, AccessTokenModel.class); /** * 4 第四步:拉取用戶信息(需scope為 snsapi_userinfo) */ //用戶授權(quán),獲取code String urlUser = "https://api.weixin.qq.com/sns/userinfo?" + "access_token="+accTok.getAccess_token()+"" + "&openid="+accTok.getOpenid()+"" + "&lang=zh_CN"; String httpUser = WeixinUtil.httpRequest(urlUser, requestMethod, outputStr); System.out.println("拉取用戶信息=="+httpUser); WechatUser wechatUser = JSON.parseObject(httpUser, WechatUser.class); wechatUser.setAccess_token(accTok.getAccess_token()); /** * 5 附:檢驗授權(quán)憑證(access_token)是否有效 */ WechatMsg checkAccessToken = checkAccessToken(wechatUser.getAccess_token(), wechatUser.getOpenid()); if(checkAccessToken.getErrcode().equals("0")){ CurrentSession.setAttribute("wechatUser", wechatUser); WechatUser wechatU = new WechatUser(); wechatU.setOpenid(wechatUser.getOpenid()); List<WechatUser> findWechatUser = wechatUserService.findWechatUser(wechatU); if(findWechatUser.size()>0){ UserRegister userRegister = userService.findUserByOpenid(wechatUser.getOpenid()); CurrentSession.setAttribute("user", userRegister); return "redirect:/user/userCenter"; }else{ return "/jsp/wechat/wechatregister"; } }else{ //如果access_token失效,則再次進(jìn)行調(diào)用,并存儲access_token值,access_token有效期為2個小時 this.wechatOauth(request, response, model); } } } catch (Exception e) { System.out.println("===拉取用戶出錯==="); e.printStackTrace(); } //forward redirect return "/jsp/wechat/wechatregister"; }
第四步:拉取用戶,和自己網(wǎng)站用戶綁定
Java代碼
/** * 微信關(guān)聯(lián)用戶 * @Title: saveWechatUser * @param @param mobilePhone * @param @param password * @param @param validataCode * @param @return * @return String * @throws xinz */ @RequestMapping("saveWechatUser") public String saveWechatUser(HttpServletResponse response,String mobilePhone,String password,String validataCode){ //使用手機(jī)號來判斷該手機(jī)是否在注冊 UserRegister userRegister = userService.findUserByPhone(mobilePhone); WechatUser wechatUser = (WechatUser)CurrentSession.getAttribute("wechatUser"); WechatUser wechatU = new WechatUser(); wechatU.setOpenid(wechatUser.getOpenid()); List<WechatUser> findWechatUser = wechatUserService.findWechatUser(wechatU); if(findWechatUser.size()>0 && userRegister.getOpenid()!=null){ CurrentSession.setAttribute("user", userRegister); return "redirect:/user/userCenter"; }else{ //如果沒有注冊,開始注冊 if(userRegister==null){ Result<UserRegister> saveUserInfoApp = userRegisterService.saveUserInfoApp(mobilePhone, password, validataCode,wechatUser); if(saveUserInfoApp.getState()==1){ //進(jìn)行微信和用戶的關(guān)聯(lián) wechatUserService.saveWechatUser(wechatUser); CurrentSession.setAttribute("user", userRegister); return "redirect:/user/userCenter"; } }else if(userRegister.getOpenid()==null || userRegister.getOpenid().equals("")){ //否則,查詢出用戶信息,放入session中,關(guān)聯(lián)微信,跳轉(zhuǎn)到用戶中心 UserRegister userReg = new UserRegister(); userReg.setId(userRegister.getId()); //存入微信openid userReg.setOpenid(wechatUser.getOpenid()); userService.upUser(userReg); UserInfo user = new UserInfo(); //存入微信頭像 //圖片類型 String dateStr =DateUtil.format(DateUtil.getCurrentDate(), "yyyyMMdd") + "/"; //圖片類型 String imgType = "JPG"; //微信頭像名稱 String app2DBarNameAndType = UuidUtil.getUUID()+"."+imgType; //微信頭像路徑 String path = ZhtxHelper.getApplicationResourcesProp("application","app.img.projectpath")+ SysConstant.GOODS2DBARPATH + dateStr; File file1 = new File(path); file1.mkdirs(); //圖片全路徑 String imgUrl = SysConstant.GOODS2DBARPATH + dateStr+app2DBarNameAndType; FileUtil.fileUpload(wechatUser.getHeadimgurl(), path); user.setRegisterId(userRegister.getId()); user.setImageUrl(imgUrl); userInfoService.updateUserInfo(user); //存入微信用戶 wechatUserService.saveWechatUser(wechatUser); UserRegister userW = userService.findUserByPhone(mobilePhone); CurrentSession.setAttribute("user", userW); return "redirect:/user/userCenter"; }else{ CurrentSession.setAttribute("user", userRegister); return "redirect:/user/userCenter"; } } return "redirect:/user/userCenter"; }
附:檢驗授權(quán)憑證(access_token)是否有效
Java代碼
/** * 檢驗授權(quán)憑證(access_token)是否有效 * @Title: checkAccessToken * @param @param access_token 網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同 * @param @param openid 用戶的唯一標(biāo)識 * @return WechatMsg 返回消息實體 * @throws xinz */ public static WechatMsg checkAccessToken(String access_token,String openid){ String requestMethod = "GET"; String outputStr = ""; String url = "https://api.weixin.qq.com/sns/auth?" + "access_token="+access_token+"" + "&openid="+openid+""; String httpmsg = WeixinUtil.httpRequest(url, requestMethod, outputStr); System.out.println("拉取用戶信息返回消息=="+httpmsg); WechatMsg msg = JSON.parseObject(httpmsg, WechatMsg.class); return msg; }
?然后在網(wǎng)頁端,則是需要編寫H5頁面,進(jìn)行自己網(wǎng)站和微信用戶的關(guān)聯(lián),我這里是使用手機(jī)號,用戶輸入手機(jī)號,進(jìn)行判斷,如果注冊過就直接關(guān)聯(lián),如果用戶沒有注冊則進(jìn)行注冊后關(guān)聯(lián),完成后跳轉(zhuǎn)到會員中心。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP est un langage de script open source largement utilisé dans le développement Web et la programmation c?té serveur, notamment dans le développement de WeChat. Aujourd'hui, de plus en plus d'entreprises et de développeurs commencent à utiliser PHP pour le développement de WeChat, car il est devenu un langage de développement vraiment facile à apprendre et à utiliser. Dans le développement de WeChat, le cryptage et le décryptage des messages sont une question très importante car ils impliquent la sécurité des données. Pour les messages sans méthodes de cryptage et de décryptage, les pirates peuvent facilement obtenir les données, ce qui constitue une menace pour les utilisateurs.

Dans le développement des comptes publics WeChat, la fonction de vote est souvent utilisée. La fonction de vote est un excellent moyen pour les utilisateurs de participer rapidement aux interactions, et c'est également un outil important pour organiser des événements et recueillir des opinions. Cet article vous présentera comment utiliser PHP pour implémenter la fonction de vote WeChat. Obtenez l'autorisation du compte officiel WeChat. Tout d'abord, vous devez obtenir l'autorisation du compte officiel WeChat. Sur la plateforme publique WeChat, vous devez configurer l'adresse API du compte public WeChat, le compte officiel et le token correspondant au compte public. Dans le processus de développement en langage PHP, nous devons utiliser le PH officiellement fourni par WeChat

Avec la popularité de WeChat, de plus en plus d’entreprises commencent à l’utiliser comme outil marketing. La fonction de messagerie de groupe WeChat est l'un des moyens importants permettant aux entreprises de mener du marketing WeChat. Cependant, si vous comptez uniquement sur l’envoi manuel, il s’agit d’une tache extrêmement longue et laborieuse pour les spécialistes du marketing. Il est donc particulièrement important de développer un outil de messagerie de masse WeChat. Cet article présentera comment utiliser PHP pour développer des outils d'envoi de masse WeChat. 1. Travail de préparation Pour développer les outils d'envoi de masse WeChat, nous devons ma?triser les points techniques suivants : Connaissance de base du développement de la plateforme publique PHP WeChat Outils de développement : Sub

WeChat est actuellement l'une des plateformes sociales comptant la plus grande base d'utilisateurs au monde. Avec la popularité de l'Internet mobile, de plus en plus d'entreprises commencent à prendre conscience de l'importance du marketing WeChat. Lors du marketing WeChat, le service client est un élément crucial. Afin de mieux gérer la fenêtre de discussion du service client, nous pouvons utiliser le langage PHP pour le développement de WeChat. 1. Introduction au développement PHP WeChat PHP est un langage de script open source c?té serveur largement utilisé dans le domaine du développement Web. En combinaison avec l'interface de développement fournie par la plateforme publique WeChat, nous pouvons utiliser le langage PHP pour mener WeChat

Dans le développement des comptes publics WeChat, la gestion des balises utilisateur est une fonction très importante, qui permet aux développeurs de mieux comprendre et gérer leurs utilisateurs. Cet article explique comment utiliser PHP pour implémenter la fonction de gestion des balises utilisateur WeChat. 1. Obtenez l'openid de l'utilisateur WeChat Avant d'utiliser la fonction de gestion des balises utilisateur WeChat, nous devons d'abord obtenir l'openid de l'utilisateur. Dans le développement des comptes publics WeChat, il est courant d'obtenir l'openid via l'autorisation de l'utilisateur. Une fois l'autorisation de l'utilisateur terminée, nous pouvons obtenir l'utilisateur via le code suivant

Alors que WeChat devient un outil de communication de plus en plus important dans la vie des gens, sa fonction de messagerie agile est rapidement privilégiée par un grand nombre d'entreprises et de particuliers. Pour les entreprises, développer WeChat en une plate-forme marketing est devenu une tendance, et l'importance du développement de WeChat est progressivement devenue plus importante. Parmi eux, la fonction d'envoi de groupe est encore plus largement utilisée. Alors, en tant que programmeur PHP, comment implémenter des enregistrements d'envoi de messages de groupe ? Ce qui suit vous donnera une brève introduction. 1. Comprendre les connaissances en développement liées aux comptes publics WeChat. Avant de comprendre comment mettre en ?uvre des enregistrements d'envoi de messages de groupe, je

Comment utiliser PHP pour développer des comptes publics WeChat Les comptes publics WeChat sont devenus un canal important de promotion et d'interaction pour de nombreuses entreprises, et PHP, en tant que langage Web couramment utilisé, peut également être utilisé pour développer des comptes publics WeChat. Cet article présentera les étapes spécifiques pour utiliser PHP pour développer des comptes publics WeChat. étape 1 : Obtenez le compte développeur du compte officiel WeChat. Avant de commencer le développement du compte officiel WeChat, vous devez demander un compte développeur du compte officiel WeChat. Pour le processus d'inscription spécifique, veuillez vous référer au site officiel de la plateforme publique WeChat

Développement d'API PHP Amazon?: comment obtenir des informations utilisateur et des autorisations de compte Introduction Amazon fournit un riche ensemble d'API qui permettent aux développeurs d'interagir facilement avec la plate-forme Amazon. Parmi elles, l’obtention d’informations sur les utilisateurs et d’autorisations de compte est l’une des fonctions couramment utilisées en développement. Cet article explique comment utiliser PHP pour développer l'API Amazon afin d'obtenir des informations sur les utilisateurs et les autorisations de compte. étape 1?: Créer un compte de développeur Amazon Avant de commencer, vous devez créer un compte de développeur Amazon. Visitez le Centre de développement Amazon (https?:
