当前位置:   article > 正文

微信小程序后台获取openid (解密encryptedData)_openidcipher

openidcipher

微信前台调用后台,传CODE 还有加密的文本

 其中unionid 这个是需要在平台绑定的, 一个公司的小程序员,公众号等都 是同一个unionid 需要先绑定

            1.需要微信前端调用wx.login接口获取code。 然后再调用wx.getuserInfo接口获取用户的信息。           
            2. 前端调用服务器接口,将获取到的code,以及encryptedData,和iv一起发送到后端。      
            3. 服务器在解密encryptedData之前,需要调用微信接口获取sessionkey. 有了encryptedData才能解密。

  1. wx.login({
  2. success: function (res_login) {
  3. if (res_login.code){
  4. wx.getUserInfo({
  5. success:function(res){
  6. console.log(res)
  7. var jsonData = {
  8. code: res_login.code,
  9. encryptedData: res.encryptedData,
  10. iv: res.iv
  11. };
  12. wx.request({
  13. url: 'http://com.testwechat.comlogin/userinfo',
  14. header: { 'Content-Type': 'application/json' },
  15. method:'POST',
  16. data: jsonData,
  17. success: res => {
  18. console.log(res.data)
  19. wx.hideLoading()
  20. this.setData({
  21. projectlist: res.data.content
  22. })
  23. }
  24. })
  25. }
  26. })
  27. }
  28. }
  29. })

前台参数至少包含这三个参数

  1. JSONObject dataObj = JSONObject.parseObject(infoData);
  2. String code = (String) dataObj.get("code");
  3. String encryptedData = (String) dataObj.get("encryptedData");
  4. String iv = (String) dataObj.get("iv");
  1. private static final String APP_SECRET=""; //写上自己的的
  2. private static final String APP_ID = ""; //写上自己的的APPID
  3. public JSONObject getSessionKey(String code) {
  4. String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + APP_ID + "&secret="
  5. + APP_SECRET + "&js_code=" + code + "&grant_type=authorization_code";
  6. String reusult = GET(url);
  7. JSONObject oppidObj = JSONObject.parseObject(reusult);
  8. String openid = (String) oppidObj.get("openid");
  9. String session_key = (String) oppidObj.get("session_key");
  10. oppidObj.put("openid", openid);
  11. oppidObj.put("session_key", session_key);
  12. if (oppidObj.containsKey("unionid")) {
  13. oppidObj.put("unionid", (String) oppidObj.get("unionid"));
  14. }else{
  15. oppidObj.put("unionid", "");
  16. }
  17. return oppidObj;
  18. }

解密用户传过来的信息

  1. /**
  2. * 获取信息
  3. */
  4. public JSONObject getUserInfo(String encryptedData,String sessionkey,String iv){
  5. // 被加密的数据
  6. byte[] dataByte = Base64.decode(encryptedData);
  7. // 加密秘钥
  8. byte[] keyByte = Base64.decode(sessionkey);
  9. // 偏移量
  10. byte[] ivByte = Base64.decode(iv);
  11. try {
  12. // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
  13. int base = 16;
  14. if (keyByte.length % base != 0) {
  15. int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
  16. byte[] temp = new byte[groups * base];
  17. Arrays.fill(temp, (byte) 0);
  18. System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
  19. keyByte = temp;
  20. }
  21. // 初始化
  22. Security.addProvider(new BouncyCastleProvider());
  23. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
  24. SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
  25. AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
  26. parameters.init(new IvParameterSpec(ivByte));
  27. cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
  28. byte[] resultByte = cipher.doFinal(dataByte);
  29. if (null != resultByte && resultByte.length > 0) {
  30. String result = new String(resultByte, "UTF-8");
  31. return JSONObject.parseObject(result);
  32. }
  33. } catch (NoSuchAlgorithmException e) {
  34. e.printStackTrace();
  35. } catch (NoSuchPaddingException e) {
  36. e.printStackTrace();
  37. } catch (InvalidParameterSpecException e) {
  38. e.printStackTrace();
  39. } catch (IllegalBlockSizeException e) {
  40. e.printStackTrace();
  41. } catch (BadPaddingException e) {
  42. e.printStackTrace();
  43. } catch (UnsupportedEncodingException e) {
  44. e.printStackTrace();
  45. } catch (InvalidKeyException e) {
  46. e.printStackTrace();
  47. } catch (InvalidAlgorithmParameterException e) {
  48. e.printStackTrace();
  49. } catch (NoSuchProviderException e) {
  50. e.printStackTrace();
  51. }
  52. return null;
  53. }

 

下面是HPPT请求发送方式了

  1. //发起get请求的方法。
  2. public static String GET(String url) {
  3. String result = "";
  4. BufferedReader in = null;
  5. InputStream is = null;
  6. InputStreamReader isr = null;
  7. try {
  8. URL realUrl = new URL(url);
  9. URLConnection conn = realUrl.openConnection();
  10. conn.connect();
  11. Map<String, List<String>> map = conn.getHeaderFields();
  12. is = conn.getInputStream();
  13. isr = new InputStreamReader(is);
  14. in = new BufferedReader(isr);
  15. String line;
  16. while ((line = in.readLine()) != null) {
  17. result += line;
  18. }
  19. } catch (Exception e) {
  20. // 异常记录
  21. } finally {
  22. try {
  23. if (in != null) {
  24. in.close();
  25. }
  26. if (is != null) {
  27. is.close();
  28. }
  29. if (isr != null) {
  30. isr.close();
  31. }
  32. } catch (Exception e2) {
  33. // 异常记录
  34. }
  35. }
  36. return result;
  37. }

需要的解密加密数据包

  1. <!-- 注:微信小程序加密解密包 xfire-core, bcprov-jdk1-->
  2. <dependency>
  3. <groupId>org.codehaus.xfire</groupId>
  4. <artifactId>xfire-core</artifactId>
  5. <version>1.2.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.bouncycastle</groupId>
  9. <artifactId>bcprov-jdk16</artifactId>
  10. <version>1.46</version>
  11. </dependency>

这些流程配下来,基本可以走通微信接口登录,然后做自己想做的事情

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/284701
推荐阅读
相关标签
  

闽ICP备14008679号