微信一次性订阅消息
2017-08-12 12:07
381 查看
1、确认是否有权限
已认证的公众号即有权限,可登陆公众平台在接口权限列表处查看(如下图)。目前测试号还无法测试一次性订阅消息
2、配置相关的参数
查看AppId以及AppSecret (发送一次性订阅消息需要ACCESS_TOKEN、获取ACCESS_TOKEN需要使用到)配置回调域名
3、授权发送一次性订阅消息
具体的参数看文档这里就不详细介绍了。public static String getAuthorizeURL(String appId, String scene, String template_id,String redirectUri, String reserved) throws UnsupportedEncodingException { StringBuffer sbf = new StringBuffer(); sbf.append(authorize_uri).append("&appid=").append(appId) .append("&scene=").append(scene) .append("&template_id=").append(template_id) .append("&redirect_uri=").append(URLEncoder.encode(redirectUri, Charsets.UTF_8.name()).replace("+", "%20")); if (StrKit.notBlank(reserved)) { sbf.append("&reserved=").append(reserved); } sbf.append("#wechat_redirect"); return sbf.toString(); }
用户同意或取消授权后会返回相关信息
如果用户点击同意或取消授权,页面将跳转至:
redirect_url/?openid=OPENID&template_id=TEMPLATE_ID&action=ACTION&scene=SCENE
4、通过API推送订阅模板消息给到授权微信用户
http请求方式: posthttps://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN
{ "touser": "OPENID", "template_id": "TEMPLATE_ID", "url": "URL", "scene": "SCENE", "title": "TITLE", "data": { "content": { "value": "VALUE", "color": "COLOR" } } }
具体封装代码如下:
/** * 发送一次性订阅消息 * * @param jsonStr * json字符串 * @return ApiResult * */ public static ApiResult subscribe(String jsonStr) { String jsonResult = HttpUtils.post(subscribe + AccessTokenApi.getAccessTokenStr(), jsonStr); return new ApiResult(jsonResult); } public static ApiResult subscribe(SubscribeInfo subscribeInfo) { return new ApiResult(JsonKit.toJson(subscribeInfo)); } public static ApiResult subscribe(String openId, String templateId, String url, int scene, String title, String value, String color) { SubscribeInfo subscribeInfo = new SubscribeInfo.Builder() .setTouser(openId).setTemplate_id(templateId).setUrl(url) .setScene(String.valueOf(scene)).setTitle(title) .setData(new Data.Builder() .setContent(new Content.Builder() .setColor(color).setValue(value) .create()) .create()) .create(); System.out.println(JsonUtils.toJson(subscribeInfo)); return subscribe(JsonUtils.toJson(subscribeInfo)); }
Builder模式构建请求参数的json对象
class SubscribeInfo { private String touser; private String template_id; private String url; private String scene; private String title; private Data data; public static class Builder{ private String touser; private String template_id; private String url; private String scene; private String title; private Data data; public Builder setTouser(String touser) { this.touser = touser; return this; } public Builder setTemplate_id(String template_id) { this.template_id = template_id; return this; } public Builder setUrl(String url) { this.url = url; return this; } public Builder setScene(String scene) { this.scene = scene; return this; } public Builder setTitle(String title) { this.title = title; return this; } public Builder setData(Data data) { this.data = data; return this; } public SubscribeInfo create(){ return new SubscribeInfo(this); } } private SubscribeInfo(Builder builder) { if (StrKit.isBlank(builder.touser)) { throw new IllegalStateException("touser is null"); } if (StrKit.isBlank(builder.template_id)) { throw new IllegalStateException("template_id is null"); } if (StrKit.isBlank(builder.url)) { throw new IllegalStateException("url is null"); } if (StrKit.isBlank(builder.scene)) { throw new IllegalStateException("scene is null"); } if (StrKit.isBlank(builder.title)) { throw new IllegalStateException("title is null"); } if (!StrKit.notNull(builder.data)) { throw new IllegalStateException("data is null"); } this.touser = builder.touser; this.template_id = builder.template_id; this.url = builder.url; this.scene = builder.scene; this.title = builder.title; this.data = builder.data; } public String getTouser() { return touser; } public String getTemplate_id() { return template_id; } public String getUrl() { return url; } public String getScene() { return scene; } public String getTitle() { return title; } public Data getData() { return data; } } class Data { private Content content; public static class Builder { private Content content; public Builder setContent(Content content) { this.content = content; return this; } public Data create(){ return new Data(this); } } private Data(Builder builder) { if (!StrKit.notNull(builder.content)) { throw new IllegalStateException("content is null"); } this.content = builder.content; } public Content getContent() { return content; } } class Content { private String value; private String color; public static class Builder{ private String value; private String color; public Builder setValue(String value) { this.value = value; return this; } public Builder setColor(String color) { this.color = color; return this; } public Content create(){ return new Content(this); } } private Content(Builder builder) { if (StrKit.isBlank(builder.value)) { throw new IllegalStateException("value is null"); } if (StrKit.isBlank(builder.color)) { throw new IllegalStateException("color is null"); } this.value = builder.value; this.color = builder.color; } public String getValue() { return value; } public String getColor() { return color; } }
5、遗留问题
1、授权后页面跳转无效redirect_url2、发送一次性订阅消息提示没有权限(认证的服务号)
{"errcode":48001,"errmsg":"api unauthorized hint: [uAi6Za0855sz10!]"}
猜测:应该是官方接口存在问题
相关文章推荐
- 关于android 微信一次性订阅消息 接入 问题
- 微信的一次性订阅消息
- PHP语言编写的微信一次性订阅消息
- 微信一次性订阅消息
- 微信一次性订阅消息
- 微信一次性订阅消息
- 关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
- 微信订阅返回消息
- 微信公众平台新增“一次性订阅消息”接口
- PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制
- 如何查看微信公众号的历史文章(微信订阅号查看历史消息)
- 微信订阅号消息回复测试
- 啊Ran讲微信开发(.net) :订阅号+自定义服务器(消息,关注事件)
- 微信订阅号开发(基于weixin-api自动回复消息)
- 微信订阅号的关注和消息推送中的观察者模式
- 微信公众号一次性订阅消息
- 消息称微信订阅号将进行改造:以信息流模式呈现,内容更直观
- PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制
- 关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
- 微信公众号"发送一次性订阅消息"接口的使用