公众号订阅号

微信公众号官网

访问上面的网址,输入公众号账户和密码,登录微信公众平台。

账户名:[email protected]

编辑文章

管理 -> 素材管理 -> 图文消息 -> 新建图文消息

发送文章

在图文消息中,可以预览测试(需要输入微信号),也可以直接正常群发。

菜单

功能 -> 自定义菜单

自动回复

功能 -> 自动回复 -> 被关注回复

功能 -> 自动回复 -> 关键词回复

功能 -> 自动回复 -> 收到消息回复

如果不是大V,自动回复会有延迟。

微信公众号的二次开发
微信公众平台技术文档:

开发工具下载:

AppID和AppSecret

开发 -> 基本配置

AppID:wx1185ec76f0273548
AppSecret:ffab01b24bd716fbf68eef7c6fe5cf69

调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中。

如果不设置IP白名单,那么token是无权限获取的。

JS接口安全域名

如果有自己的服务器,可以设置安全域名。

设置 -> 公众号设置 -> 功能设置 -> JS接口安全域名

我们公众号发布的文章中可能带有链接,用户点击这个链接后会在微信中打开一个网页,这个网页是否有权限使用jssdk提供的能力。

如果没有自己的服务器,可以本机测试。

手机和电脑处于同一网络,无须设置安全域名,订阅号文章关联到本机某个html文件,微信可以访问这个文件。

可以访问到文件,可以看到文件中的内容,但无权使用jssdk提供的能力。

获取算法签名

想让某网页具有微信jssdk的能力,那么要先获取到微信的签名。

网页执行流程(前后端分离,nodejs版):

  • step1: 用户打开了a.html
  • step2: a.html发起前端请求,访问自身服务器下的b页面
  • step3: b页面为nodejs页面,发起后端请求,访问微信服务器,把从微信服务器得到的签名显示在b页面的响应中。
  • step4: a.html的请求结束,通过b页面这种代理的形式,得到了微信服务器传过来的签名。
  • step5: a.html把得到的签名配置到jssdk中,这样a.html就具有jssdk提供的能力了。

网络测试代码 http://dyh.wyyijiaqin.com/1.html

示例代码

a.html

   <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script>
        <script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
        <script>
        axios.get('/b').then(res=>{
            var {appId, timestamp, nonceStr, signature} = res.data;
            wx.config({
                debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId, // 必填,公众号的唯一标识
                timestamp, // 必填,生成签名的时间戳
                nonceStr, // 必填,生成签名的随机串
                signature,// 必填,签名
                jsApiList: ['chooseImage'] // 必填,需要使用的JS接口列表
            });
    
            wx.ready(function(){
                // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
                console.log('ready: 可以使用 jssdk')
            });
        })
    
        function fn(){
            wx.chooseImage({
                count: 1, // 默认9
                sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
                sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
                success: function (res) {
                    var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
                    alert(localIds);
                }
            });
        }
        </script>
    </head>
    <body>
        <button onclick="location.reload(true)">刷新</button><br>
        <button onclick="fn()">拍照</button><br>
        老王很喜欢他的邻居...
    </body>
    </html>

nodejs的路由页

    const express = require('express');
    const app = express();
    
    app.use(express.static('public'));
    
    const wx_gzh = require('./wx_gzh.js');
    
    app.get('/b', (req, res)=>{
        wx_gzh('wx1185ec76f0273548', 'ffab01b24bd716fbf68eef7c6fe5cf69', req.headers.referer).then(result=>{
            res.json(result);
        })  
    })
    
    app.listen(80);

wx_gzh.js

    const axios = require('axios') 
    const crypto = require('crypto')
    
    module.exports = async function(AppID, AppSecret, refererUrl){
        // 获取token
        var url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='+AppID+'&secret='+AppSecret;
        var result = await axios.get(url);
        const ACCESS_TOKEN = result.data.access_token;
        // 获取ticket
        url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='+ACCESS_TOKEN+'&type=jsapi';
        result = await axios.get(url);
        const jsapi_ticket = result.data.ticket;
        // 获取微信签名数据
        var obj = sign(jsapi_ticket, refererUrl);
        return obj;
        // 签名算法
        function sign (jsapi_ticket, refererUrl) {
            var ret = {
                jsapi_ticket: jsapi_ticket,
                nonceStr: createNonceStr(),
                timestamp: createTimestamp(),
                url: refererUrl
            }
            var string = raw(ret)
            ret.signature = sha1(string)
            ret.appId = AppID
            ret.access_Token = ACCESS_TOKEN
            return ret
        }
        // 生成签名的随机串
        function createNonceStr () {
            return Math.random().toString(36).substr(2, 15)
        }  
        // 生成签名的时间戳
        function createTimestamp () {
            return parseInt(new Date().getTime() / 1000) + ''
        }   
        // 对参数对象进行字典排序
        function raw (args) {
            var keys = Object.keys(args)
            keys = keys.sort()
            var newArgs = {}
            keys.forEach(function (key) {
                newArgs[key.toLowerCase()] = args[key]
            })
            var string = ''
            for (var k in newArgs) {
                string += '&' + k + '=' + newArgs[k]
            }
            string = string.substr(1)
            return string
        }         
        // sha1加密
        function sha1(str) {
            let shasum = crypto.createHash("sha1")
            shasum.update(str)
            str = shasum.digest("hex")
            return str
        }
    }

检查一下所拥有的权限

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433401084

https://mp.weixin.qq.com/advanced/advanced?action=table&token=1344557378&lang=zh_CN

个人订阅号是没有权限在自己的服务器中设置自定义按钮菜单的,所以只能通过公众号后台设置。

个人订阅号权限较少,主要是做文章的推送的,如果想做一些复杂的功能,应选择企业服务号或微信小程序。

JSSDK

官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

个人订阅号能做的事情

发布了60 篇原创文章 · 获赞 19 · 访问量 5890

猜你喜欢

转载自blog.csdn.net/lff18277233091/article/details/104438649