亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

微信小程序調用微信登陸獲取openid及java做為服務端示例

2024-07-13 10:17:29
字體:
來源:轉載
供稿:網友

一、微信小程序
第一步:調用 wx.login獲取code 文檔地址
第二步:判斷用戶是否授權讀取用戶信息 文檔地址
第三步:調用wx.getUserInfo讀取用戶數據 文檔地址
第四步:由于小程序后臺授權域名無法授權微信的域名,所以我們只能通過我們自己的服務器去調用微信服務器去獲取用戶信息,故我們將wx.login獲取code 和 wx.getUserInfo 獲取的encryptedData與iv 通過wx.request 請求傳入后臺

微信小程序,openid,微信小程序登錄openid

服務器返回的數據:

微信小程序,openid,微信小程序登錄openid

小程序代碼:

//調用登錄接口,獲取 code wx.login({  success: function (res) {   wx.getSetting({    success(setRes) {     // 判斷是否已授權     if (!setRes.authSetting['scope.userInfo']) {      // 授權訪問      wx.authorize({       scope: 'scope.userInfo',       success() {        //獲取用戶信息        wx.getUserInfo({         lang: "zh_CN",         success: function (userRes) {          //發起網絡請求          wx.request({           url: config.loginWXUrl,           data: {            code: res.code,            encryptedData: userRes.encryptedData,            iv: userRes.iv           },           header: {            "Content-Type": "application/x-www-form-urlencoded"           },           method: 'POST',           //服務端的回掉           success: function (result) {            var data = result.data.result;            data.expireTime = nowDate + EXPIRETIME;            wx.setStorageSync("userInfo", data);            userInfo = data;           }          })         }        })       }      })     } else {      //獲取用戶信息      wx.getUserInfo({       lang: "zh_CN",       success: function (userRes) {        //發起網絡請求        wx.request({         url: config.loginWXUrl,         data: {          code: res.code,          encryptedData: userRes.encryptedData,          iv: userRes.iv         },         header: {          "Content-Type": "application/x-www-form-urlencoded"         },         method: 'POST',         success: function (result) {          var data = result.data.result;          data.expireTime = nowDate + EXPIRETIME;          wx.setStorageSync("userInfo", data);          userInfo = data;         }        })       }      })     }    }   })  } }) 

二、java服務端

根據code獲取openid與解碼用戶信息 代碼

所需要的jar包

