微信公众号网页开发

公众号

为识别用户,每个用户对每个公众号有一个唯一的OpenID,如果要在多个公众号、移动应用之间做用户互通,则需前往开放平台,将它们绑定到同一开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID,但是只有一个唯一的UnionID,可以通过获取 用户信息 中的 UnionID 来区分用户的唯一性。

公众号主要通过 公众号消息会话公众号内网页 来为用户提供服务。

公众号分为 订阅号服务号企业号

订阅号服务号 的区别:

  1. 功能使用:服务号比订阅号可使用的更多的功能,订阅号只能使用大部分功能,已认证的服务号可使用全部功能;
  2. 群发消息的能力:订阅号每天可以发送一条群发消息,服务号为每月4次;
  3. 适用群体:订阅号适用于个人和媒体,服务号适用于企业、政府或其他组织;

获取access_token

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。
这里access_token的获取只需服务端调用微信接口获取并存储即可,无需前端通过接口调用。

网页授权

网页授权流程(详细流程可查看 微信公众号开发文档),以Vue项目为例:

  1. 初次进入页面时先访问微信授权页面进行授权,获取code;
<!-- App.vue -->
<script>
import { weChatConfig } from "utils/weChatConfig";

export default {
    async created() {
        // 获取url上的参数
        const params = getUrlParams(window.location.href);

        // 通过是否已经获取到用户openid,或者是url上是否携带了code参数来判断是否需要进行授权操作
        // 授权成功页面回调时redirect_uri/?code=CODE&state=STATE会在url上携带相关的参数
        if (!getSessionItem(process.env.VUE_APP_STORAGE_OPENID) && !params.code) {
            // 授权回调地址需要进行 urlEncode 处理
            const backUrl = encodeURIComponent(`${window.location.protocol}//${window.location.host}`);
            // 授权成功后可在回调地址中通过state添加参数,最多128字符
            const backParmas = JSON.stringify(params);
            
            // process.env.VUE_APP_AUTH_URL = https://open.weixin.qq.com/connect/oauth2/authorize
            // 如果无需获取用户信息,此处使用静默授权scope=snapi_base即可
            window.location.href = `${process.env.VUE_APP_AUTH_URL}?appid=${process.env.VUE_APP_APPID}&redirect_uri=${backUrl}&response_type=code&scope=snsapi_base&state=${backParmas}#wechat_redirect`;
            return;
        }
        /* 授权完成后可调用服务端接口获取用户openid */
        if (params.code) {
            // 将授权回调回来的code传给服务端进行openid的获取
            const result = await Api.getOpenid({
                code: params.code
            });
            
            setSessionItem(process.env.VUE_APP_STORAGE_OPENID, result.openid); // 缓存openid
            // 调用服务端接口获取签名,进行JS-SDK的初始化
            Api.getWechatConfig({
                url: window.location.host
            }).then(res=> {
                const { timestamp, nonceStr, signature } = res.data;

                weChatConfig({
                    timestamp: parseInt(timestamp),
                    nonceStr,
                    signature
                });
            });
        }
        
    }
};
</script>

<!-- wechatConig.js -->
export function weChatConfig({
  timestamp,
  nonceStr,
  signature
}) {
  wx.config({
    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: process.env.VUE_APP_APPID, // 必填,公众号的唯一标识
    timestamp, // 必填,生成签名的时间
    nonceStr, // 必填,生成签名的随机串
    signature, // 必填,签名
    jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'chooseWXPay'], // 必填,需要使用的JS接口列表
  });
}

注意:

  • 由于同一个开放平台可绑定多个移动应用,一个用户对多个公众号或移动应用有多个openid,因此openId建议使用sessionStorage进行存储,而不使用localStorage;
  • 测试帐号只能对关注者网页授权,因此在使用测试账号扫码直接进入网页进行授权时,会出现未关注测试号微信登录失败的弹窗提示,正式帐号可以对未关注者授权,因此可以忽略此问题;
    image.png
  1. 授权成功,通过code换取网页授权access_token和openid:
    这里通过code换取的是一个特殊的网页授权access_token,与基础支持的access_token不同(该access_token用于调用其他接口,区别可查看获取基础access_token),如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid。
    由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

测试号申请

扫码 公众平台测试号申请,填写相应的配置:

image.png

注意:

  1. 这里的URL,需要服务端提供一个完整的接口路径;
  2. 为方便调试,JS接口安全域名支持配置本地IP地址,但访问页面时的端口号必须是80端口,否则在页面进行授权时会报redirect_uri参数错误;
<!-- vue.config.js -->
module.exports = {
    devServer: {
        port: 80 // 指定端口号为80端口
    }
};
  1. 配置授权回调页面域名:


    image.png

    此处同样支持配置本地IP地址,但端口号也只能是80端口

微信公众平台接口调试工具

利用 微信公众平台接口调试工具 进行相关的配置。

image.png

access_token由服务端提供。
image.png

微信浏览器缓存清理

微信浏览器是在webview的上层做的缓存:如果请求过了这个地址,就会存在本地,之后不取线上了。因此在做公众号网页开发时经常要做浏览器缓存的清理:

  1. 用微信内置浏览器打开这个网页debugx5.qq.comhttp://debugtbs.qq.com/
  2. 勾选相应的缓存清理


    image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容