微信公众号开发
概述
OpenID
- 识别用户
- 一个用户对多个公众号和应用有多个不同的OpenID
UnionID
- 需要在多公众号、移动应用之间做用户共通
- 一个用户对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID
微信公众平台
-
是指为微信公众号进行业务开发的平台
-
微信开放平台
- 为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发平台
access_token
- 公众平台的接口调用凭据
- 2小时内有效,过期需要重新获取,但1天内获取次数有限
- 开发者需自行存储
接口调用
- 仅支持80端口
服务场景
-
公众号消息会话
-
群发消息
- 公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息、图文消息、图片、视频、语音等。
-
被动回复消息
- 预先在开发者中心设置的服务器地址
-
客服消息
- 发消息/触发特定行为
-
模板消息
- 在需要对用户发送服务通知(如刷卡提醒、服务预约成功通知等)时,公众号可以用特定内容模板,主动向用户发送消息。
-
-
公众号内网页
-
网页授权获取用户基本信息
- 需用户同意
- 获取用户的OpenID是无需用户同意的
-
微信JS-SDK
- 是开发者在网页上通过JavaScript代码使用微信原生功能的工具包
-
入门指引
-
1 申请服务器
-
2 搭建服务
-
3 申请公众号
-
4 开发者基本配置-服务器配置
- 仅支持80端口
- Token:自主设置,这个token与公众平台wiki中常提的access_token不是一回事。这个token只用于验证开发者服务器。
- 提交服务器配置
- 启动配置
-
实现“你问我答”
-
被动回复消息
- 粉丝给公众号一条文本消息,公众号立马回复一条文本消息给粉丝,不需要通过公众平台网页操作。
-
-
实现“图尚往来”
- 素材管理
-
素材管理
- 临时素材
- 永久素材
-
自定义菜单
-
怎样反馈问题?
- https://developers.weixin.qq.com/community/minihome/question/1277775808983138305?mockCommonUse=1
- 1)简明扼要的描述清楚场景以及遇见问题,描述过程中尽可能使用wiki上的名称,譬如自定义菜单,素材管理等专有名词,不然开发根本不知道你在说什么。
- 2)提供账号信息:AppID(登录公众平台官网->基本配置),若牵扯粉丝提供粉丝的OpenID。
- 3)提供bug的发生时间,至少要以小时为单位(年-月-日-小时),当然越具体越容易查明问题。
开始开发
接入步骤
-
1、填写服务器配置
-
2、验证服务器地址的有效性
- 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上
-
3、依据接口文档实现业务逻辑
- 验证URL有效性成功后即接入生效,成为开发者。
- 微信公众号接口必须以http://或https://开头,分别支持80端口和443端口。
获取access token
-
定义
- 公众号的全局唯一接口调用凭据
- access_token的存储至少要保留512个字符空间
- access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
-
使用及生成方式
-
建议公众号开发者使用中控服务器统一获取和主动刷新access_token
- 其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;
-
中控服务器需要根据expire_in提前去刷新新access_token
- 目前是7200秒之内的值
- 在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;
-
中控服务器需要提供被动刷新access_token的接口
-
可能存在风险的调用
- 开发者通过某IP发起调用->平台返回错误码[89503]并同时下发模板消息给公众号管理员->公众号管理员确认该IP可以调用->开发者使用该IP再次发起调用->调用成功。
- 平台建议开发者在发起调用前主动与管理员沟通确认调用需求,或请求管理员开启IP白名单功能并将该IP加入IP白名单列表。
-
公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。
- https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
-
-
一个较为简单的access_token 存储和使用方案
- 1)中控服务器定时(建议1小时)调用微信api,刷新access_token,将新的access_token 存入mysql(或其他存储), 2)其他工作服务器每次调用微信api时从mysql(或其他存储)获取access_token,并可在内存缓存一段时间(建议1分钟)。
自定义菜单
创建接口
-
注意事项
-
一级菜单数组,个数应为1~3个
-
二级菜单数组,个数应为1~5个
-
一级菜单最多4个汉字,二级菜单最多8个汉字,多出来的部分将会以“…”代替。
-
菜单的刷新策略
- 如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单
- 测试:取消关注公众账号后再次关注,则可以看到创建后的效果。
-
-
按钮类型
-
click
- 推送消息类型为event的结构给开发者
-
view
- 跳转URL
- 可与网页授权获取用户基本信息接口结合,获得用户基本信息。
-
———————以下事件有微信版本限制
-
scancode_push
- 微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
-
scancode_waitmsg
- 微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者。
- 同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
-
pic_sysphoto
- 微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
-
pic_photo_or_album
- 微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
-
pic_weixin
- 微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
-
location_select
- 微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
-
————————以下专门提供给未认证订阅号
-
media_id
- 微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
-
view_limited
- 微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
-
个性化菜单接口
-
仅开放给已认证订阅号和已认证服务号。
-
开发者可以通过以下条件来设置用户看到的菜单
- 用户标签(开发者的业务需求可以借助用户标签来完成)
- 性别
- 手机操作系统
- 地区(用户在微信客户端设置的地区)
- 语言(用户在微信客户端设置的语言)
-
个性化菜单要求用户的微信客户端版本在iPhone6.2.2,Android 6.2.4以上,暂时不支持其他版本微信
-
一个公众号的所有个性化菜单,最多只能设置为跳转到3个域名下的链接
微信网页开发
网页授权
-
回调域名
- 域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头
- 公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。
- 如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
-
两种scope的区别
-
snsapi_base
- 用来获取进入页面的用户的openid
- 用户感知的就是直接进入了回调页(往往是业务页面)
- 静默授权的,用户无感知
-
snsapi_userinfo
-
用来获取用户的基本信息
-
这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
-
对于已关注公众号的用户,静默授权的,用户无感知
-
用户管理类接口中的“获取用户基本信息接口”
- 在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
-
-
-
网页授权access_token和普通access_token的区别
- 通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
- 其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
-
网页授权流程
-
1、引导用户进入授权页面同意授权,获取code
-
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
- 由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。
-
3、如果需要,开发者可以刷新网页授权access_token,避免过期
- 当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天
-
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
-
js-sdk说明文档
-
定义
- 面向网页开发者提供的基于微信内的网页开发工具包。
-
作用
-
使用手机系统能力
- 拍照、选图、语音、位置等
-
使用微信特有能力
- 微信分享、扫一扫、卡券、支付等
-
-
步骤
-
绑定域名
- 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
-
引入JS文件
- 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js
- 如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)
-
通过config接口注入权限验证配置
- 所有需要使用JS-SDK的页面必须先注入配置信息
-
通过ready接口处理成功验证
- config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
-
通过error接口处理失败验证
- config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
-
-
接口调用说明
- 所有接口通过wx对象(也可使用jWeixin对象)来调用
- success:接口调用成功时执行的回调函数。
- fail:接口调用失败时执行的回调函数。
- complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
- cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
- trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。
-
基础接口
-
wx.checkJsApi
- 判断当前客户端版本是否支持指定JS接口
-
-
分享接口
-
wx.updateAppMessageShareData
- 自定义“分享给朋友”及“分享到QQ”按钮的分享内容
-
updateTimelineShareData
- 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容
-
原有的 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,即将废弃。
-
-
图像接口
-
wx.chooseImage
- 拍照或从手机相册中选图接口
-
wx.previewImage
- 预览图片接口
-
wx.uploadImage
- 上传图片接口
- 备注:上传图片有效期3天,可用微信多媒体接口下载图片到自己的服务器,此处获得的 serverId 即 media_id。
-
wx.downloadImage
- 下载图片接口
-
wx.getLocalImgData
- 获取本地图片接口
- 备注:此接口仅在 iOS WKWebview 下提供,用于兼容 iOS WKWebview 不支持 localId 直接显示图片的问题。具体可参考《iOS WKWebview网页开发适配指南》
-
-
音频接口
-
wx.startRecord()
- 开始录音接口
-
wx.stopRecord
- 停止录音接口
-
wx.onVoiceRecordEnd
- 监听录音自动停止接口
-
wx.playVoice
- 播放语音接口
-
wx.pauseVoice
- 暂停播放接口
-
wx.stopVoice
- 停止播放接口
-
wx.onVoicePlayEnd
- 监听语音播放完毕接口
-
wx.uploadVoice
- 上传语音接口
-
wx.downloadVoice
- 下载语音接口
-
-
智能接口
-
wx.translateVoice
- 识别音频并返回识别结果接口
-
-
设备信息
-
wx.getNetworkType
- 获取网络状态接口
-
-
地理位置
-
wx.openLocation
- 使用微信内置地图查看位置接口
-
wx.getLocation
- 获取地理位置接口
-
-
摇一摇周边
-
wx.startSearchBeacons
- 开启查找周边ibeacon设备接口
-
备注:如需接入摇一摇周边功能,请参考:申请开通摇一摇周边
-
wx.stopSearchBeacons
- 关闭查找周边ibeacon设备接口
-
wx.onSearchBeacons
- 监听周边ibeacon设备接口
-
-
界面操作
-
wx.closeWindow()
- 关闭当前网页窗口接口
-
wx.hideMenuItems
- 批量隐藏功能按钮接口
- 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
-
wx.showMenuItems
- 批量显示功能按钮接口
-
wx.hideAllNonBaseMenuItem
- 隐藏所有非基础按钮接口
-
wx.showAllNonBaseMenuItem
- 显示所有功能按钮接口
-
-
微信扫一扫
-
wx.scanQRCode
- 调起微信扫一扫接口
-
-
微信小店
-
wx.openProductSpecificView
- 跳转微信商品页接口
-
-
微信卡券
-
获取api_ticket
- 用于调用微信卡券JS API的临时票据,有效期为7200 秒,通过access_token 来获取。
-
拉取适用卡券列表并获取用户选择信息
- wx.chooseCard
-
批量添加卡券接口
- wx.addCard
-
查看微信卡包中的卡券接口
- wx.openCard
-
-
微信支付
-
wx.chooseWXPay
- 发起一个微信支付请求
- prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,签名格式要求以微信支付文档为准
-
native支付
- https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_0.shtml
-
-
快速输入
-
wx.openAddress
- 共享收货地址接口
-
开放标签
XMind - Trial Version