ホームページ > 記事 > WeChat アプレット > WeChat開発入門 (6) ユーザーデータの復号化
グループ内の何人かの友人がミニ プログラム ユーザー データの復号化プロセスについて質問しているのをよく見かけます。そのため、ミニ プログラム ユーザーの機密データの復号化に関するチュートリアルを書く予定です。
暗号化プロセスは WeChat サーバー上で完了し、復号化プロセスはミニプログラムと独自のサーバー上で完了します。つまり、次のデータがencryptDataから取得されます:
{ "openId": "OPENID", "nickName": "NICKNAME", "gender": GENDER, "city": "CITY", "province": "PROVINCE", "country": "COUNTRY", "avatarUrl": "AVATARURL", "unionId": "UNIONID", "watermark": { "appid":"APPID", "timestamp":TIMESTAMP } }
準備知識:
上記の3点は、復号プロセスを理解するために非常に重要です。
公式ドキュメントに従って、一般的な復号プロセスを次のように整理しました:
アプレットクライアントは wx.login を呼び出し、コールバックには js_code が含まれます。
次に、js_code をサーバー A (開発者サーバー) に送信します。サーバー A は、ユーザーの openid と session_key (セッション キー) と引き換えに、js_code、appId、secretkey、およびgrant_type パラメーターを使用して WeChat サーバーへのリクエストを開始します。
サーバー A が session_key を取得した後、3rdSessionId をキーとして、session_key + openid を値として使用して 3rd_session と呼ばれる乱数を生成しますredis または memcached にキャッシュ します。直接推奨 session_key はネットワーク経由で送信され、開発者は session_key に関連付ける一意のキーを生成します。その機能は次のとおりです:
AES 復号化の 3 つのパラメーター:
デコード です。
var that = this;wx.login({success: function (res) { //微信js_code that.setData({wxcode: res.code}); //获取用户信息 wx.getUserInfo({ success: function (res) { //获取用户敏感数据密文和偏移向量 that.setData({encryptedData: res.encryptedData}) that.setData({iv: res.iv}) } })}})2. コードを使用して 3rdSessionId を交換します
var httpclient = require('../../utils/httpclient.js') VAR that = this//httpclient.req(url, data, method, success, fail)httpclient.req( 'http://localhost:8090/wxappservice/api/v1/wx/getSession', { apiName: 'WX_CODE', code: this.data.wxcode }, 'GET', function(result){ var thirdSessionId = result.data.data.sessionId; that.setData({thirdSessionId: thirdSessionId}) //将thirdSessionId放入小程序缓存 wx.setStorageSync('thirdSessionId', thirdSessionId) }, function(result){ console.log(result) });3.
//httpclient.req(url, data, method, success, fail)httpclient.req('http://localhost:8090/wxappservice/api/v1/wx/decodeUserInfo', { apiName: 'WX_DECODE_USERINFO', encryptedData: this.data.encryptedData, iv: this.data.iv, sessionId: wx.getStorageSync('thirdSessionId') }, 'GET', function(result){ //解密后的数据 console.log(result.data) }, function(result){ console.log(result) });4. サーバー側の復号化実装 (java)
/** * 解密用户敏感数据 * @param encryptedData 明文 * @param iv 加密算法的初始向量 * @param sessionId 会话ID * @return */@Api(name = ApiConstant.WX_DECODE_USERINFO)@RequestMapping(value = "/api/v1/wx/decodeUserInfo", method = RequestMethod.GET, produces = "application/json")public Map<String,Object> decodeUserInfo(@RequestParam(required = true,value = "encryptedData")String encryptedData, @RequestParam(required = true,value = "iv")String iv, @RequestParam(required = true,value = "sessionId")String sessionId){ //从缓存中获取session_key Object wxSessionObj = redisUtil.get(sessionId); if(null == wxSessionObj){ return rtnParam(40008, null); } String wxSessionStr = (String)wxSessionObj; String sessionKey = wxSessionStr.split("#")[0]; try { AES aes = new AES(); byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv)); if(null != resultByte && resultByte.length > 0){ String userInfo = new String(resultByte, "UTF-8"); return rtnParam(0, userInfo); } } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return rtnParam(50021, null); }5. AES 復号化コア コード
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(); }最終的な効果は次のとおりです:
ミニ プログラムは WeChat Open Platform プラットフォーム接続にバインドされています
safeopenid; openid は appid 内でのみ使用可能です。 appid も漏洩していない限り。
その後、復号化されたデータから appid を取得できます。WeChat ミニ プログラム チームの目的は何ですか?前に述べたように、openid と appid は、ミニ プログラム開発者が異なるミニ プログラム アプリケーション間でユーザーを区別して分離するのを容易にするために一緒に使用され、同時に WeChat ユーザー システムと 3 つ目のユーザー システムを組み合わせることができます。 -パーティービジネスシステム。 したがって、機密データの復号化の主な用途は、それを復号化してクライアントに送り返すことではなく、WeChat のユーザー情報をサーバー側で独自のビジネスに統合することだと思います。 【関連推奨事項】1.WeChatパブリックアカウントプラットフォームのソースコードダウンロード
2. 3.WeChat Lala Takeaway 2.2.4の復号化されたオープンソースバージョンWeChatルービックキューブのソースコード
以上がWeChat開発入門 (6) ユーザーデータの復号化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。