微信小プログラムはユーザーの携帯電話番号とバックエンドの復号を取得することを許可する.

3924 ワード


ウィジェットはユーザの許可を引くときにユーザの携帯電話番号を取得し、フロントエンドが取得した後、バックエンドが解読されてデータベースに保存することができます.
1.getPhoneNumberこのコンポーネントはbuttonによって実現されます(他のラベルは無効です).buttonのopen-type=「getPhoneNumber」をバインドし、bindgetphonenumberイベントをバインドしてコールバックを取得します.

2.このコンポーネントを使用する前にloginインタフェースを呼び出す必要があります.loginを呼び出さずにbuttonをクリックすると、loginを呼び出すよう求められます.

App({  
    onLaunch: function () {  
        wx.login({  
            success: function (res) {  
                if (res.code) {  
                    //   
                    console.log(res.code)  
                } else {  
                    console.log(' !' + res.errMsg)  
                }  
            }  
        });  
    }  
})

に注意


コールバックでwxを呼び出す.loginログインすると、ログインステータスがリフレッシュされる可能性があります。このときサーバがcodeでスワップしたセッションキーは暗号化時に使用したセッションキーではなく、復号に失敗します。開発者に事前にloginを行うことを提案する。または、コールバックでcheckSessionを使用してログインステータスチェックを行い、loginがログインステータスをリフレッシュしないようにします。 


3.bindgetphonenumberバインドされたイベントによってコールバックを取得します.コールバックのパラメータは3つあり、
errMsg:ユーザーはキャンセルまたは許可された情報コールバックをクリックします.
iv:暗号化アルゴリズムの初期ベクトル(ユーザが許可に同意しない場合はundefined).
encryptedData:ユーザー情報の暗号化データ(ユーザーが許可に同意しない場合はundefinedに戻る)
getPhoneNumber(e) {
    let CONST = app.$.CONST
    let appid = CONST.APPID
    let secret = CONST.APPSECRET
    let grant_type = 'authorization_code'
    let encryptedData = e.detail.encryptedData
    let iv= e.detail.iv
    wx.login({
      success(res){
        wx.request({
          url: 'https://api.weixin.qq.com/sns/jscode2session?appid=wx8493c38c2f678a82&secret=57bfc41d2101a3a517b2bd7dec399803&js_code=' + res.code +'&grant_type=authorization_code',
          success(r) {
            let session_key = r.data.session_key
            request({
              url: “ API”,
              data:{
                id:app.$.info.id,// ID, 
                session_key,
                encryptedData,
                iv,
                appId:appid
              },
              success:res=>{

                console.log(res)
              }
            })
          }
        })
      }
    })
  },

4.バックエンド復号API(js)は、公式ドキュメントに従って
  const crypto = require('crypto')
  module.exports = async(ctx, next) => {
    let {
      iv,
      encryptedData,
      session_key,
      appId,
      id
    } = ctx.request.body
    function WXBizDataCrypt(appId, session_key) {
      this.appId = appId
      this.session_key = session_key
    }

    WXBizDataCrypt.prototype.decryptData = function(encryptedData, iv) {
      // base64 decode
      var session_key = new Buffer(this.session_key, 'base64')
      encryptedData = new Buffer(encryptedData, 'base64')
      iv = new Buffer(iv, 'base64')

      try {
        //  
        var decipher = crypto.createDecipheriv('aes-128-cbc', session_key, iv)
        //   padding   true, 
        decipher.setAutoPadding(true)
        var decoded = decipher.update(encryptedData, 'binary', 'utf8')
        decoded += decipher.final('utf8')

        decoded = JSON.parse(decoded)

      } catch (err) {
        throw new Error('Illegal Buffer')
      }

      if (decoded.watermark.appid !== this.appId) {
        throw new Error('Illegal Buffer')
      }

      return decoded
    }
    let pc = new WXBizDataCrypt(appId, session_key)
    let data = pc.decryptData(encryptedData, iv)
    return ctx.db('User')
      .update({
        phoneNum: data.phoneNumber
      }).where({
        id
      }).then(r =>{
        console.log(r)
        ctx.body = data
      })
      .catch(err=>{
        console.error(err)
      })
  }

5.ここまで戻ってきたデータはユーザーの携帯番号で、中間の業務ロジックはやはり公式ドキュメントを見に行きます.ここではよくありませんが、大体のロジックはそうです.