-
Notifications
You must be signed in to change notification settings - Fork 0
Description
开发准备
- 概念区分
- 微信公众平台开发是指为微信公众号进行业务开发
- 微信开放平台是指第三方平台(为各行各业公众号运营者提供服务)的开发。
- 测试号申请系统
- 接口调试工具来在线调试某些接口
- 接口调用频次限制
- 公众号调用接口并不是无限制的。为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下,每个公众号调用接口都不能超过一定限制,当超过一定限制时,调用对应接口会收到错误返回码 45009
- 开发者可以登录微信公众平台,在帐号后台开发者中心接口权限模板查看帐号各接口当前的日调用上限和实时调用量,对于认证帐号可以对实时调用量清零,每个帐号每月共 10 次清零操作机会
- 具体频率
- 通过接口调用的返回码,以及报警排查指引来发现和解决问题
- 微信公众平台已对外开放接口报警,当微信服务器向开发者推送消息失败次数达到预定阈值时,会将报警消息发送到指定微信报警群中(设置方式:公众平台->开发-运维中心->接口报警)
- 公众平台以 access_token 为接口调用凭据,来调用接口,所有接口的调用需要先获取 access_token,access_token 在 2 小时内有效,过期需要重新获取,但 1 天内获取次数有限,开发者需自行存储。
着重声明
- 如果直接在微信官方公众号中配置自己的回调服务器,会导致微信官方提供的运营功能失效,比如自定义菜单等,那么两者能够兼得的吗?现在看来答案是可以的,可以去微信开放平台开发
第三方平台,然后通过公众号授权的方式,这样微信的回调同样会被转发到自己服务器,同时还不影响微信运营。 - 对于用缓存的需要更新的共享资源需要注意
多线程的并发问题,比如 access_token,ticket 等,需要加锁保证安全,否则在高并发的情况下,极有可能出现问题。
入门储备
安全性
由于公众号的 secret 和获取到的 access_token 安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新 access_token、通过 access_token 获取用户信息等步骤,也必须从服务器发起。
用户识别
为了识别用户,每个用户针对每个公众号会产生一个安全的 OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的 OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个 UnionID,可以在用户管理-获取用户基本信息(UnionID 机制)文档了解详情。
微信服务
微信公众号能提供哪些服务呢?这是了解微信公众号能帮助我们做什么的关键!
- 公众号消息会话
- 群发消息:有频率限制(订阅号为每天 1 次,服务号为每月 4 次),向用户群发消息,包括文字消息、图文消息、图片、视频、语音等。
- 被动回复消息:在用户给公众号发消息后,公众号可以在 5 秒内做出回复,可以回复一个消息,也可以回复命令告诉微信服务器这条消息暂不回复。
- 客服消息:在用户给公众号发消息后的 48 小时内,公众号可以给用户发送不限数量的消息,主要用于客服场景。
- 模板消息:在需要对用户发送服务通知(如刷卡提醒、服务预约成功通知等)时,公众号可以用特定内容模板,主动向用户发送消息。
- 公众号内网页
- 网页授权获取用户基本信息,分为静默授权(只能获取 OpenID,设置为
snsapi_base)和用户同意(获取基本信息,设置为snsapi_userinfo) - 微信 JS-SDK:是开发者在网页上通过 JavaScript 代码使用微信原生功能的工具包,开发者可以使用它在网页上录制和播放微信语音、监听微信分享、上传手机本地图片、拍照等许多能力。
- 网页授权获取用户基本信息,分为静默授权(只能获取 OpenID,设置为
Token 区别
这是重点,个人觉得弄清楚了这个,微信开发也就算入门了,需要什么功能直接查阅文档调用 API 即可,Token 是调试接口的凭证。
之前一直搞不懂网页授权和基础授权的区别,容易弄混,今日重新看微信公众号的 WIKI,思路清晰多了!
- 验证开发者服务器 token
- Token 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。
- 网页授权 access_token
- 用来得到用户的基本信息,微信会重定向在菜单 URL 中配置的 URL 参数,同时附带 code 参数,用 code 参数请求网页授权 aceess_token,每日次数无限制,过期时间 7200s。
- 如果过期使用刷新 access_token 的 API 进行重新获取(刷新接口无次数限制)。
- 网页授权 access_token 只能获取到一个微信用户信息,是与微信用户一对一的关系。
- 微信网页授权是通过 OAuth2.0 机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权 access_token),通过网页授权 access_token 可以进行授权后接口调用,如获取用户基本信息。
- 基础授权 access_token
- 其他微信接口,需要通过基础支持中的“获取 access_token”接口来获取到的普通 access_token 调用。目前每日限制 2000 次,有效期 7200s。
- 刷新基础授权需要调用接口重新获取。
- 基础支持的 access_token,在有效期内就可以使用 access_token 和 openId 获取微信用户信息。
- 建议公众号开发者使用
中控服务器统一获取和刷新 Access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务。 - 目前 Access_token 的有效期通过返回的 expire_in 来传达,目前是 7200 秒之内的值。中控服务器需要根据这个有效时间提前去刷新新 access_token。在刷新过程中,中控服务器对外输出的依然是老 access_token,此时公众平台后台会保证在刷新短时间内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
- Access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在 API 调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
基本开发
微信网页授权
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
两种 scope 的区别
- 以 snsapi_base 为 scope 发起的网页授权,是用来获取进入页面的用户的 openid 的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
- 以 snsapi_userinfo 为 scope 发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
静默授权
- 对于以 snsapi_base 为 scope 的网页授权,就静默授权的,用户无感知;
- 对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是 scope 为 snsapi_userinfo,也是静默授权,用户无感知。
网页授权步骤
- 引导用户进入授权页面同意授权,获取 code
- 通过 code 换取网页授权 access_token(与基础支持中的 access_token 不同)
- 如果需要,开发者可以刷新网页授权 access_token,避免过期
- 通过网页授权 access_token 和 openid 获取用户基本信息(支持 UnionID 机制)
JS-SDK
微信 JS-SDK 是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信 JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
使用步骤:
-
后台绑定域名,填写 JS 接口安全域名
-
引入 JS 文件
-
通过 config 接口注入权限验证配置
-
所有需要使用 JS-SDK 的页面必须先注入配置信息,否则将无法调用(同一个 url 仅需调用一次,对于变化 url 的 SPA 的 web app 可在每次 url 变化时进行调用)
-
通过 ready 接口处理成功验证
- config 信息验证后会执行 ready 方法,所有接口调用都必须在 config 接口获得结果之后,config 是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在 ready 函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在 ready 函数中。
-
通过 error 接口处理失败验证
接口调用说明
所有接口通过 wx 对象(也可使用 jWeixin 对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:
- success:接口调用成功时执行的回调函数。
- fail:接口调用失败时执行的回调函数。
- complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
- cancel:用户点击取消时的回调函数,仅部分有用户取消操作的 api 才会用到。
- trigger: 监听 Menu 中的按钮点击时触发的方法,该方法仅支持 Menu 中的相关接口。
JS-SDK 使用权限签名算法
- 生成签名之前必须先了解一下 jsapi_ticket,jsapi_ticket 是公众号用于调用微信 JS 接口的临时票据。正常情况下,jsapi_ticket 的有效期为 7200 秒,通过 access_token 来获取。
由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket。 - 签名生成规则如下:参与签名的字段包括 noncestr(随机字符串), 有效的 jsapi_ticket, timestamp(时间戳), url(当前网页的 URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的
ASCII码从小到大排序(字典序)后,使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1。这里需要注意的是所有参数名均为小写字符。对 string1 作 sha1 加密,字段名和字段值都采用原始值,不进行 URL 转义。 - 注意事项
- 签名用的 noncestr 和 timestamp 必须与 wx.config 中的 nonceStr 和 timestamp 相同。
- 签名用的 url 必须是调用 JS 接口页面的完整 URL。
- 出于安全考虑,开发者必须在服务器端实现签名的逻辑。
更多 JS-SDK 能实现的功能:JS-SDK
深入开发
在这里不做深入记录,有开发需要时自行查阅。
- 自定义菜单
- 消息关系
- 素材管理
- 用户管理
- 账号管理
- 数据统计
- 微信卡券
- 微信门店
- 微信小店
- 微信设备
- 微信摇一摇
- ...
看 wiki 真的是索然无味的,很多功能也比较高级,当项目中有需求的时候再去看文档学习!
辅助工具
一些通用工具函数
判断微信端
function is_weixin() {
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") {
return true;
} else {
return false;
}
}设置微信标题
笔者多次尝试,发现在 android 和 ios 上,常用的设置标题的方式会有问题,不是 android 无效就是 ios 无效,下面是来自网络的通用设置方式,亲测有效。
.factory('Title', function () {
// 原生触发
return {
changeTitle: function (title) {
var body = document.getElementsByTagName('body')[0];
document.title = title;
var iframe = document.createElement("iframe");
iframe.setAttribute("src", "/img/favicon.ico");
function listener() {
setTimeout(function () {
iframe.removeEventListener('load', listener);
document.body.removeChild(iframe);
}, 0);
}
iframe.addEventListener('load', listener);
document.body.appendChild(iframe);
}
}
})缓存问题
由于微信会缓存静态文件,导致代码更新时不能及时反应过来,通过给文件添加版本号或者时间戳的方式来消除影响。