<dependency>   <groupId>org.codehaus.xfire</groupId>   <artifactId>xfire-core</artifactId>   <version>1.2.6</version> </dependency> <dependency>   <groupId>org.bouncycastle</groupId>   <artifactId>bcprov-jdk16</artifactId>   <version>1.46</version> </dependency> 
/**  * 微信小程序信息獲取  *  * @author zhy  */ public class WXAppletUserInfo {   private static Logger log = Logger.getLogger(WXAppletUserInfo.class);      /**    * 獲取微信小程序 session_key 和 openid    *    * @author zhy    * @param code 調用微信登陸返回的Code    * @return    */   public static JSONObject getSessionKeyOropenid(String code){     //微信端登錄code值     String wxCode = code;     ResourceBundle resource = ResourceBundle.getBundle("weixin");  //讀取屬性文件     String requestUrl = resource.getString("url"); //請求地址 https://api.weixin.qq.com/sns/jscode2session     Map<String,String> requestUrlParam = new HashMap<String,String>();     requestUrlParam.put("appid", resource.getString("appId")); //開發者設置中的appId     requestUrlParam.put("secret", resource.getString("appSecret")); //開發者設置中的appSecret     requestUrlParam.put("js_code", wxCode); //小程序調用wx.login返回的code     requestUrlParam.put("grant_type", "authorization_code");  //默認參數          //發送post請求讀取調用微信 https://api.weixin.qq.com/sns/jscode2session 接口獲取openid用戶唯一標識     JSONObject jsonObject = JSON.parseObject(UrlUtil.sendPost(requestUrl, requestUrlParam));     return jsonObject;   }      /**    * 解密用戶敏感數據獲取用戶信息    *    * @author zhy    * @param sessionKey 數據進行加密簽名的密鑰    * @param encryptedData 包括敏感數據在內的完整用戶信息的加密數據    * @param iv 加密算法的初始向量    * @return    */   public static JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){     // 被加密的數據     byte[] dataByte = Base64.decode(encryptedData);     // 加密秘鑰     byte[] keyByte = Base64.decode(sessionKey);     // 偏移量     byte[] ivByte = Base64.decode(iv);     try {         // 如果密鑰不足16位,那么就補足. 這個if 中的內容很重要       int base = 16;       if (keyByte.length % base != 0) {         int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);         byte[] temp = new byte[groups * base];         Arrays.fill(temp, (byte) 0);         System.arraycopy(keyByte, 0, temp, 0, keyByte.length);         keyByte = temp;       }       // 初始化       Security.addProvider(new BouncyCastleProvider());       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");       SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");       AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");       parameters.init(new IvParameterSpec(ivByte));       cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化       byte[] resultByte = cipher.doFinal(dataByte);       if (null != resultByte && resultByte.length > 0) {         String result = new String(resultByte, "UTF-8");         return JSON.parseObject(result);       }     } catch (NoSuchAlgorithmException e) {       log.error(e.getMessage(), e);     } catch (NoSuchPaddingException e) {       log.error(e.getMessage(), e);     } catch (InvalidParameterSpecException e) {       log.error(e.getMessage(), e);     } catch (IllegalBlockSizeException e) {       log.error(e.getMessage(), e);     } catch (BadPaddingException e) {       log.error(e.getMessage(), e);     } catch (UnsupportedEncodingException e) {       log.error(e.getMessage(), e);     } catch (InvalidKeyException e) {       log.error(e.getMessage(), e);     } catch (InvalidAlgorithmParameterException e) {       log.error(e.getMessage(), e);     } catch (NoSuchProviderException e) {       log.error(e.getMessage(), e);     }     return null;   } } 

發送請求的代碼

   /** * 向指定 URL 發送POST方法的請求 * * @param url 發送請求的 URL * @param param 請求參數 * @return 所代表遠程資源的響應結果 */ ublic static String sendPost(String url, Map<String, ?> paramMap) {    PrintWriter out = null;    BufferedReader in = null;    String result = "";        String param = ""; Iterator<String> it = paramMap.keySet().iterator();  while(it.hasNext()) {   String key = it.next();   param += key + "=" + paramMap.get(key) + "&"; }     try {      URL realUrl = new URL(url);      // 打開和URL之間的連接      URLConnection conn = realUrl.openConnection();      // 設置通用的請求屬性      conn.setRequestProperty("accept", "*/*");      conn.setRequestProperty("connection", "Keep-Alive");      conn.setRequestProperty("Accept-Charset", "utf-8");      conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");      // 發送POST請求必須設置如下兩行      conn.setDoOutput(true);      conn.setDoInput(true);      // 獲取URLConnection對象對應的輸出流      out = new PrintWriter(conn.getOutputStream());      // 發送請求參數      out.print(param);      // flush輸出流的緩沖      out.flush();      // 定義BufferedReader輸入流來讀取URL的響應      in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));      String line;      while ((line = in.readLine()) != null) {        result += line;      }    } catch (Exception e) {     log.error(e.getMessage(), e);    }    //使用finally塊來關閉輸出流、輸入流    finally{      try{        if(out!=null){          out.close();        }        if(in!=null){          in.close();        }      }      catch(IOException ex){        ex.printStackTrace();      }    }    return result;  } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久超碰| 日韩免费高清在线观看| 亚洲成人精品视频| 欧美大秀在线观看| 亚洲人精品午夜在线观看| 亚洲天堂免费视频| 日韩高清电影好看的电视剧电影| 国产成人精品视频在线| 国产精品美女呻吟| 久久精品2019中文字幕| 久久精品中文字幕电影| 亚洲精品国产综合区久久久久久久| 欧美精品成人91久久久久久久| 久久精品亚洲精品| 北条麻妃一区二区在线观看| 欧美午夜丰满在线18影院| 国产成人拍精品视频午夜网站| 在线一区二区日韩| 久久久久中文字幕2018| 国产欧美欧洲在线观看| 亚洲视频电影图片偷拍一区| 成人久久久久爱| 国产精品嫩草影院一区二区| 在线成人激情黄色| 亚洲色图25p| 97在线观看免费| 欧美极品少妇xxxxⅹ免费视频| 精品国产999| 亚洲精品影视在线观看| 国产成人鲁鲁免费视频a| 久久人人97超碰精品888| 日韩理论片久久| 亚洲石原莉奈一区二区在线观看| 日韩av一区在线观看| 午夜精品久久久久久久99黑人| 欧美自拍大量在线观看| 亚洲美女自拍视频| 欧美日韩久久久久| 97超级碰碰人国产在线观看| 中文字幕日韩在线观看| 国产一区二区三区视频在线观看| 一区二区福利视频| 欧美日韩美女在线| 96pao国产成视频永久免费| 日韩av电影在线播放| 久热精品视频在线观看| 7777精品久久久久久| 国产精品福利在线观看| 亚洲日韩中文字幕在线播放| 精品国产老师黑色丝袜高跟鞋| 欧美日韩国产麻豆| 日本一欧美一欧美一亚洲视频| 成人网在线免费看| 亚洲va欧美va国产综合久久| 久久五月天色综合| 欧美最近摘花xxxx摘花| 中文字幕视频一区二区在线有码| 精品国产91久久久久久老师| 97视频色精品| 91精品国产自产在线观看永久| 精品美女久久久久久免费| 久久久国产在线视频| 伦理中文字幕亚洲| 91老司机精品视频| 亚洲女人天堂色在线7777| 久久视频免费在线播放| 久久五月天色综合| 欧美一级免费看| 亚洲国产精彩中文乱码av| 91色视频在线导航| 成人av在线亚洲| 国产91精品青草社区| www.精品av.com| 欧美专区在线播放| 国产亚洲精品综合一区91| 91精品视频在线| 色偷偷噜噜噜亚洲男人的天堂| 久久久999精品免费| 亚洲电影免费观看高清完整版| 日韩在线中文字幕| 91精品视频免费| 亚洲第一综合天堂另类专| 91久久久久久久久| 中文字幕av一区二区三区谷原希美| 黄色成人av网| 久久精品久久久久| 欧美乱妇高清无乱码| 国产午夜精品免费一区二区三区| 国产亚洲精品美女| 日韩中文字幕网站| 久久91精品国产91久久跳| 欧美日韩加勒比精品一区| 国产丝袜精品第一页| 77777亚洲午夜久久多人| 亚洲男人天堂2019| 日本a级片电影一区二区| 亚洲视频精品在线| 国产精品h在线观看| 欧美在线免费观看| 欧美一性一乱一交一视频| 国产精品69精品一区二区三区| 欧美视频免费在线| 亚洲品质视频自拍网| 日韩av电影免费观看高清| 精品久久久一区| 亚洲欧美激情在线视频| 国产亚洲欧美另类中文| 亚洲国产第一页| 日韩欧美亚洲范冰冰与中字| 国产精品欧美亚洲777777| 亚洲精品aⅴ中文字幕乱码| 欧美精品做受xxx性少妇| 日韩在线一区二区三区免费视频| 亚洲福利在线看| 欧美一区二区三区免费观看| 久热爱精品视频线路一| 亚洲bt欧美bt日本bt| 高清欧美性猛交xxxx| 欧美日韩爱爱视频| 欧美日韩国产中文精品字幕自在自线| 欧美日韩免费一区| 欧美电影在线观看完整版| 欧美视频在线观看 亚洲欧| 色777狠狠综合秋免鲁丝| 国产精品女主播| 亚洲人成亚洲人成在线观看| 亚洲色图18p| 午夜精品一区二区三区在线视| 97精品视频在线观看| 欧洲亚洲免费视频| 91色在线视频| 在线视频日本亚洲性| 欧美亚洲成人xxx| 欧美日韩精品在线视频| 久久精品视频在线观看| 精品福利免费观看| 色偷偷av亚洲男人的天堂| 久久精品99无色码中文字幕| 国产精品视频地址| 亚洲全黄一级网站| 91高清在线免费观看| 成人国产精品日本在线| 最近免费中文字幕视频2019| 国产欧美精品一区二区| 国产精品一区久久| 久久成人免费视频| 亚洲国产另类久久精品| 久久视频在线免费观看| 91精品国产91久久久久久最新| 久久久999精品视频| 欧美大片va欧美在线播放| 88国产精品欧美一区二区三区| 久久午夜a级毛片| 日韩一区二区久久久| 国产亚洲欧洲黄色| 久久久久久久久网站| 91亚洲精品视频| 久久久午夜视频| 欧美激情视频免费观看| 欧美在线视频免费播放| 国产精品视频久久| 亚洲国产一区二区三区四区| 在线观看日韩欧美| 欧洲s码亚洲m码精品一区|