成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:186日期: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解密流程代碼的詳細內容,更多關于微信小程序獲取手機號的資料請關注好吧啦網其它相關文章!

標簽: 微信
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人h精品动漫一区二区三区| 亚洲欧美国产三级| 国产精品久久久久影院老司| 国产成人夜色高潮福利影视| 在线免费观看视频一区| 洋洋av久久久久久久一区| 国内揄拍国内精品久久| 欧美大胆人体bbbb| 国产精品1024| 777奇米成人网| 国内不卡的二区三区中文字幕| 91福利在线导航| 日韩av在线发布| 久久久综合网| 图片区小说区区亚洲影院| 一区二区三区三区在线| 亚洲欧美电影院| 亚洲国产婷婷| 亚洲精品久久7777| 亚洲一区免费| 首页亚洲欧美制服丝腿| 色综合久久久久网| 五月天中文字幕一区二区| 免费一区视频| 日韩在线一区二区| 在线观看国产91| 久久99热狠狠色一区二区| 欧美三级日韩在线| 国产精品亚洲综合一区在线观看| 欧美一区欧美二区| 成人黄色小视频| 久久免费美女视频| 国内激情久久| 一区二区在线看| 老司机精品久久| 韩国精品久久久| 欧美电视剧在线看免费| 成人国产免费视频| 国产午夜精品久久久久久免费视| 欧美韩日精品| 一区二区三区在线免费观看| 久久性色av| 精品一区二区三区视频| 日韩视频在线你懂得| 99这里只有久久精品视频| 国产精品久久久久天堂| 亚洲少妇自拍| 麻豆国产精品777777在线| 678五月天丁香亚洲综合网| 99久久婷婷国产综合精品| 中文字幕制服丝袜成人av| 久久在线视频| 国产不卡视频在线观看| 国产亚洲婷婷免费| 一本色道久久综合亚洲精品不卡| 日韩不卡一区二区| 日韩午夜电影在线观看| 狠狠爱成人网| 亚洲成人在线网站| 欧美日本国产视频| 欧美一区二区| 午夜一区二区三区在线观看| 欧美人狂配大交3d怪物一区 | 久久精品噜噜噜成人av农村| 欧美一卡2卡3卡4卡| 欧美成人综合一区| 一区二区在线观看免费| 欧美在线不卡视频| 不卡高清视频专区| 亚洲一二三四在线观看| 5566中文字幕一区二区电影 | 亚洲精品1区2区| 男人的天堂久久精品| 欧美zozo另类异族| 一区二区高清| 国产中文字幕一区| 国产精品短视频| 欧美在线不卡一区| 色综合中文字幕国产| 亚洲自拍偷拍网站| 欧美一二三在线| 国产日韩一区| 成人中文字幕电影| 亚洲国产日韩在线一区模特| 精品噜噜噜噜久久久久久久久试看| 亚洲精品一二| 国产丶欧美丶日本不卡视频| 亚洲精品免费在线观看| 日韩一区二区三区精品视频| 99精品热视频只有精品10| 精品一区二区三区在线播放 | 久久婷婷国产综合精品青草| 亚洲中字黄色| jizz一区二区| 亚洲午夜久久久久久久久电影网 | 欧美午夜一区| 九色综合国产一区二区三区| 国产精品久久久久久久久免费樱桃 | 国内成人在线| 激情综合色播五月| 自拍偷拍欧美精品| 91精品国产综合久久精品麻豆| 亚洲电影在线| 国产不卡视频在线播放| 亚洲一区精品在线| 久久久欧美精品sm网站| 欧美日韩一区国产| 亚洲欧洲精品一区| 国产成人av一区| 亚洲大片精品永久免费| 久久婷婷综合激情| 欧美性色黄大片| 亚洲欧洲久久| 99久久久免费精品国产一区二区| 婷婷开心久久网| 国产精品久久久久久户外露出| 欧美一区二区在线免费播放| 国产精品视频福利| 欧美精选一区| 国产成人综合亚洲91猫咪| 亚洲高清免费观看| 国产精品欧美久久久久一区二区| 91精品国产综合久久久蜜臀粉嫩 | 精品视频免费在线| 国产精品夜夜夜一区二区三区尤| 欧美jizzhd精品欧美巨大免费| 国内精品伊人久久久久影院对白| 亚洲1区2区3区视频| 综合久久国产九一剧情麻豆| 久久蜜桃香蕉精品一区二区三区| 欧美福利视频导航| 一本大道久久a久久综合| 亚洲精品1234| 午夜欧美理论片| 成人国产精品免费网站| 国产麻豆精品久久一二三| 日韩国产精品久久久| 一区二区三区中文在线| 中文字幕第一区| 久久久精品中文字幕麻豆发布| 91精品国产综合久久精品app| 91久久线看在观草草青青| 亚洲免费中文| 日韩亚洲欧美精品| 亚洲国产导航| 亚洲第一黄网| 国内激情久久| 激情综合网址| 国内精品久久久久久久影视麻豆| 97久久人人超碰| 不卡免费追剧大全电视剧网站| 国产精品一二三区在线| 国产制服丝袜一区| 国产一区二区不卡在线| 免费成人你懂的| 亚洲成av人片一区二区梦乃| 亚洲综合久久久久| 一区二区三区四区在线| 中文字幕日韩一区| 国产精品无人区| 国产日韩精品久久久| 精品日产卡一卡二卡麻豆| 欧美一激情一区二区三区| 日韩无一区二区| 日韩精品在线看片z| 欧美一级黄色片| 91精品国产综合久久香蕉麻豆| 欧美日韩高清一区二区| 欧美三级乱人伦电影| 色成年激情久久综合| 色婷婷久久综合| 欧洲一区在线电影| 欧美日韩激情一区二区三区| 欧美精品九九99久久| 91精品免费在线| 欧美sm极限捆绑bd| 精品久久久久久久久久久院品网| 久久综合久久99| 久久精品一区二区三区av| 337p日本欧洲亚洲大胆精品| 久久综合色鬼综合色| 2020日本不卡一区二区视频| 久久久www成人免费无遮挡大片| 欧美经典一区二区| 国产精品免费网站在线观看| 国产精品乱码人人做人人爱| 久久精品水蜜桃av综合天堂| 久久日一线二线三线suv| 久久久久国产精品人| 国产精品污网站| 亚洲精品成人天堂一二三| 亚洲6080在线| 久久超碰97人人做人人爱| 国产精品香蕉一区二区三区| www.久久久久久久久| 永久久久久久| 亚洲精品一区二区三| 国产精品日韩久久久| 色先锋久久av资源部| 欧美日韩亚洲国产综合|