1. 程式人生 > >小程式獲取個人資訊、和群資訊,後臺解密返回資訊

小程式獲取個人資訊、和群資訊,後臺解密返回資訊

場景描述:

1.微信目前是需要點選按鈕獲取許可權,然後個人資訊(頭像、暱稱)
2.獲取使用者的openId更多資訊
3.分享到群的時候,可以獲得群的openGId,然後顯示群的暱稱

注意問題:app.js中通過後臺獲取使用者更多的資訊時,因為非同步,很多時候將後臺使用者資訊通過this.setDate(),this拿不到報錯,解決方法:
1.回撥函式callback(獲取群openGid時,會用到)
2.下面的例子在,index中獲取值然後設定值

1.個人資訊獲取的程式碼:

在這裡插入圖片描述
在這裡插入圖片描述

index.wxml

<view class="container">
  <view class="userinfo">
    <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 獲取頭像暱稱 </button>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
</view>

index.wxss

.userinfo {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.userinfo-avatar {
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}

.userinfo-nickname {
  color: #aaa;
}

index.js

//index.js
//獲取應用例項
const app = getApp()

Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  onLoad: function () {
    if (app.globalData.userInfo) {
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else if (this.data.canIUse){
      // 由於 getUserInfo 是網路請求,可能會在 Page.onLoad 之後才返回
      // 所以此處加入 callback 以防止這種情況
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    } else {
      // 在沒有 open-type=getUserInfo 版本的相容處理
      wx.getUserInfo({
        success: res => {
          app.globalData.userInfo = res.userInfo
          this.setData({
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    }
  },
  getUserInfo: function(e) {
    console.log(e)
    if (e.detail.userInfo) {
      app.globalData.userInfo = e.detail.userInfo
      this.setData({
        userInfo: e.detail.userInfo,
        hasUserInfo: true
      })
      app.globalData.isRefresh = true;
      console.log("getUserInfo()==>>是否成功:" + app.globalData.isRefresh);
      //微信授權後呼叫請求後臺使用者資訊
      this.AllUserInfo();
    } else {
      wx.showModal({
        title: '授權提示',
        content: '您點選了拒絕授權,將無法正常使用本小程式的功能體驗。如想使用本小程式,請再次點選。',
        success: function (res) {
          if (res.confirm) {
            console.log('使用者點選確定')
          }
        }
      })
    }
  },
  AllUserInfo: function () {
    var that = this;
    // 獲取後臺的使用者資訊
    wx.login({
      success: function (res) {
        console.log("AllUserInfo()==>>res.code:" + res.code); //五分鐘的code,傳送 res.code 到後臺換取 openId, sessionKey, unionId
        wx.getUserInfo({
          withCredentials: true,
          success: function (res_user) {
            wx.request({
              url: 'http://xxx',//自己的後臺域名
              method: "GET",
              data: {
                code: res.code, //上面wx.login()成功獲取到的code
                encryptedData: res_user.encryptedData,
                iv: res_user.iv
              },
              header: {
                'content-type': 'application/json' //預設值
              },
              success: function (res) {
                console.log("index.js>>AllUserInfo()返回資訊");
                console.log(res);
                if (res.data.status == 1) {
                  var userInfo_ = res.data.userInfo;
                  app.globalData.userInfo = res.data.userInfo;
                  //這裡將使用者的資訊儲存在本地中,方便其他頁面呼叫
                  that.setData({
                    userInfo: userInfo_,
                  })
                  console.log('解密成功');
                } else {
                  console.log('解密失敗');
                }
              }
            })
          }
        })
      }
    })
  },
})

app.js
App({
  onLaunch: function () {
    // 展示本地儲存能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)
    // 獲取使用者資訊
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已經授權,可以直接呼叫 getUserInfo 獲取頭像暱稱,不會彈框
          wx.getUserInfo({
            success: res => {
              // 可以將 res 傳送給後臺解碼出 unionId
              this.globalData.userInfo = res.userInfo
              // 由於 getUserInfo 是網路請求,可能會在 Page.onLoad 之後才返回
              // 所以此處加入 callback 以防止這種情況
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  globalData: {
    userInfo: null
  }
})

授權之後,後臺解密資訊返回
在這裡插入圖片描述

java+ssm後臺解密:https://blog.csdn.net/abgglive/article/details/80666807
php:https://www.cnblogs.com/haifengliang/p/7998868.html

2.openGId獲取群資訊程式碼:

因為寫了篇分享的文章:這裡就不累贅了:先看分享文章:https://blog.csdn.net/qq_40670946/article/details/82843061
也可以自己去找AES解密包

新增1:
app.js中“分享成功”處插入程式碼:
//呼叫獲取群id方法
  wx.login({
     success: function(result) {
        var s = vm;
        wx.request({
          url: 'http://xxx',//自己的後臺域名
          method: "GET",
          data: {
            code: result.code,
            encryptedData: res.encryptedData,
            iv: res.iv
          },
          header: {
            'content-type': 'application/json' //預設值
          },
          success: function(res) {
            console.log("後臺介面返回資訊:");
            console.log(res);
            if (res.data.status == 1) {
              console.log('解密成功');
              if (app.openGIdCallback) {
                app.openGIdCallback(res);
              }
            } else {
              console.log('解密失敗');
            }
          }
        })
      }
    })


java後臺介面修改為:
@ResponseBody
    @RequestMapping(value = "/getOpenGid", method = RequestMethod.GET)
    public Map getOpenGid(String encryptedData, String iv, String code) {
        Map map = new HashMap();
        //登入憑證不能為空
        if (code == null || code.length() == 0) {
            map.put("status", 0);
            map.put("msg", "code 不能為空");
            return map;
        }
        //小程式唯一標識   (在微信小程式管理後臺獲取)
        String wxspAppid = "xxx";
        //小程式的 app secret (在微信小程式管理後臺獲取)
        String wxspSecret = "xxx";
        //授權(必填)
        String grant_type = "authorization_code";

        //////////////// 1、向微信伺服器 使用登入憑證 code 獲取 session_key 和 openid ////////////////
        //請求引數
        String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
        //傳送請求
        String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
        //解析相應內容(轉換成json物件)
        JSONObject json = JSONObject.fromObject(sr);
        //獲取會話金鑰(session_key)
        String session_key = json.get("session_key").toString();
        //使用者的唯一標識(openid)
        String openid = (String) json.get("openid");

        //////////////// 2、對encryptedData加密資料進行AES解密 ////////////////
        try {
            String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
            if (null != result && result.length() > 0) {
                map.put("status", 1);
                map.put("msg", "解密成功");
                JSONObject resultInfo = JSONObject.fromObject(result);
               map.put("resData",resultInfo);
                return map;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        map.put("status", 0);
        map.put("msg", "解密失敗");
        return map;
    }

注意:wxspAppid 和建立微信小程式的appid相同解密成功,如果要其他小夥伴測試解密的話,
1.需要將小夥伴新增為“體驗者”,
2.小夥伴下拉專案時建立的專案appid為你的appid即可

新增2:
app.js中setInfo方法獲得app例項(因為在wx.login下app.openGIdCallback換成this.openGIdCallback),會找不到this,導致報錯

在這裡插入圖片描述

新增3:
index.wxml中增加程式碼:

<open-data id="groupName" type="groupName" open-gid="{{openGId}}"></open-data>
新增4:
index.js中:
     1.data資料增加程式碼:
         openGId: 0, //群id
     2.onLoad方法增加:
       //分享群資訊回撥函式
	    app.openGIdCallback = res => {
	      console.log("群資訊出來了嗎?");
	      console.log(res);
	      this.setData({
	        openGId: res.data.resData.openGId,
	      });
	    }

群的暱稱資訊會顯示在open-data元件中;並不會和openGid一起返回!!

到這裡就結束了,希望對你有用,能力有限,不對的地方請小夥伴們指正!