微信公众号开发(消息推送)

文章目录

  • 微信公众号开发
    • 运行效果
    • 微信公众号简介
    • 注册微信公众号
    • 注册测试公众号
    • 搭建微信本地调试环境
    • 微信公众号接入(校验签名)
    • 给指定用户推送消息
      • 网页授权获取用户openid
      • 给指定用户发送模板信息

微信公众号开发

代码地址

运行效果

在这里插入图片描述

微信公众号简介

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

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

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

注册微信公众号

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

注册测试公众号

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

http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

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

img

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

image.png

image.png

搭建微信本地调试环境

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

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

natapp成功标志
在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

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

@Controller
@RequestMapping(value = "wx")
public class WeiController{/*** 公众号appid*/@Value("${wx.appid}")private  String appid;/*** 公众号appSecret*/@Value("${wx.secret}")private  String secret;/*** 微信消息接收和token验证* @param request* @param response* @throws IOException*/@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";/*** 验证签名* @param signature* @param timestamp* @param nonce* @return*/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;}/*** 十六进制字节数组转为字符串* @param hash* @return*/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,如下图所示:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPMvNxRI-1608702695943)(typora-user-images\image-20201214105001081.png)]

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

给指定用户推送消息

网页授权获取用户openid

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

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

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

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

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

获取用户openId步骤:

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

  • 2、通过code换取openId

代码如下:

@Controller
@RequestMapping(value = "wx")
public class WeiController{private  String appid="微信公众号的appid";private  String secret="微信公众号的secret";/*** 获取微信用户code,并重定向获取用户openId* @return*/@GetMapping("/getUserCode")public String  getUserCode(){String backUrl = "http://xt77eg.natappfree.cc/wx/getUserOpenId";String getOpenIdUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+ backUrl+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";getOpenIdUrl = getOpenIdUrl.replace("APPID",appid);return "redirect:" + getOpenIdUrl;}/*** 获取用户openId* @return* @throws IOException*/@GetMapping("/getUserOpenId")@ResponseBodypublic  String getUserOpenId()throws IOException{//获取codeString code = request.getParameter("code");//换取用户openidString url="https://api.weixin.qq.com/sns/oauth2/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;}

给指定用户发送模板信息

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtE1NG6h-1608702695950)(typora-user-images\image-20201214111214457.png)]

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{@ResourcePushMessageService pushMessageService;/*** 向每个用户推送消息* @return*/@GetMapping("/sendMessage")@ResponseBodypublic String sendMessage(){String openId =  "用户openId";if(!"".equals(openId)){AlarmParamsDTO dto = new AlarmParamsDTO("申请进度", "国家奖学金", "申请通过", time, "成功");dto.setOpenId(openId);pushMessageService.pushMessage(dto);}return "success";}

Service:

@Service
@Slf4j
public class PushMessageServiceImpl implements PushMessageService{private  String appid="微信公众号appid";private  String secret="微信公众号secret";/*** 给微信公众号某个用户推送信息* @param alarmParamsDTO*/@Overridepublic 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
@AllArgsConstructor
public class AlarmParamsDTO {/*** 推送信息小标题*/private String first;/*** 学生姓名*/private String keyword1;/*** 申请资助类型*/private String keyword2;/*** 申请状态*/private String keyword3;/*** 申请结果*/private String remark;/*** 用户微信openId,唯一标识*/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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58986.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【监听微信公众号消息】

监听微信公众号消息 效果图如下&#xff1a;环境要求 效果图如下&#xff1a; 环境要求 需要windows服务器&#xff0c;登陆上微信。获取到的消息是xml格式&#xff0c;需要解析内容获取自己想要的公众号推送的消息。 详情&#xff1a;https://learnku.com/articles/73022

手把手教你如何获取微信公众号用户的个人信息(包括OpenId)

最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识别,地理位置等等,都挺好的。好了,不多说,进入正题好了。 我…

关于微信公众号模板消息的调整,你怎么看?

早上起来&#xff0c;有客户反馈&#xff0c;推送的消息出现了问题。 经过测试&#xff0c;确实收到的消息和以前不一样了。 这就比较奇怪了&#xff0c;最近也没有做什么调整&#xff0c;为啥忽然就出问题了呢。 先自己检测测试了一下&#xff0c;发现发送的内容中的头尾部…

免费“白嫖” GPT-4 方法 +1,飙升 GitHub 热榜第二!开发者锐评:跟“偷”有什么区别?

前不久&#xff0c;可“白嫖” GPT-4 的 Forefront Chat 吸引了众多关注&#xff0c;导致该网站一度崩溃&#xff0c;也令不少人发出疑问&#xff1a;“GPT-4 这么贵&#xff0c;为什么它能免费让我们用&#xff1f;” 关于这个问题&#xff0c;Forefront Chat 方面并未做出相…

sipiiiii: 面向小微企业和个人开发者的简单易用应用托管平台

在当前数字化时代&#xff0c;越来越多的企业和个人都需要依赖云端服务来托管他们的应用程序。然而&#xff0c;很多传统的云服务商过于复杂或昂贵&#xff0c;这让小微企业和个人开发者难以忍受。为了满足这些用户的需求&#xff0c;我们推出了 sipiiiii&#xff0c;一个简单易…

云数据库技术沙龙|多云多源下的数据复制技术解读-NineData

摘要&#xff1a;随着数据智能时代的到来&#xff0c;多云多源架构下的数据管理是企业必备的基础设施&#xff0c;我们认为数据存取、数据集成与分发、数据安全与数据质量是基础&#xff0c;也是走向多云多源架构的起点。本议题介绍云原生的多云多源数据管理NineData&#xff0…

论文阅读《Representation learning with contrastive predictive coding 》(CPC)对比预测编码

论文地址&#xff1a;Representation Learning with Contrastive Predictive Coding 目录 一、Background&#xff08;背景&#xff09; 二、Motivation and Intuitions&#xff08;动机&#xff09; 三、Constrastive Predictive Coding&#xff08;对比预测编码&#xff…

论文阅读和分析: “How Attentive are Graph Attention Networks?”

下面所有博客是个人对EEG脑电的探索&#xff0c;项目代码是早期版本不完整&#xff0c;需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上)&#xff1a;研究数据集选取和介绍SEED 相关论文阅读分析&#xff1a; 1、EEG-SEED数据集作者的—基线论文阅读和…

论文阅读和分析:Graph Attention Networks

Graph Attention Networks 图注意力网络&#xff08;GAT&#xff09; 通过堆叠节点能够关注其邻域特征的层&#xff0c;能够&#xff08;隐式地&#xff09;为邻域中的不同节点指定不同的权重&#xff0c;而不需要任何类型的代价高昂的矩阵运算&#xff08;例如矩阵转置&…

chatgpt赋能python:Python实现屏蔽多行的方法

Python 实现屏蔽多行的方法 作为一位有10年 Python 编程经验的工程师&#xff0c;我深知在实际开发过程中&#xff0c;屏蔽多行代码常常是必须的。在此&#xff0c;我将介绍几种 Python 屏蔽多行代码的方法&#xff0c;希望对读者有所帮助。 方法一&#xff1a;使用注释 在 …

chatgpt赋能python:Python圆柱体的体积计算代码

Python圆柱体的体积计算代码 作为一名具有10年Python编程经验的工程师&#xff0c;今天我来为大家分享Python圆柱体的体积计算代码。在这篇文章中&#xff0c;我将介绍如何使用Python编写一个简单的程序来计算圆柱体的体积&#xff0c;并解释一些关于圆柱体及如何计算其体积的…

让ChatGTP来为我们写一个计算任意位数圆周率的程序

最近在学习python&#xff0c;突然想编写一个计算圆周率pi的程序&#xff0c;可是对python库不是很熟悉&#xff0c;又不会手撸pi的计算函数所以就想起了ChatGPT&#xff0c;想让他来帮帮忙&#xff0c;顺便学习学习&#xff0c;废话不多说&#xff0c;看聊效&#xff01; &am…

chatgpt赋能python:Python编程教程:如何计算小数点后1000位

Python编程教程&#xff1a;如何计算小数点后1000位 Python是一种高级编程语言&#xff0c;被广泛应用于数据科学、人工智能、Web开发等领域。今天我们来学习如何使用Python计算小数点后1000位。 为什么需要计算小数点后1000位&#xff1f; 在实际应用中&#xff0c;有时需要…

chatgpt赋能python:Python求面积计算的实现方法

Python求面积计算的实现方法 介绍 Python是一种高级编程语言&#xff0c;由于其简单易学&#xff0c;易于编写和调试&#xff0c;以及广泛的功能库&#xff0c;使其成为许多领域中的流行语言。 Python被广泛用于科学计算&#xff0c;数据分析&#xff0c;Web开发&#xff0c;…

chatgpt赋能python:Python计算圆柱体的表面积和体积

Python计算圆柱体的表面积和体积 Python是一种经典的动态编程语言&#xff0c;由于其易学易用&#xff0c;逐渐成为了众多程序员喜爱的语言之一。Python在科学计算领域也非常流行&#xff0c;因为其具有强大且易于使用的数学和统计函数库。在本文中&#xff0c;我们将介绍如何…

chatgpt赋能python:Python数学计算利器-Math库

Python数学计算利器 - Math库 Python作为一种高级编程语言&#xff0c;自然也包含了许多与数学计算相关的库。而其中最为常用的库之一便是Math库。 Math库主要用于执行基本的数学运算&#xff0c;如三角函数、指数函数、对数函数等等。使用Math库可以使Python编程更加方便和高…

chatgpt赋能python:Python计算圆柱侧面积的方法

Python计算圆柱侧面积的方法 圆柱是常见的几何体之一&#xff0c;其侧面积的计算是学习数学和物理时的重要部分。在计算侧面积时&#xff0c;Python是一种常用的编程语言之一&#xff0c;本文将向您介绍使用Python计算圆柱侧面积的方法。 圆柱侧面积的定义 圆柱侧面积是指圆…

chatgpt赋能python:Python如何计算圆的面积和体积

Python如何计算圆的面积和体积 在工程和科学领域中&#xff0c;经常需要计算圆形物体的面积和体积。Python是一种流行的编程语言&#xff0c;可以使用它来编写计算圆形物体面积和体积的程序。接下来&#xff0c;让我们深入探讨如何使用Python计算圆形物体的面积和体积。 圆形…

chatgpt赋能python:Python计算圆的面积方法

Python计算圆的面积方法 作为一门非常受欢迎的编程语言&#xff0c;Python已经被广泛应用于各个领域。在数学计算方面&#xff0c;通过Python可以快速准确地计算一系列的数学问题&#xff0c;比如计算圆的面积。本文将介绍Python计算圆面积的方法。 什么是圆的面积&#xff1…

chatgpt赋能python:Python计算圆面积方法教程

Python计算圆面积方法教程 你是否想过如何用Python计算圆面积&#xff1f;圆形是一个基本的几何形状&#xff0c;计算圆的面积是一个必要的技能。Python作为一种流行的编程语言&#xff0c;可以帮助我们更轻松地计算圆的面积。本教程将介绍如何使用Python计算圆的面积。 什么…