WeChat ミニ プログラムでのユーザー データ復号化の概要

不言
リリース: 2018-06-26 15:57:11
オリジナル
1841 人が閲覧しました

この記事は主にWeChatミニプログラムのユーザーデータ復号化の詳細な導入に関する関連情報を紹介します。必要な友人は

WeChatミニプログラムのユーザーデータ復号化

公式ガイドマップ:

ガイドを参照してください。マップのステップバイステップ操作

1. コードを取得します

onLoad: function (options) { // 页面初始化 options为页面跳转所带来的参数 let that = this wx.login({ success: function (res) { // success let code = res.code that.setData({ code: code }) wx.getUserInfo({ success: function (res) { // success that.setData({ userInfo: res.userInfo }) that.setData({ iv: res.iv }) that.setData({ encryptedData: res.encryptedData }) that.get3rdSession() } }) } }) }
ログイン後にコピー

2. コードをサードパーティサーバーに送信し、3rd_session を取得します

3.サードパーティサーバー上の WeChat サーバーへのコード session_key と openid の交換

ここでは JFinal によって構築されたサーバーが使用されます

Redis 設定

get3rdSession:function(){ let that = this wx.request({ url: 'https://localhost:8443/get3rdSession', data: { code: this.data.code }, method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT // header: {}, // 设置请求的 header success: function (res) { // success var sessionId = res.data.session; that.setData({ sessionId: sessionId }) wx.setStorageSync('sessionId', sessionId) that.decodeUserInfo() } }) }
ログイン後にコピー

サードパーティセッションを取得

public void configPlugin(Plugins me) { //用于缓存userinfo模块的redis服务 RedisPlugin userInfoRedis = new RedisPlugin("userInfo","localhost"); me.add(userInfoRedis); }
ログイン後にコピー

ExecLinuxCMDUtil.Java

public void get3rdSession() { //获取名为userInfo的Redis Cache对象 Cache userInfoCache = Redis.use("userInfo"); String sessionId = ""; JSONObject json = new JSONObject(); String code = getPara("code"); String url = "https://api.weixin.qq.com/sns/jscode2session?appid=wx7560b8008e2c445d&secret=f1af3312b7038513fd17dd9cbc3b357c&js_code=" + code + "&grant_type=authorization_code"; //执行命令生成3rd_session String session = ExecLinuxCMDUtil.instance.exec("cat /dev/urandom |od -x | tr -d ' '| head -n 1").toString(); json.put("session", session); //创建默认的httpClient实例 CloseableHttpClient httpClient = getHttpClient(); try { //用get方法发送http请求 HttpGet get = new HttpGet(url); System.out.println("执行get请求:...." + get.getURI()); CloseableHttpResponse httpResponse = null; //发送get请求 httpResponse = httpClient.execute(get); try { //response实体 HttpEntity entity = httpResponse.getEntity(); if (null != entity) { String result = EntityUtils.toString(entity); System.out.println(result); JSONObject resultJson = JSONObject.fromObject(result); String session_key = resultJson.getString("session_key"); String openid = resultJson.getString("openid"); //session存储 userInfoCache.set(session,session_key+","+openid); } } finally { httpResponse.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { closeHttpClient(httpClient); } catch (IOException e) { e.printStackTrace(); } } renderJson(json); } private CloseableHttpClient getHttpClient() { return HttpClients.createDefault(); } private void closeHttpClient(CloseableHttpClient client) throws IOException { if (client != null) { client.close(); } }
ログイン後にコピー

4. ユーザーデータを復号化します

import java.io.InputStreamReader; import java.io.LineNumberReader; /** * java在linux环境下执行linux命令,然后返回命令返回值。 * Created by LJaer on 16/12/22. */ public class ExecLinuxCMDUtil { public static final ExecLinuxCMDUtil instance = new ExecLinuxCMDUtil(); public static Object exec(String cmd) { try { String[] cmdA = { "/bin/sh", "-c", cmd }; Process process = Runtime.getRuntime().exec(cmdA); LineNumberReader br = new LineNumberReader(new InputStreamReader( process.getInputStream())); StringBuffer sb = new StringBuffer(); String line; while ((line = br.readLine()) != null) { System.out.println(line); sb.append(line).append("\n"); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } }
ログイン後にコピー

コンソール出力結果:

バックエンド復号コード

decodeUserInfo:function(){ let that = this wx.request({ url: 'https://localhost:8443/decodeUserInfo', data: { encryptedData: that.data.encryptedData, iv: that.data.iv, session: wx.getStorageSync('sessionId') }, method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT // header: {}, // 设置请求的 header success: function (res) { // success console.log(res) } }) }
ログイン後にコピー

AESUtil.java

/** * 解密用户敏感数据 */ public void decodeUserInfo(){ String encryptedData = getPara("encryptedData"); String iv = getPara("iv"); String session = getPara("session"); //从缓存中获取session_key //获取名称为userInfo的Redis Cache对象 Cache userInfoRedis = Redis.use("userInfo"); Object wxSessionObj = userInfoRedis.get(session); if(null==wxSessionObj){ renderNull(); } String wxSessionStr = (String)wxSessionObj; String session_key = wxSessionStr.split(",")[0]; try { byte[] resultByte = AESUtil.instance.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(session_key), Base64.decodeBase64(iv)); if(null != resultByte && resultByte.length > 0){ String userInfo = new String(resultByte, "UTF-8"); System.out.println(userInfo); JSONObject json = JSONObject.fromObject(userInfo); //将字符串{“id”:1} renderJson(json); } } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }
ログイン後にコピー

上記はこの記事の全内容です。お役に立てば幸いです。皆さんも何かを学んだことがあるでしょう。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。

関連する推奨事項:

WeChatミニプログラムは、写真を保存し、モーメントで共有する機能を実現します


WeChatミニプログラム収集機能の実装について


WeChatミニプログラムがopenidを取得する方法とユーザー情報


以上がWeChat ミニ プログラムでのユーザー データ復号化の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!