电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

標簽: 微信
主站蜘蛛池模板: 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | 湿地保护| 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 高硼硅玻璃|水位计玻璃板|光学三棱镜-邯郸奥维玻璃科技有限公司 高温高压釜(氢化反应釜)百科 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 硬齿面减速机_厂家-山东安吉富传动设备股份有限公司 | 纸箱网 -纸箱机械|设备|包装纸盒|包装印刷行业门户网站 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 济南律师,济南法律咨询,山东法律顾问-山东沃德律师事务所 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 包头市鑫枫装饰有限公司 | 泥沙分离_泥沙分离设备_泥砂分离机_洛阳隆中重工机械有限公司 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 钢结构厂房造价_钢结构厂房预算_轻钢结构厂房_山东三维钢结构公司 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 |