微信公众号授权--后端

后台部署

参数

  • 服务器 腾讯 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 来换取 token
        https://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 的使用还是很粗浅,还是需要多多了解一下才可以
  • 虽然有了域名和服务器,奈何域名审核好麻烦,对服务器购买时长有要求,后期再处理了,这次只当是练练手
posted @ 2019-08-25 17:35  木石心  阅读(935)  评论(0编辑  收藏  举报