日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

微信小程序獲取手機號,后端JAVA解密流程代碼

瀏覽:210日期:2022-05-26 11:52:55

小程序獲取手機號,后端JAVA解密流程代碼

微信官方文檔獲取手機號流程地址,先看下最好方便理解下面步驟實現思路,步驟如下

1.前端需先調用官方wx.login接口獲取登錄憑證code。2.后端接收code 調用官方接口地址獲取用戶秘鑰 sessionKey。3.前端通過官方getPhoneNumber獲取encryptedData,iv4.前端通過參數**【encryptedData】 、【iv】 、【sessionKey】** 發送請求后端接口,解密用戶手機號

小程序獲取sessionkey詳細接口文檔

后端工作如下,

1.參數code 解密出sessionKey {“session_key”:“eF9PAi5P7ZbSaQqkGzEY5g==”,“openid”:“otJ1I4zMSFGDtk7C33O_h6U3IRK8”} 2.參數sessionKey,iv,encryptedData 解密出手機號

代碼如下:

下面工具類很全,放心代碼必須全,良心教程。

業務代碼Controller

package com.df.detection.controller;import com.df.detection.base.entity.ResultBean;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiImplicitParams;import org.apache.commons.codec.binary.Base64;import org.json.JSONException;import org.springframework.web.bind.annotation.*;import java.io.UnsupportedEncodingException;import java.security.InvalidAlgorithmParameterException;import org.json.JSONObject;/** * @Author Songzhongjin * @Date 2020/7/15 10:09 * @Version 1.0 */@Api(value = '小程序登錄授權 Controller',tags = {'小程序登錄授權接口'})@RestController@RequestMapping('/app')public class APPController { /** * 微信小程序登錄獲取 * 獲取session_key * @param * @return */ @ResponseBody @PostMapping('/initWxLogin') @ApiImplicitParams({ @ApiImplicitParam(name = 'js_code', value = '登錄時獲取的code',paramType = 'form', dataType = 'string', required = true) }) public ResultBeaninitWxLogin(@RequestParam(value = 'js_code', required = true) String js_code) throws JSONException { //測試數據code// js_code = '081ZQ3f91fr9VM1HYdb91y93f91ZQ3fU'; //微信獲取session_key接口地址 String wxLoginUrl = 'https://api.weixin.qq.com/sns/jscode2session'; //接口參數 String param = 'appid=小程序id&secret=小程序secret&js_code=' + js_code + '&grant_type=authorization_code'; //調用獲取session_key接口 請求方式get String jsonString = GetPostUntil.sendGet(wxLoginUrl, param); System.out.println(jsonString); //因為json字符串是大括號包圍,所以用JSONObject解析 JSONObject json = new JSONObject(jsonString); //json解析session_key值 String session_key = json.getString('session_key'); System.out.println('session_key:' + session_key); //返回給前端 return ResultBean.success('session_key',session_key); } /** * 解密小程序用戶敏感數據 * * @param encryptedData 明文 * @param iv 加密算法的初始向量 * @param sessionKey 用戶秘鑰 * @return */ @ResponseBody @PostMapping(value = '/decodeUserInfo') @ApiImplicitParams({ @ApiImplicitParam(name = 'encryptedData', value = '包括敏感數據在內的完整用戶信息的加密數據',paramType = 'form', dataType = 'string', required = true), @ApiImplicitParam(name = 'iv', value = '加密算法的初始向量',paramType = 'form', dataType = 'string', required = true), @ApiImplicitParam(name = 'sessionKey', value = '用戶秘鑰',paramType = 'form', dataType = 'string', required = true) }) public ResultBean decodeUserInfo(@RequestParam(required = true, value = 'encryptedData') String encryptedData, @RequestParam(required = true, value = 'iv') String iv, @RequestParam(required = true, value = 'sessionKey') String sessionKey ) throws UnsupportedEncodingException, InvalidAlgorithmParameterException, JSONException { //AESUtils微信獲取手機號解密工具類 AESUtils aes = new AESUtils(); //調用AESUtils工具類decrypt方法解密獲取json串 byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv)); //判斷返回參數是否為空 if (null != resultByte && resultByte.length > 0) { String jsons = new String(resultByte, 'UTF-8'); System.out.println(jsons); JSONObject json = new JSONObject(jsons); //json解析phoneNumber值 String phoneNumber = json.getString('phoneNumber'); System.out.println('phoneNumber:' + phoneNumber); return ResultBean.success('手機號', phoneNumber); } return ResultBean.error(500,'session_key:失敗'); }}

工具類代碼如下

package com.df.detection.controller;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;import java.util.List;import java.util.Map;/** * @Author Songzhongjin * @Date 2020/7/15 10:37 * @Version 1.0 */public class GetPostUntil { /** * 向指定URL發送GET方法的請求 * * @param url * 發送請求的URL * @param param * 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return URL 所代表遠程資源的響應結果 */ public static String sendGet(String url, String param) { String result = ''; BufferedReader in = null; try {String urlNameString = url + '?' + param;URL realUrl = new URL(urlNameString);// 打開和URL之間的連接URLConnection connection = realUrl.openConnection();// 設置通用的請求屬性connection.setRequestProperty('accept', '*/*');connection.setRequestProperty('connection', 'Keep-Alive');connection.setRequestProperty('user-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)');// 建立實際的連接connection.connect();// 獲取所有響應頭字段Map<String, List<String>> map = connection.getHeaderFields();// 遍歷所有的響應頭字段for (String key : map.keySet()) { System.out.println(key + '--->' + map.get(key));}// 定義 BufferedReader輸入流來讀取URL的響應in = new BufferedReader(new InputStreamReader( connection.getInputStream()));String line;while ((line = in.readLine()) != null) { result += line;} } catch (Exception e) {System.out.println('發送GET請求出現異常!' + e);e.printStackTrace(); } // 使用finally塊來關閉輸入流 finally {try { if (in != null) { in.close(); }} catch (Exception e2) { e2.printStackTrace();} } return result; } /** * 向指定 URL 發送POST方法的請求 * * @param url * 發送請求的 URL * @param param * 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return 所代表遠程資源的響應結果 */ public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ''; try {URL realUrl = new URL(url);// 打開和URL之間的連接URLConnection conn = realUrl.openConnection();// 設置通用的請求屬性conn.setRequestProperty('accept', '*/*');conn.setRequestProperty('connection', 'Keep-Alive');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()));String line;while ((line = in.readLine()) != null) { result += line;} } catch (Exception e) {System.out.println('發送 POST 請求出現異常!'+e);e.printStackTrace(); } //使用finally塊來關閉輸出流、輸入流 finally{try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); }}catch(IOException ex){ ex.printStackTrace();} } return result; } }

AESUtils工具類 解密手機號

package com.df.detection.controller;import org.apache.tomcat.util.codec.binary.Base64;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import javax.xml.transform.Result;import java.security.*;/** * @Author Songzhongjin * @Date 2020/7/15 11:46 * @Version 1.0 */public class AESUtils { public static boolean initialized = false; /** * AES解密 * @param content 密文 * @return * @throws InvalidAlgorithmParameterException * @throws NoSuchProviderException */ public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException { initialize(); try { Cipher cipher = Cipher.getInstance('AES/CBC/PKCS7Padding'); Key sKeySpec = new SecretKeySpec(keyByte, 'AES'); cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化 byte[] result = cipher.doFinal(content); return result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static void initialize(){ if (initialized) { return; } Security.addProvider(new BouncyCastleProvider()); initialized = true; } //生成iv public static AlgorithmParameters generateIV(byte[] iv) throws Exception { AlgorithmParameters params = AlgorithmParameters.getInstance('AES'); params.init(new IvParameterSpec(iv)); return params; }}

接口返回對象ResultBean定義工具類 防止有些朋友發現沒有這個類

package com.df.detection.base.entity;import io.swagger.annotations.ApiModelProperty;/** * @author Liu Yaoguang * @Classname aaa * @Description * @Date 2019/12/06 09:22 */public class ResultBean<T> { @ApiModelProperty(value = '返回碼',dataType = 'int') private int code; @ApiModelProperty(value = '返回描述信息',dataType = 'string') private String message; @ApiModelProperty(value = '返回數據') private T data; @ApiModelProperty(value = '口令',dataType = 'string') private String token; private ResultBean() { } public static ResultBean error(int code, String message) { ResultBean resultBean = new ResultBean(); resultBean.setCode(code); resultBean.setMessage(message); return resultBean; } public static<T> ResultBean error(int code, String message,T data) { ResultBean resultBean = new ResultBean(); resultBean.setCode(code); resultBean.setMessage(message); resultBean.setData(data); return resultBean; } public static ResultBean success(String message) { ResultBean resultBean = new ResultBean(); resultBean.setCode(200); resultBean.setMessage(message); return resultBean; } public static<T> ResultBean success(String message,T data) { ResultBean resultBean = new ResultBean(); resultBean.setCode(200); resultBean.setMessage(message); resultBean.setData(data); return resultBean; } public static ResultBean success(String message,Object data,String token) { ResultBean resultBean = new ResultBean(); resultBean.setCode(200); resultBean.setMessage(message); resultBean.setData(data); resultBean.setToken(token); return resultBean; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } public String getToken() { return token; } public void setToken(String token) { this.token = token; }}

以上就是微信小程序獲取手機號,后端JAVA解密流程代碼的詳細內容,更多關于微信小程序獲取手機號的資料請關注好吧啦網其它相關文章!

標簽: 微信
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲制服欧美另类| 国产精品magnet| 欧美日韩精品一区二区视频| 精品国产亚洲日本| 国产精品xx| 欧美午夜精品一区二区三区电影| 欧美日韩尤物久久| 亚洲精品1区2区| 中文字幕亚洲精品乱码| 日本久久二区| 精品国产亚洲日本| 久久精品青草| 一区二区精品| 美女在线视频一区| 欧美日韩尤物久久| 免费一级片91| 久久av免费| 欧美一区二区三区高清视频 | 日韩三区四区| 国产视频网站一区二区三区| 麻豆精品在线播放| 精品一区三区| 日韩动漫一区| 欧美日韩视频免费观看| 丝袜美腿高跟呻吟高潮一区| 国产精品一级| 欧美亚洲在线日韩| 91福利精品在线观看| 欧美激情另类| 男女男精品网站| 免费在线亚洲欧美| 国产一区久久| 91伊人久久| 快播电影网址老女人久久| 视频一区在线视频| 精品亚洲精品| 免费看黄色91| 色乱码一区二区三区网站| 欧美日韩国产综合网| 国产色噜噜噜91在线精品| 久久精品一区二区不卡| 日韩激情啪啪| 久久久天天操| 国产精品乱战久久久| 久久国产电影| 日韩三级精品| 日韩中文视频| 日本免费一区二区视频| 四虎884aa成人精品最新| 深夜福利亚洲| 999久久久国产精品| 国产探花一区| 午夜宅男久久久| 福利精品在线| 日韩精品欧美成人高清一区二区| 亚洲一级少妇| 欧美精品中文字幕亚洲专区| 国产综合色产| 国产精品激情电影| 香蕉视频成人在线观看| 精品精品99| 日韩中文字幕一区二区高清99| 日韩免费av| 国产一级成人av| 欧美日韩视频| 麻豆视频在线看| 日韩国产成人精品| 最新日韩av| 久久久男人天堂| 国产精品手机在线播放| 热久久免费视频| 国产在线不卡一区二区三区| 久久久久蜜桃| 国产日韩免费| 亚洲国产日韩欧美在线| 日本一不卡视频| 群体交乱之放荡娇妻一区二区| 亚洲精品视频一二三区| 成人片免费看| 久久狠狠久久| 久久久五月天| 国产欧美日韩综合一区在线播放| 99久久亚洲精品| 国产精品视频一区二区三区四蜜臂| 亚洲免费观看高清完整版在线观| 91欧美日韩在线| 中文字幕成人| 伊人成人网在线看| а√天堂8资源在线| 麻豆国产欧美一区二区三区 | 精品资源在线| 国产精品一区二区精品| 婷婷视频一区二区三区| 在线综合亚洲| 女人天堂亚洲aⅴ在线观看| 久久夜夜操妹子| 91综合网人人| 精品国产aⅴ| 国产精品a久久久久| 青青草国产成人99久久| 97精品资源在线观看| 日韩av午夜在线观看| 日韩中文av| 视频一区二区中文字幕| 久久xxxx精品视频| 好看不卡的中文字幕| 天堂资源在线亚洲| 久久激情婷婷| 国产夫妻在线| 日韩电影免费网站| 中国字幕a在线看韩国电影| 麻豆精品av| 久久中文字幕一区二区| 精品免费视频| 国产在线观看www| 92国产精品| 99久精品视频在线观看视频| 日韩高清中文字幕一区二区| 97国产成人高清在线观看| 国产66精品| 亚洲黄色网址| 久久国产直播| 夜久久久久久| 亚洲婷婷丁香| 国产日韩欧美一区| 欧美激情综合| av中文字幕在线观看第一页| 最新中文字幕在线播放| 视频福利一区| av不卡在线| 日本成人一区二区| 欧美激情麻豆| 欧美国产美女| 日韩精品一区二区三区免费观看| 国产综合婷婷| 亚洲欧美日本国产| 欧美黄页在线免费观看| 国产成人精品一区二区免费看京| 国产乱码午夜在线视频| 欧美美女一区| 蜜臀a∨国产成人精品| 日韩综合一区二区| 久久久久亚洲精品中文字幕| 亚洲综合电影| 欧美特黄a级高清免费大片a级| 免费看黄色91| 欧美国产另类| 久久精品国产68国产精品亚洲| 久久网站免费观看| 日韩中文字幕亚洲一区二区va在线| 亚洲欧美成人综合| 91国内精品| 日韩欧美另类一区二区| 免费不卡在线观看| 欧美国产另类| 美女网站一区| 日韩精品a在线观看91| 国产一区二区三区日韩精品| 久久婷婷久久| 日韩三级久久| 亚洲伊人av| 一区二区精彩视频| 高清日韩中文字幕| 国产亚洲在线| 国产欧美一区二区三区精品观看| 三上悠亚国产精品一区二区三区| 蜜臀精品一区二区三区在线观看 | 99久久精品费精品国产| 日本中文字幕视频一区| 国产资源在线观看入口av| 在线观看亚洲精品福利片| 国产精品99久久久久久董美香| 999国产精品| 国产精品亚洲人成在99www | 欧美视频精品全部免费观看| 鲁鲁在线中文| 免费在线成人网| 成人福利视频| 老鸭窝毛片一区二区三区| 免费精品一区| 欧美网站在线| 热久久久久久| 日韩精品欧美激情一区二区| 最新国产精品久久久| 国产精品亚洲四区在线观看 | 久久精品资源| 欧美特黄一级| 国产精品一区二区av日韩在线| 一区在线免费观看| 国产九九精品| 丝袜av一区| 欧美有码在线| 久久性天堂网| 国产精品99在线观看| 亚洲欧美日韩一区在线观看| 久久超碰99| 极品日韩av| 免费日韩成人| 99国产精品视频免费观看一公开| 91福利精品在线观看|