微信公众号官网
访问上面的网址,输入公众号账户和密码,登录微信公众平台。
编辑文章
管理 -> 素材管理 -> 图文消息 -> 新建图文消息
发送文章
在图文消息中,可以预览测试(需要输入微信号),也可以直接正常群发。
菜单
功能 -> 自定义菜单
自动回复
功能 -> 自动回复 -> 被关注回复
功能 -> 自动回复 -> 关键词回复
功能 -> 自动回复 -> 收到消息回复
如果不是大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
个人订阅号能做的事情