1. 程式人生 > >微信小程式之登入,模板訊息,服務通知

微信小程式之登入,模板訊息,服務通知

1.登入流程圖
 1).前端呼叫wx.login()獲取code
 2).前端呼叫wx.request()傳送code給後端

 3).後端根據appid(後臺取得)+appsecret(後臺取得)+code(前端傳送)傳送到微信介面,得到session_key+openid等

介面地址:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

 4).後端接收openid(使用者唯一標識,私密)與session_key
(會話金鑰)後,生成自己自定義的使用者登入標識:my_session_key,並儲存到Mongo中    在後面的使用者檢驗中,均使用my_session_key進行驗證

2.獲取使用者資訊流程:
    前端呼叫wx.getUserInfo
流程:先申請許可權,再獲取資訊,所以開始要進行是否擁有許可權的判斷
    
 // 登入
    wx.login({
      success: res => {
        // 傳送 res.code 到後臺換取 openId, sessionKey, unionId
      }
    })
    // wx.openSetting({
      
    // })
    // 獲取使用者資訊
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已經授權,可以直接呼叫 getUserInfo 獲取頭像暱稱,不會彈框
          wx.getUserInfo({
            success: res => { //console.log(112233);
              // 可以將 res 傳送給後臺解碼出 unionId
              this.globalData.userInfo = res.userInfo


              // 由於 getUserInfo 是網路請求,可能會在 Page.onLoad 之後才返回
              // 所以此處加入 callback 以防止這種情況
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }else{
          wx.authorize({
            scope: 'scope.userInfo',
            success: res => {
              console.log(111111);
              wx.getUserInfo({
                success: res => {
                  // 可以將 res 傳送給後臺解碼出 unionId
                  this.globalData.userInfo = res.userInfo


                  // 由於 getUserInfo 是網路請求,可能會在 Page.onLoad 之後才返回
                  // 所以此處加入 callback 以防止這種情況
                  if (this.userInfoReadyCallback) {
                    this.userInfoReadyCallback(res)
                  }
                }
              })
            },
            fail:function(res){
              console.log(222);
            }
          })
        }
      }
    })


3. 身份校驗

提供my_session_key,rawData,signature,callback 後端進行校驗

後端校驗:
1).my_session_key,rawData,signature全部非空

2).根絕my_session_key,從Mongo中查詢是否存在,存在則使用者已登入,傳送success狀態碼,失敗則使用者未登入或登入過期,傳送fault狀態碼

4. 提醒我
1).使用者點選按鈕,觸發前端呼叫後端getwake介面,提供my_session_key,formid(表單id),id(商品id),callback
2).後端進行處理後返回給前端處理結果
根據my_session_key 獲取mongo,增加detail_id,form_id後,將資料寫入資料庫.並將是否成功的結果返回給前端

3).計劃任務定時輪詢,將符合要求的提醒事件傳送服務通知.(伺服器定時任務)

5.  服務通知
1).前端請求介面,引數為refresh,callback(可空)
2).後端處理請求
得到access_token
設定請求url
得到資料庫中,尚未提醒過的事件的資訊,
提醒規則: 根據商品id獲得商品資訊,判斷商品秒殺開始時間與現在的時間差是否小於3分鐘,若是,則提醒,不是則跳過
得到符合提醒規則的事件,根據取得的商品資訊填寫模板資訊,封裝成引數進行post請求
根據響應引數判斷是否成功提醒,成功後更新資料庫資訊