微信小程序-获取用户session_key,openid,unionid - 后端为nodejs8.0+
步骤:
1、通过wx.login接口获取code既jscode,传递到后端;
2、后端请求
地址,就能获取到openid和unionid。
小程序接口promise化和封装
1、utils文件夹下创建wechat.js文件
/**
- Promise化小程序接口
/
class Wechat {
/*- 登陆
- @return {Promise}
*/
static login() {
return new Promise((resolve, reject) => wx.login({ success: resolve, fail: reject }));
};
/**
- 获取用户信息
- @return {Promise}
*/
static getUserInfo() {
return new Promise((resolve, reject) => wx.getUserInfo({ success: resolve, fail: reject }));
};
/**
- 发起网络请求
- @param {string} url
- @param {object} params
- @return {Promise}
*/
static request(url, params, method = “GET”, type = “json”) {
console.log(“向后端传递的参数”, params);
return new Promise((resolve, reject) => {
let opts = {
url: url,
data: Object.assign({}, params),
method: method,
header: { ‘Content-Type’: type },
success: resolve,
fail: reject
}
console.log(“请求的URL”, opts.url);
wx.request(opts);
});
};
/**
- 获取微信数据,传递给后端
*/
static getCryptoData() {
let code = “”;
return this.login()
.then(data => {
code = data.code;
console.log(“login接口获取的code:”, code);
return this.getUserInfo();
})
.then(data => {
console.log(“getUserInfo接口”, data);
let obj = {
js_code: code,
};
return Promise.resolve(obj);
})
.catch(e => {
console.log(e);
return Promise.reject(e);
})
};
/**
- 从后端获取openid
- @param {object} params
*/
static getMyOpenid(params) {
let url = ‘https://xx.xxxxxx.cn/api/openid’;
return this.request(url, params, “POST”, “application/x-www-form-urlencoded”);
};
}
module.exports = Wechat;
2、修改小程序的app.js文件
let wechat = require(’./utils/wechat.js’);
App({
onLaunch() {
this.getUserInfo();
},
getUserInfo() {
wechat.getCryptoData()
.then(d => {
return wechat.getMyOpenid(d);
})
.then(d => {
console.log(“从后端获取的openid”, d.data);
})
.catch(e => {
console.log(e);
})
}
})
后端nodejs,是用的express命令行生成的项目框架,
1、创建common文件夹,创建utils文件,使用request模块请求接口,promise化request
const request = require(“request”);
class Ut {
/**
* promise化request
* @param {object} opts
* @return {Promise<[]>}
*/
static promiseReq(opts = {}) {
return new Promise((resolve, reject) => {
request(opts, (e, r, d) => {
if (e) {
return reject(e);
}
if (r.statusCode != 200) {
return reject(`back statusCode:${r.statusCode}`);
}
return resolve(d);
});
})
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
};
module.exports = Ut;
2、新增路由,appId、secret在小程序的后台获取
router.post("/openid", async (req, res) => {
const Ut = require("…/common/utils");
try {
console.log(req.body);
let appId = “wx70xxxxxxbed01b”;
let secret = “5ec6exxxxxx49bf161a79dd4”;
let { js_code } = req.body;
let opts = {
url: https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${js_code}&grant_type=authorization_code
}
let r1 = await Ut.promiseReq(opts);
r1 = JSON.parse(r1);
console.log(r1);
res.json(r1);
}
catch (e) {
console.log(e);
res.json(’’);
}
})
结果:
这个返回结果没有unionid,按照官方的说法,需要在微信开放平台绑定小程序;
如果需要解密和数据校验,请跳转这里。
参考地址:
https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html
https://mp.weixin.qq.com/debug/wxadoc/dev/api/uinionID.html
意外金喜的博客:http://blog.youkuaiyun.com/zzwwjjdj1
作者:意外金喜
来源:优快云
原文:https://blog.youkuaiyun.com/zzwwjjdj1/article/details/79351005
版权声明:本文为博主原创文章,转载请附上博文链接!