微信小プログラムはユーザーの携帯電話番号とバックエンドの復号を取得することを許可する.
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.ここまで戻ってきたデータはユーザーの携帯番号で、中間の業務ロジックはやはり公式ドキュメントを見に行きます.ここではよくありませんが、大体のロジックはそうです.