动态消息介绍
小程序的转发功能是一个重要的小程序入口,也是小程序运营中的一个重要引流方式。用户可以使用转发功能将小程序页面转发给好友或者微信群,其他用户可以点击转发的小程序卡片快速进入小程序。虽然小程序的转发是非常好用的运营工具,但是转发出来的小程序卡片是固定不变的,难以满足一些需要显示用户参与情况的需求。比如拼团功能、抽奖功能。为了满足这些需求,小程序从基础库2.4.0开始,支持转发动态消息。动态消息对比普通消息,有以下特点:
- 动态信息可以查看“人数变化情况”和“已开始”两种状态
- 消息发出去之后,开发者可以通过后台接口修改部分消息内容。
- 消息有对应的提醒按钮,用户点击提醒按钮可以订阅提醒,开发者可以通过后台修改消息状态并推送一次提醒消息给订阅了提醒的用户
动态消息的应用场景:
- 小程序动态消息能力比较适用于互动小程序,比如说拼团功能、抽奖功能、群应用以及小游戏等。
- 小程序动态消息的场景可以用于运营活动,主要用于分销,拉满多少人给多少奖励。但是目前只支持24小时以内的分享的小程序卡片。
动态消息使用说明
获取后台接口调用凭据:access_token
发送动态消息时需要调用updatableMessage.createActivityId接口创建一个活动,调用updatableMessage.createActivityId接口时需要传入:access_token。
开发者调用auth.getAccessToken接口来获取access_token。auth.getAccessToken接口的请求地址为:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
其中:
- appid:小程序AppID,可在【微信公众平台】-【设置】-【开发设置】页中获得。
- secret:小程序证密钥,获取方式同 appid。
调用auth.getAccessToken接口来获取access_token的代码如下:
type WxApiTokenReturn struct {
ErrCode int64 `json:"errcode"`
ErrMsg string `json:"errmsg"`
AccessToken string `json:"access_token"`
ExpiresIn int64 `json:"expires_in"`
}
func GetWxTokenFromWx(appid string, secret string) (string, error) {
wx_api_url := "https://api.weixin.qq.com/cgi-bin/token"
wx_api_url = fmt.Sprintf("%s?grant_type=client_credential&appid=%s&secret=%s", wx_api_url, appid, secret)
resp, err := http.Get(wx_api_url)
if err != nil {
return "", err
}
defer resp.Body.Close()
ret_user, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
var ent WxApiTokenReturn
if err := json.Unmarshal(ret_user, &ent); err != nil {
return "", err
}
return ent.AccessToken, nil
}
创建activity_id
每条动态消息可以理解为一个活动,活动发起前需要通过updatableMessage.createActivityId接口创建activity_id。后续转发动态消息以及更新动态消息都需要传入这个activity_id。
活动的默认有效期是24小时。updatableMessage.createActivityId接口的请求地址为:
https://api.weixin.qq.com/cgi-bin/message/wxopen/activityid/create?access_token=ACCESS_TOKEN&openid=openid
其中:
- access_token:调用auth.getAccessToken接口返回的后台接口调用凭据
- openid:分享者的openid
调用updatableMessage.createActivityId接口创建activity_id的代码如下:
type CreateActivityRet struct {
WxApiRet
//动态消息的 ID
ActivityId string `json:"activity_id"`
//activity_id 的过期时间戳。默认24小时后过期。
ExpirationTime int64 `json:"expiration_time"`
}
func CreateActivity(access_token string, userid string, is_unionid bool) (CreateActivityRet, error) {
wx_addr := "https://api.weixin.qq.com/cgi-bin/message/wxopen/activityid/create"
wx_addr += "?access_token=" +access_token
if is_unionid {
wx_addr += "&unionid=" + userid
} else {
wx_addr += "&openid=" + userid
}
var ret CreateActivityRet
res, err := WxApiGet(wx_addr)
if err != nil {
return ret, err
}
err = json.Unmarshal(res, &ret)
if err != nil {
return ret, err
}
return ret, nil
}
声明消息类型为动态消息
通过调用wx.updateShareMenu 接口,传入isUpdatableMessage: true,以及 templateInfo、activityId 参数。
wx.updateShareMenu({
withShareTicket: true,
isUpdatableMessage: true,
activityId: '调用接口用updatableMessage.createActivityId接口创建的activity_id',
targetState: 0,
templateInfo: {
parameterList: [{
name: 'member_count',
value: '1'
}, {
name: 'room_limit',
value: '3'
}]
}
})
说明:
- 动态消息有两个状态: 0 和 1,
0表示未开始状态,小程序卡片显示:“成员正在加入,当前 {member_count}/{room_limit} 人”,
1表示“已开始”状态,
状态 0 可以转移到状态 0 和 1,状态 1 无法再转移。 - targetState: 0时templateInfo的参数如下:
member_count: 文字内容模板中 member_count 的值。
room_limit:文字内容模板中 room_limit 的值。
需要注意的是,这里的数值为字符格式,不能是整数格式
实现onShareAppMessage
在页面的js文件中定义了onShareAppMessage 函数时,表示页面可以转发,小程序右上角的菜单中会有转发按钮:
onShareAppMessage: function () {
return {
title: '分享标题',
desc: '分享页面的内容',
path: '/pages/share_recv?code=123'
}
}
其中:
- title:转发标题,默认是小程序的名称。
- path:小程序页面的路径,默认是当前页面,必须是以‘/'开头的完整路径。
- imageUrl:自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径,支持PNG及JPG,不传入imageUrl则使用默认截图。
修改动态消息内容
动态消息发出去之后,可以通过updatableMessage.setUpdatableMsg修改消息内容。
updatableMessage.setUpdatableMsg接口的请求地址:
https://api.weixin.qq.com/cgi-bin/message/wxopen/updatablemsg/send?access_token=ACCESS_TOKEN
updatableMessage.setUpdatableMsg接口的请求参数
- access_token: 后台接口调用凭证(通过auth.getAccessToken接口获取)
- activity_id :动态消息的 ID(通过updatableMessage.createActivityId接口获取)
- target_stat:动态消息修改后的状态(0或1)
- template_info:动态消息对应的模板信息
template_info的结构
- member_count:target_state = 0 时必填,对应文字内容模板中 member_count 的值
- room_limit:target_state = 0 时必填,对应文字内容模板中 room_limit 的值
- path:target_state = 1 时必填,点击「进入」启动小程序时使用的路径。
- version_type:target_state = 1 时必填,点击「进入」启动小程序时使用的版本。有效参数值为:develop(开发版),trial(体验版),release(正式版)
updatableMessage.setUpdatableMsg接口的调用代码:
type TemplValue struct {
Name string `json:"name"`
Value string `json:"value"`
}
type TemplInfo struct {
//模板中需要修改的参数
Items []TemplValue `json:"parameter_list"`
}
type UpdateActivityReq struct {
//动态消息的 ID
ActivityId string `json:"activity_id"`
//动态消息修改后的状态: 0 未开始 1已开始
TargetState int `json:"target_state"`
//动态消息对应的模板信息
TemplInfo TemplInfo `json:"template_info"`
}
func UpdateActivity(access_token string, param UpdateActivityReq) error {
wx_addr := "https://api.weixin.qq.com/cgi-bin/message/wxopen/updatablemsg/send"
wx_addr += "?access_token=" +access_token
var ret WxApiRet
res, err := WxApiPostStruct(wx_addr, param)
if err != nil {
return err
}
err = json.Unmarshal(res, &ret)
if err != nil {
return err
}
if ret.ErrCode == 0 {
return nil
} else {
return errors.New(ret.ErrMsg)
}
}