• 微信公众号之分享接口


    简介

    当我们点击右上角的三个点,就会有默认的分享在这里插入图片描述
    分享后的卡片如下在这里插入图片描述

    1. 但是这个时候我们想要改变一些分享的信息,这里我们需要参照微信的官网,点击
    2. 这里我们使用的是updateAppMessageShareData
    wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
      wx.updateAppMessageShareData({ 
        title: '', // 分享标题
        desc: '', // 分享描述
        link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
        imgUrl: '', // 分享图标
        success: function () {
          // 设置成功
        }
      })
    }); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意

    • 一般在当前页面初始化的时候,就应该调用当前的接口

    步骤

    1. 其实我们在页面舒适化中调用函数就可以了,也就是在ready后进行调用
    2. 然后传递各种参数就可以了,不传也会有默认的
    3. 由于我们在开发的时候并不是真机环境,那么这里我们就无法看到效果了

    项目结构调整

    接下来项目会越做越大,这里我们把项目结构再次调整一下

    目录结构

    在这里插入图片描述

    解释

    1. 我们把单独用于自动回复的功能抽了出来,在一个reply文件夹下
    2. 把路由专门抽了出来,在router文件夹下,专门用于管理路由,大致的代码如下

    index.js

    根目录下的js文件

    const express = require("express")
    const app = express()
    
    const router = require("./router")
    
    // 配置模板资源目录
    app.set("views", "./views")
    // 配置模板引擎
    app.set("view engine", "ejs")
    app.use(router)
    
    app.listen(4000, () =>console.log("服务器启动成功"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    router/index.js

    const express = require("express")
    const Router = express.Router
    const router = new Router()
    const sha1 = require("sha1")
    
    const reply = require("../reply")
    const Wechat = require("../wechat/wechat")
    const { url } = require("../config")
    
    const wechat = new Wechat()
    
    router.get("/search", async (req, res) => {
        // 首先生成签名
        // 1. 获取到参数
        const { ticket } = await wechat.fetchTicket()
        const timestamp = Date.now(), jsapi_ticket = ticket, noncestr = Math.random().toString().split(".")[1]
        // 2. 进行字典排序
        const str = [
            `jsapi_ticket=${jsapi_ticket}`,
            `timestamp=${timestamp}`,
            `url=${url}/search`,
            `noncestr=${noncestr}`,
        ].sort().join("&")
    
        console.log("str", str)
        // 3. 进行sha1加密
        const signature = sha1(str)
        // 4. 将相关的参数传入到网页中
        res.render("search", { signature, noncestr, timestamp, appID })
    })
    
    router.use(reply())
    
    module.exports = router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    reply/index.js

    const sha1 = require("sha1")
    
    const config = require("../config")
    const { getUserDataAsync, parseXmlData, formatMsg } = require("../libs/utils")
    const reply = require("./reply")
    
    module.exports = () => {
        return async (req, res, next) => {
            const { signature, echostr, timestamp, nonce } = req.query
            const { token } = config
            const str = [token, timestamp, nonce].sort().join("")
            const sha1str = sha1(str)
            if (req.method === "GET") {
                // GET请求用于验证服务器的有效性
                if (sha1str == signature) {
                    res.set("Content-Type", "text/plain");
                    res.send(echostr);
                } else {
                    res.send(false)
                }
            } else if (req.method === "POST") {
                // POST用于接收用户发送的消息
                if (sha1str != signature) {
                    // post请求不是来源于微信
                    res.send("error")
                    return
                }
                // 获取微信发送的消息
                const xml_data = await getUserDataAsync(req)
                let user_data = await parseXmlData(xml_data)
                user_data = formatMsg(user_data)
                // 使用reply.js
                const replyMessage = await reply(user_data)
                console.log(replyMessage)
                // 将消息结构发送到微信服务器
                res.send(replyMessage)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    其他的就是修改一些文件的引入之类的

  • 相关阅读:
    一文搞懂 NULL 和 nullptr 的区别【CC++面试必备】
    43、Spring AMQP TopicExchange
    企业数据资产管理的参考框架和方法
    java毕业设计智能分析的简单聚众筹平台Mybatis+系统+数据库+调试部署
    Spring JDBCTemplate简介
    SpringBoot 打包发布
    在react中组件间过渡动画如何实现?
    docker 存储挂载比较
    全图化在线系统设计
    LQ0017 排列字母【排序】
  • 原文地址:https://blog.csdn.net/youhebuke225/article/details/126800657