登录
检查session(客户端) --> 登录(客户端) -->
code
值 --> 获取openid
和session_key
客户端
客户端
// app.js
onLaunch() {
this.checkSession()
}
// 判断微信是否存有session
checkSession() {
wx.checkSession({
success(res) {
console.log('checkSession', res);
},
fail(error) {
console.log('checkSession error', error);
// 没有需要去登录获取
// 临时登录凭证code只能使用一次
// 调用login时 会更新session_key,使原来的失效
wx.login({
success(response) {
console.log('login success', response);
wx.request({
url: 'https://www.wechatehttps.com/onLogin',
data: {
code: response.code;
},
success(result) {
console.log('登录成功后返回的信息', result)
},
fail(err) {
console.log('失败返回的信息', err);
}
})
},
fail(err) {
console.log('login error', err);
}
})
}
})
}
服务端
服务端 基于
express
搭建的 使用request
发送请求
const appid = 'wx**********';
const secret = '**************';
const authorizationCode = 'test';
let sessionKey = null;
let openid = null;
app.get('/onLogin', (req, res) => {
// 获取到登录后的code
const { code } = req.query;
// 向微信服务器发送信息获取到 openid 和 session_key
request(`https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=${authorizationCode}`, (err, response, body) => {
if(err) console.log(err);
const data = JSON.parse(body);
/*
签名校验以及数据加解密涉及用户的会话密钥session_key。 需要保存在服务器
openid 判断是否是同一个用户
session_key 判断用户是否失效
data: {
openid: '**********',
session_key: '********'
}
*/
res.end(JSON.strinfy(data))
})
})
转发和群分享
转发
- 开启页面转发功能
因为微信开放问题,推荐是需要转发的页面开启转发,所以默认是没有开启
// page.js
onLoad() {
wx.showShareMenu({
// 是否携带转发来源信息,默认false
// 目前只有转发到群聊才有,单聊没有
withShareTicket: true
})
}
- 触发转发(页面/按钮)
//page.js
page({
onShareAppMessage(type) {
// from button:页面内转发按钮;menu:右上角转发菜单
if (res.from === 'button') {
// 来自页面内转发按钮
console.log(res.target)
return {
title: '通过按钮转发',
// 可以通过query带参数
path: '/page/user?id=123',
}
}
return {
title: '自定义转发标题',
path: '/page/user?id=123'
}
}
})
- 通过转发个人进入获取转发人标识
query 里面带的参数可以在转发的
app.js
onLaunch获得
// �app.js
onLaunch(info) {
const query = info.query
}
通过转发群聊进入获取群信息
- 客户端请求和处理
// app.js
/*
因为回调太恶心了,所以这里用了wepy框架,
采用es6 await/async 进行异步请求
*/
onLaunch(info) {
const self = this
// 判断是否有转发来源
if (info.shareTicket) {
self.getShareInfoFun(info)
}
}
async getShareInfoFun(info) {
// 通过转发 shareTicket 获取 加密的用户信息
const data = await this.getShareInfo(info)
// 检查微信服务器的session是否失效
const response = await this.checkSession()
const { encryptedData, iv } = data
/*
通过 login 拿到code
通过 getShareInfo 拿到 encryptedData 和 iv 的加密信息
向服务端请求,拿到解密数据
*/
if(response){
wepy.request({
url: 'https://www.wechathttps.com/onLogin',
data: {
code: response.code,
encryptedData,
iv
},
success(result) {
// 返回解密后的数据
// 拿到 openGId (群id)
console.log('数据返回', result)
},
fail(err) {
console.log('request error', err)
}
})
} else {
wepy.request({
url: 'https://www.wechathttps.com/getOpenGid',
data: {
encryptedData,
iv
},
success(result) {
// 返回解密后的数据
// 拿到 openGId (群id)
console.log('数据返回', result)
},
fail(err) {
console.log('request error', err)
}
})
}
}
// 通过转发 shareTicket 获取 加密的用户信息
getShareInfo(info) {
return new Promise((resolve, reject) => {
wepy.getShareInfo({
shareTicket: info.shareTicket,
success(res) {
console.log('getShareInfo', res)
// 返回的是加密数据
resolve(res)
}
})
})
}
// 检查
checkSession() {
return new Promise((resolve, reject) => {
// 判断微信服务器上的session是否失效
wepy.checkSession({
// 未失效, 如果调用login会使当前session失效,再重新生成一个新的
success(res) {
console.log('checkSession', res)
resolve(null)
},
// 失效需要重新调用login
fail(error) {
console.log('checkSession error', error)
wepy.login({
success(response) {
// 登录成功后拿到code值用于服务器解码
console.log('success login', response)
resolve(response)
},
fail(err) {
console.log('error login', err)
reject(err)
}
})
}
})
})
}
- 服务端获取数据和解密
//node + express + request
const express = require('express')
const request = require('request')
// 通过微信小程序开发文档里面的加密解密下载获取
const WXBizDataCrypt = require('./server/WXBizDataCrypt')
const app = express()
// 小程序开发者获取
const APPID = 'wx2980632cc9eeafd5'
const SECRET = '7890a1d703413e7c39015801ce09f611'
// session标识
const authorization_code = 'demo'
let sessionKey = null
let openid = null
app.get('/onLogin', (req, res) => {
console.log('reviced')
const query = req.query
const { encryptedData, iv, code } = query
/*
向微信服务器请求
获取openid和session_key, 存起来,除非用户失效或者重新登录,不然不会变
openid一对一,不会变,变的是session_key
*/
request(`https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=${authorization_code}`, (err, response, body) => {
if (err) console.log(err)
body = JSON.parse(body)
// 获取 openid,session_key
sessionKey = body.session_key
openid = body.openid
const pc = new WXBizDataCrypt(APPID, sessionKey)
// 将加密信息 encryptedData和iv 解密出来
const data = pc.decryptData(encryptedData, iv)
res.json(data)
console.log('send', data)
})
})
// 如果已经登录了
app.get('/getOpenGid', (req, res) => {
const query = req.query
const { encryptedData, iv } = query
const pc = new WXBizDataCrypt(APPID, sessionKey)
const data = pc.decryptData(encryptedData, iv)
res.json(data)
})
小程序码转发
图片生成
客户端向服务端请求 --> 服务端向微信服务器请求 --> 获取二进制图片流 --> 转成png图片存储
--> 返回客户端小程序码的url --> 客户端canvas重新绘制 --> 调用微信api将canvas绘制的存成临时图片
--> wx.getSetting 查询用户是否授权过 --> wx.authorize 询问用户是否授权 --> 使用button组件打开wx.openSetting
--> 调用微信api将临时文件保存到系统相册
网友评论