zoukankan      html  css  js  c++  java
  • 微信公众号授权--后端

    后台部署

    参数

    • 服务器 腾讯 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 的使用还是很粗浅,还是需要多多了解一下才可以
    • 虽然有了域名和服务器,奈何域名审核好麻烦,对服务器购买时长有要求,后期再处理了,这次只当是练练手
  • 相关阅读:
    ajax GET 传输中文乱码
    php 验证码 图像存在错误 无法显示 解决方法
    ajax 简单实例
    PHP continue break 区别 用法
    php注意事项
    php7注意事项
    腾讯2015后台模拟题
    【leetcode】_3Sum
    最小的k个数 2.5
    《Hadoop权威指南》笔记 第三章 并行复制及存档
  • 原文地址:https://www.cnblogs.com/sinosaurus/p/11408617.html
Copyright © 2011-2022 走看看