微信公眾號授權--后端


后台部署

參數

  • 服務器 騰訊 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 的使用還是很粗淺,還是需要多多了解一下才可以
  • 雖然有了域名和服務器,奈何域名審核好麻煩,對服務器購買時長有要求,后期再處理了,這次只當是練練手


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM