我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android微信公众号开发消息推送功能怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android微信公众号开发消息推送功能怎么实现

这篇文章主要讲解了“Android微信公众号开发消息推送功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android微信公众号开发消息推送功能怎么实现”吧!

微信公众号简介

微信公众号分为服务号、订阅号、企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以。

我们所说的微信公众号开发指的是订阅号和服务号。关于订阅号和服务器的区别,官方是这样解释的

  • 服务号:主要偏向于服务交互(功能类似12315,114,银行,提供绑定信息,服务交互),每月可群发4条消息;服务号**适用人群:媒体、企业、政府或其他组织。

  • 订阅号:主要偏向于为用户传达资讯,(功能类似报纸杂志,为用户提供新闻信息或娱乐趣事),每天可群发1条消息;订阅号**适用人群:个人、媒体、企业、政府或其他组织。

注册微信公众号

进入微信公众号注册页面https://mp.weixin.qq.com/点击公众号右上方的注册按钮,进入注册界面,填写基本信息,选择订阅号, 完成身份认证, 即可。

注册测试公众号

个人订阅号有一些接口是没有权限的,也就是说个人订阅号无法调用一些高级的权限接口,如生成二维码、网页授权、自定义菜单、微信支付这样的接口权限个人订阅号是没有调用权限的, 幸运的是,微信公众平台提供了测试公众账号,测试公众号有很多个人订阅号不具备的权限

用微信扫描页面中的二维码进行登录,登录成功后,就可以看到腾讯分配给我们的测试公众号的信息了,如下图所示, 接下来我们就可以搭建环境,进行开发测试了

Android微信公众号开发消息推送功能怎么实现

测试公众号的所拥有的接口权限如下:

Android微信公众号开发消息推送功能怎么实现

Android微信公众号开发消息推送功能怎么实现

搭建微信本地调试环境

开发基于微信公众号的应用最大的痛苦之处就是调试问题,每次实现一个功能后都需要部署到一个公网服务器进行测试,因为微信用户每次向公众号发起请求时,微信服务器会先接收到用户的请求,然后再转发到我们的服务器上,也就是说,微信服务器是要和我们的服务器进行网络交互,所以我们必须保证我们的服务器外网可以访问到,这种部署到公网服务器进行测试的做法对于我们开发者来说简直是噩梦。所以我们要想一个办法可以做到本地部署,本地调试代码,而要做到这一点,那么我们要解决的问题就是将内网的部署服务器映射到外网,让微信服务器可以正常访问到,幸运的是,借助于第三方软件Ngrok,我们就可以做得到。Ngrok是一个免费的软件Ngrok,使用Ngrok后,我们就可以实现内网穿透,也就是说我们可以将内网的服务器映射到外网给别人访问,这对于我们在本地开发环境中调试微信代码是以及给用户演示一些东西非常快速和有帮助的,因为可以直接使用我们自己的内网的电脑作为服务器。不过需要翻墙访问.常用的内网穿透工具有natapp,ngrok,dingding,关于微信公众号开发,这三个工具我都使用了,只有natapp可以正常开发。

关于natapp的使用网上很多,我在这里就不在介绍了。

natapp成功标志

Android微信公众号开发消息推送功能怎么实现

可以通过访问http://xt77eg.natappfree.cc访问到我们本机的服务

微信公众号接入(校验签名)

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

Android微信公众号开发消息推送功能怎么实现

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

@Controller@RequestMapping(value = "wx")public class WeiController{        @Value("${wx.appid}")    private  String appid;        @Value("${wx.secret}")    private  String secret;        @GetMapping("/weChatToken")    public  void weChat(HttpServletRequest request, HttpServletResponse response) {        boolean isGet = request.getMethod().toLowerCase().equals("get");        if (isGet) {            // 微信加密签名            String signature = request.getParameter("signature");            // 时间戳            String timestamp = request.getParameter("timestamp");            // 随机数            String nonce = request.getParameter("nonce");            // 随机字符串            String echostr = request.getParameter("echostr");            // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败            if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {                try {                    PrintWriter print = response.getWriter();                    print.write(echostr);                    print.flush();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}
public class CheckoutUtil {    public static  String token  = "999";        public static boolean checkSignature(String signature, String timestamp, String nonce) {        String[] arr = new String[] { token, timestamp, nonce };        // 将token、timestamp、nonce三个参数进行字典序排序        Arrays.sort(arr);        StringBuilder content = new StringBuilder();        for (int i = 0; i < arr.length; i++) {            content.append(arr[i]);        }        MessageDigest md = null;        String tmpStr = null;        try {            md = MessageDigest.getInstance("SHA-1");            // 将三个参数字符串拼接成一个字符串进行sha1加密            byte[] digest = md.digest(content.toString().getBytes());            tmpStr = byteToHex(digest );        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信        return tmpStr != null ? tmpStr.equals(signature) : false;    }            private static String byteToHex(final byte[] hash) {        Formatter formatter = new Formatter();        for (byte b : hash) {            formatter.format("%02x", b);        }        String result = formatter.toString();        formatter.close();        return result;    }

进入微信测试公众号管理界面,在接口配置信息中填入映射的外网地址和代码中声明的token,如下图所示:

点击提交,会显示配置成功,如下图:

Android微信公众号开发消息推送功能怎么实现

到此,我们的公众号应用已经能够和微信服务器正常通信了,也就是说我们的公众号已经接入到微信公众平台了。

给指定用户推送消息

网页授权获取用户openid

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息(openId),进而实现业务逻辑。

关于网页授权回调域名的说明:

在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;

授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth3.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com 无法进行OAuth3.0鉴权

如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可

获取用户openId步骤:

引导用户进入授权页面同意授权,获取code

通过code换取openId

代码如下:

@Controller@RequestMapping(value = "wx")public class WeiController{    private  String appid="微信公众号的appid";    private  String secret="微信公众号的secret";        @GetMapping("/getUserCode")    public String  getUserCode(){        String backUrl = "http://xt77eg.natappfree.cc/wx/getUserOpenId";        String getOpenIdUrl = "https://open.weixin.qq.com/connect/oauth3/authorize?appid=APPID&redirect_uri="+ backUrl+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";        getOpenIdUrl = getOpenIdUrl.replace("APPID",appid);        return "redirect:" + getOpenIdUrl;    }        @GetMapping("/getUserOpenId")    @ResponseBody    public  String getUserOpenId()throws IOException{        //获取code        String code = request.getParameter("code");        //换取用户openid        String url="https://api.weixin.qq.com/sns/oauth3/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";        url=url.replace("APPID", appid).replace("SECRET", secret).replace("CODE", code);        JSONObject result = Util.doGetJson(url);        JSONObject jSONObject = JSONObject.parseObject(String.valueOf(result));        String openid = jSONObject.getString("openid");        return openid;    }
给指定用户发送模板信息

首先要准备一个模板,测试号可自定义模板,但在正式公众号我们要申请,或者使用别人已经申请过的模板。

Android微信公众号开发消息推送功能怎么实现

pom:

 <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!--微信模版消息推送三方sdk-->        <dependency>            <groupId>com.github.binarywang</groupId>            <artifactId>weixin-java-mp</artifactId>            <version>3.3.0</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.18.8</version>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.2.58</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-test</artifactId>            <version>2.1.8.RELEASE</version>            <scope>test</scope>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <scope>test</scope>        </dependency>

Controller:

@Controller@RequestMapping(value = "wx")public class WeiController{    @Resource    PushMessageService pushMessageService;        @GetMapping("/sendMessage")    @ResponseBody    public String sendMessage(){        String openId =  "用户openId";        if(!"".equals(openId)){            AlarmParamsDTO dto = new AlarmParamsDTO("申请进度", "国家奖学金", "申请通过", time, "成功");            dto.setOpenId(openId);            pushMessageService.pushMessage(dto);        }        return "success";    }

Service:

@Service@Slf4jpublic class PushMessageServiceImpl implements PushMessageService{    private  String appid="微信公众号appid";    private  String secret="微信公众号secret";        @Override    public void pushMessage(AlarmParamsDTO alarmParamsDTO) {        //1,配置        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();        wxStorage.setAppId(appid);        wxStorage.setSecret(secret);        WxMpService wxMpService = new WxMpServiceImpl();        wxMpService.setWxMpConfigStorage(wxStorage);        List<WxMpTemplateData> wxMpTemplateData = Arrays.asList(                new WxMpTemplateData("first",alarmParamsDTO.getFirst(),"#000000"),                new WxMpTemplateData("keyword1",alarmParamsDTO.getKeyword1(),"#000080"),                new WxMpTemplateData("keyword2",alarmParamsDTO.getKeyword2(),"#0000FF"),                new WxMpTemplateData("keyword3",alarmParamsDTO.getKeyword3(),"#FFD700"),                new WxMpTemplateData("remark",alarmParamsDTO.getRemark(),"#00FF00")        );        //2,推送消息        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()                .toUser(alarmParamsDTO.getOpenId())                .templateId("tIDrdFcqFGMsTnc462H49_DbjgXUuIjsqIlQttq7VDE")                .data(wxMpTemplateData)                .url("http://www.baidu.com")                .build();        try {            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);        } catch (Exception e) {            System.out.println("推送失败:" + e.getMessage());        }    }}

entity:

@Setter@Getter@NoArgsConstructor@AllArgsConstructorpublic class AlarmParamsDTO {        private String first;        private String keyword1;        private String keyword2;        private String keyword3;        private String remark;        private String openId;    public AlarmParamsDTO(String first, String keyword1, String keyword2, String keyword3, String remark) {        this.first = first;        this.keyword1 = keyword1;        this.keyword2 = keyword2;        this.keyword3 = keyword3;        this.remark = remark;    }}

感谢各位的阅读,以上就是“Android微信公众号开发消息推送功能怎么实现”的内容了,经过本文的学习后,相信大家对Android微信公众号开发消息推送功能怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android微信公众号开发消息推送功能怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android微信公众号开发消息推送功能怎么实现

这篇文章主要讲解了“Android微信公众号开发消息推送功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android微信公众号开发消息推送功能怎么实现”吧!微信公众号简介微信公众
2023-07-05

微信公众号开发消息推送功能

微信公众号分为服务号、订阅号、企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以,这篇文章主要介绍了微信公众号开发消息推送功能,需要的朋友可以参考下
2023-02-15

Java怎么实现微信公众号发送模版消息

这篇文章主要介绍Java怎么实现微信公众号发送模版消息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信公众号发送模版消息 背景:如下图,当用户发布需求的时候,公众号自定推送消息。例如:微信支付的时候,公众号会推送支
2023-06-29

SpringBoot如何实现发送邮件、发送微信公众号推送功能

这篇文章主要介绍了SpringBoot如何实现发送邮件、发送微信公众号推送功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SpringBoot实现发送邮件 &em
2023-06-29

如何用PHP开发微信公众号的推送功能

如何用PHP开发微信公众号的推送功能,需要具体代码示例微信公众号已经成为了现代社会中非常重要的一种社交媒体平台,许多企业、组织和个人都在微信公众号上展示自己的品牌和内容。在公众号中,推送功能是非常重要的一项功能,可以将最新的资讯、活动和优惠
如何用PHP开发微信公众号的推送功能
2023-10-28

PHP开发微信公众号:如何实现文章推荐功能

PHP开发微信公众号:如何实现文章推荐功能,需要具体代码示例随着移动互联网的发展,微信公众号正逐渐成为企业和个人传播信息的重要平台。为了增加用户体验和吸引更多用户,微信公众号的文章推荐功能成为了不可或缺的一部分。本文将介绍如何使用PHP开发
2023-10-26

怎么用vbs实现微信自动发送消息功能

这篇文章主要介绍了怎么用vbs实现微信自动发送消息功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用vbs实现微信自动发送消息功能文章都会有所收获,下面我们一起来看看吧。1、微信自动回复消息微信,作为日前
2023-06-30

Android第三方消息推送功能怎么实现

要实现Android第三方消息推送功能,可以使用以下步骤:注册一个第三方消息推送平台,例如Firebase Cloud Messaging (FCM)、JPush、推送宝等,获得一个唯一的应用标识和密钥。在Android应用的build.g
2023-10-25

微信公众平台开发中使用Java如何实现一个消息回复功能

本篇文章给大家分享的是有关微信公众平台开发中使用Java如何实现一个消息回复功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。(一)回复文本消息在前面我们已经完成了对消息的分类
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录