微信公众号授权--后端
后台部署
参数
- 服务器 腾讯 linux
- 语言 node
- 部署 pm2
部署流程
-
ssh远端连接服务器
会经常碰到
Permission denied, please try again.
- link
- 注意登录时用得用户名跟自己需要的是否一致
-
pm2配置
目前而言,pm2需要开发跟生产都需要安装,开发用来部署,生产用来记录日志等- 安装
npm i pm2 -S
pm2 ecosystem
|pm2 init
生成ecosystem.config.js
- 配置
ecosystem.config.js
` - 发布
pm2 deploy production setup
- 更新
pm2 deploy production update
- 安装
微信后台代码
因为需要调用微信的api,因而需要一台服务器,目前可以两种选择。
- vue开发环境配置 node 代理(这样也可以请求到想要的数据,但是没有挑战性,同时也不符合微信开发要求)
- 购买一台公网服务器(下述都是围绕这进行开展的)
微信开发准备
- 绑定公网
此处需要注意, 端口号需要是
80
,同时腾讯服务器可以访问到,主要是为了确保腾讯服务器能跟自己的服务器进行正常沟通
- api (获取用户信息)
- 利用前台传入的
code
来换取 tokenhttps://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
- 利用上面请求回来的 token等参数来获取用户信息
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
- 利用前台传入的
- node 代码所在位置
code
const Hapi = require('hapi')
const Axios = require('axios')
const init = async () => {
const server = Hapi.server({
port: 80,
host: '172.16.0.6'
// port: 8080,
// host: 'localhost'
})
server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
// 此处用来保证腾讯服务器跟自己的服务器通讯正常
/**
* 此处做了简化操作
*/
const { echostr = 7777 } = request.query
return echostr
}
})
server.route({
method: 'post',
path: '/login',
handler: async (request, h) => {
const { code } = request.payload
try {
const Url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxe77d6963852aebca&secret=447b96c081d99e68b192b491412a1900&code=${code}&grant_type=authorization_code`
const res1 = await Axios.get(Url)
const { access_token, openid } = res1.data
const UserUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}&lang=zh_CN`
const data = await Axios.get(UserUrl)
return data.data
} catch (e) {
throw new Error(e)
}
}
})
await server.start()
console.log('Server running on %s', server.info.uri)
}
process.on('unhandledRejection', (e) => {
process.exit(1)
})
init()
代码短短几十行但是需要跑通,以及没有问题,确实有些困难
一些问题
- 无权限
{ Error: listen EACCES 172.16.0.6:80 at Object._errnoException (util.js:1022:11) at _exceptionWithHostPort (util.js:1044:20) at Server.setupListenHandle [as _listen2] (net.js:1350:19) at listenInCluster (net.js:1408:12) at doListen (net.js:1517:7) at _combinedTickCallback (internal/process/next_tick.js:141:11) at process._tickCallback (internal/process/next_tick.js:180:9) at Function.Module.runMain (module.js:695:11) at startup (bootstrap_node.js:188:16) at bootstrap_node.js:609:3 code: 'EACCES', errno: 'EACCES', syscall: 'listen', address: '172.16.0.6', port: 80 }
添加
sudo
error listen EADDRINUSE
link
解决办法,关闭对应端口的进程
sudo fuser -k 3000/tcp
注意微信服务返回的数据结构,之前一直以为是直接获取,没想到还有
data
包裹了一层
总结
- node下载包太慢了,即使使用了淘宝镜像,可能与自己购买的服务器有关吧
- linux 权限问题还是麻烦,有些命令需要使用
sudo
来执行,这就导致自动化部署,命令执行了,却因为权限而没有成功 - pm2 的使用还是很粗浅,还是需要多多了解一下才可以
- 虽然有了域名和服务器,奈何域名审核好麻烦,对服务器购买时长有要求,后期再处理了,这次只当是练练手