微信一次性订阅消息

原创 2017年07月27日 21:23:00

一次性订阅消息官方文档:消息管理>发送一次性订阅消息

开发者可以通过一次性订阅消息授权让微信用户授权第三方移动应用接入说明)或公众号,获得发送一次订阅消息给到授权微信用户的机会。授权微信用户可以不需要关注公众号。微信用户每授权一次,开发者可获得一次下发消息的权限。对于已关注公众号的,消息将下发到公众号会话;未关注公众号的,将下发到服务通知

本篇文章主要讨论公众号

1、确认是否有权限

已认证的公众号即有权限,可登陆公众平台在接口权限列表处查看(如下图)。目前测试号还无法测试一次性订阅消息

一次性订阅消息-查看模板ID

2、配置相关的参数

  • 查看AppId以及AppSecret (发送一次性订阅消息需要ACCESS_TOKEN、获取ACCESS_TOKEN需要使用到)
  • 配置回调域名

image.png

设置授权域名-1

设置授权域名-2

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请求方式: post
https://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_url
2、发送一次性订阅消息提示没有权限(认证的服务号)

{"errcode":48001,"errmsg":"api unauthorized hint: [uAi6Za0855sz10!]"}

猜测:应该是官方接口存在问题

推荐阅读
10分钟搭建属于自己的ngork服务器,实现内网穿透
极速开发微信公众号
IJPay让支付触手可及
微信、支付宝App支付

版权声明:本文为博主原创文章,欢迎转载,转载标明出处(http://blog.csdn.net/zyw_java)。微信公众号:javenlife

微信公众平台新增“一次性订阅消息”接口

恩威科技&天府云创&融合创新7月25日消息 今天凌晨,微信公众平台为开发者们带来了全新的功能——新增“一次性订阅消息”接口,根据微信官方介绍,公众平台现开放一次性订阅消息接口将更方便开发者与微信用户之...

zabbix系列(九)zabbix3.0实现自动触发zabbix-agent端shell脚本任务

zabbix实现自动触发远程脚本执行命令 Zabbix触发器(trigger)达到阀值后会有动作(action)执行:发送告警信息或执行远程命令 环境 Server:基于centos6.5 fi...

app直接跳转至微信公众号

微信沟通接口正式上线        用户可以在移动应用中,点击跳转到微信客户端内,进入公众号的会话界面或者资料页(用户已关注公众号时会进入会话界面,未关注则进入资料页),让用户更方便地关注公众号,与...

微信公众号"发送一次性订阅消息"接口的使用

微信发送一次性订阅消息的使用

PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制

2013年10月06日最新整理。 PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能...

微信订阅返回消息

Step1:微信公众号成功接入后台之后就可以进行收发消息了,每次都是POST方式 Step2:首先处理订阅消息                Tips1:消息类型是event--->subscribe...

微信公众号开发(十二):推送消息处理器之订阅事件处理器、菜单点击处理器、二维码扫描事件处理器、位置事件处理器、取消订阅事件处理器

public class SubscribleEventHandler extends DefaultMessageHandler {     @Override     public boo...

微信为什么不丢消息

  • 2017年03月01日 17:55
  • 87KB
  • 下载

微信开发系列(五)_消息,事件的处理

本博将从项目的建立开始 首先建立一个web项目 然后导入相应的包(不一定是全的,看具体的项目要求)...
  • XuTen
  • XuTen
  • 2016年03月08日 20:55
  • 3023
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微信一次性订阅消息
举报原因:
原因补充:

(最多只允许输入30个字)