公司新需求实现生成微信公众号带参数二维码和对应扫码后回复相应信息的功能。

1.实现带参数二维码功能

public class QrTest {private static Logger logger = LogManager.getLogger(QrTest.class);private final static String subPlatform              = "prod1";private final static String appid              = "111111111111111111111";private final static String secret                 = "";//access_token 获取接口private final static String WECHAT_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;public static void main(String[] args) {try {String access_token = QrTest.getAccessToken(subPlatform);String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+access_token;JsonObject data = new JsonObject();//data.addProperty("action_name", "QR_LIMIT_STR_SCENE");data.addProperty("action_name", "QR_SCENE");data.addProperty("expire_seconds", "604800");JsonObject scene = new JsonObject();//scene.addProperty("scene_str", "123&&456");scene.addProperty("scene_id", "123&&456");JsonObject actionInfo = new JsonObject();actionInfo.add("scene", scene);data.add("action_info", actionInfo);logger.error(data.toString());String result = HttpConnectionUtil.AccessUrl(url,data.toString());QrCodeReceiveData jsonToJavaBean = JsonUtil.jsonToJavaBean(result, QrCodeReceiveData.class);if(jsonToJavaBean != null) {logger.error(jsonToJavaBean.getUrl());}logger.error(result);/*} catch (OAuthException e) {logger.debug(e.getMessage());*/}catch (Exception e) {}}/*** 获取access_token* @return* @throws OAuthException*/private static String getAccessToken(String subPlatform) throws OAuthException{String access_token = null;if(subPlatform != null && !subPlatform.equals("")){String tokenUrl = "http://www.baidu.com";logger.debug("getAccess_token tokenUrl:" + tokenUrl);access_token = HttpConnectionUtil.AccessUrlGet(tokenUrl);logger.debug("getAccess_token access_token:" + access_token);}else{access_token = QrTest.getAccessToken();}return access_token;}private static String getAccessToken() {String access_token = null;try{logger.debug("getAccessToken i(ss):" );//获取access_tokenString accessTokenURL = HttpConnectionUtil.AccessUrlGet(WECHAT_URL);logger.debug("new accessTokenResult URL :"+accessTokenURL);if(accessTokenURL != null && !accessTokenURL.equals("")){AccessToken accessToken = (AccessToken) JsonUtil.JsonToObject(accessTokenURL, AccessToken.class);if(accessToken != null){access_token = accessToken.getAccess_token();;logger.debug("new_access_token============:"+access_token);}else{logger.error("accessTokenResult error:"+accessToken);}}}catch(Exception e){logger.error("getAccessToken Exception:" + e);}return access_token;}
}

接收参数实体类

public class QrCodeReceiveData {private String ticket;private int expire_seconds;private String url;public String getTicket() {return ticket;}public void setTicket(String ticket) {this.ticket = ticket;}public int getExpire_seconds() {return expire_seconds;}public void setExpire_seconds(int expire_seconds) {this.expire_seconds = expire_seconds;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}}

说明:以上代码可以实现带参数二维码url获取,这里我只需要url链接,我们的项目会保存该链接,根据链接生成对应的二维码,方便重复使用。该段代码是获取临时二维码,若要获取永久二维码,更改相应参数即可,但需要控制生成数量目前为最多10万个。

2.被动回复消息

被动回复消息需要开通开发者模式

首先需要完善以上信息,同时需要开发接口进行验证

 @RequestMapping("/testServlet")public String verifyWXToken(HttpServletRequest request) throws AesException {logger.error("进入验证servlet!!!!!");String msgSignature = request.getParameter("signature");String msgTimestamp = request.getParameter("timestamp");String msgNonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");if (WXPublicUtils.verifyUrl(msgSignature, msgTimestamp, msgNonce)) {return echostr;}return null;}

以上代码即可完成验证。

验证通过后,将代码中的内容注释掉即可。节逻辑改为下面的逻辑

@RequestMapping("/testServlet")@ResponseBodypublic String handlePublicMsg(HttpServletRequest request) throws Exception {logger.error("进入推送消息方法");// 获得微信端返回的xml数据InputStream is = null;InputStreamReader isr = null;BufferedReader br = null;try {is = request.getInputStream();isr = new InputStreamReader(is, "utf-8");br = new BufferedReader(isr);String str = null;StringBuffer returnXml= new StringBuffer();while ((str = br.readLine()) != null) {//返回的是xml数据returnXml.append(str);}Map<String, String> encryptMap = VatifyToken.xmlToMap(returnXml.toString());logger.error(encryptMap.toString());// 得到公众号传来的加密信息并解密,得到的是明文xml数据//String decryptXml = WXPublicUtils.decrypt(encryptMap.get("Encrypt"));// 将xml数据转换为map/*logger.error(decryptXml.toString());Map<String, String> decryptMap = VatifyToken.xmlToMap(decryptXml.toString());*/Map<String, String> decryptMap = encryptMap;// 区分消息类型String msgType = decryptMap.get("MsgType");//场景信息String eventKey = decryptMap.get("EventKey");// 普通消息if ("text".equals(msgType)) { // 文本消息// todo 处理文本消息} else if ("image".equals(msgType)) { // 图片消息// todo 处理图片消息} else if ("voice".equals(msgType)) { //语音消息// todo 处理语音消息} else if ("video".equals(msgType)) { // 视频消息// todo 处理视频消息} else if ("shortvideo".equals(msgType)) { // 小视频消息// todo 处理小视频消息} else if ("location".equals(msgType)) { // 地理位置消息// todo 处理地理位置消息} else if ("link".equals(msgType)) { // 链接消息// todo 处理链接消息}// 事件推送else if ("event".equals(msgType)) { // 事件消息// 区分事件推送String event = decryptMap.get("Event");logger.error("区分事件推送:"+event);if ("subscribe".equals(event)) { // 订阅事件 或 未关注扫描二维码事件String mapToXml = getReturnMessage2(decryptMap,eventKey);logger.error("发送数据:"+mapToXml);return mapToXml;}  else if ("unsubscribe".equals(event)) { // 取消订阅事件// todo 处理取消订阅事件} else if ("SCAN".equals(event)) { // 已关注扫描二维码事件String mapToXml = getReturnMessage1(decryptMap,eventKey);logger.error("发送数据:"+mapToXml);return mapToXml;} else if ("LOCATION".equals(event)) { // 上报地理位置事件// todo 处理上报地理位置事件} else if ("CLICK".equals(event)) { // 点击菜单拉取消息时的事件推送事件// todo 处理点击菜单拉取消息时的事件推送事件} else if ("VIEW".equals(event)) { // 点击菜单跳转链接时的事件推送// todo 处理点击菜单跳转链接时的事件推送}}} catch (Exception e) {logger.error("处理微信公众号请求信息,失败", e);} finally {if (null != is) {is.close();}if (null != isr) {isr.close();}if (null != br) {br.close();}   }return null;}
public String getReturnMessage1(Map<String, String> decryptMap,String eventKey) throws Exception {logger.error("decryptMap:"+decryptMap.toString());logger.error("eventKey:"+eventKey);if(eventKey!= null && !"".equals(eventKey)) {if("123".equals(eventKey)) {TextMessage textMessage = new TextMessage();textMessage.setToUserName(decryptMap.get("FromUserName"));textMessage.setFromUserName(decryptMap.get("ToUserName"));textMessage.setCreateTime(new Date().getTime());textMessage.setMsgType("text");textMessage.setContent("http://xxx/wechat/homePage");logger.error(textMessage.toString());String returnMap = getXmlString1(textMessage);logger.error(returnMap);return returnMap;} else if("456".equals(eventKey)) {Article article1 = new Article(); article1.setDescription("试卷描述1");article1.setPicUrl("http://xxx//res//prod//SSEP/uploadfiles/knowledgeCourseImage/2020729407976775.png");article1.setTitle("图文标题1");article1.setUrl("http://xxx/wechat/paperInfo?id=1904201517405234&productId=1904201517405234");Article article2 = new Article(); article2.setDescription("试卷描述2");article2.setPicUrl("http://xxx//res//prod//SSEP/uploadfiles/knowledgeCourseImage/2020347456563018.png");article2.setTitle("图文标题2");article2.setUrl("http://xxx/wechat/paperInfo?id=1901141911032222&productId=1901141911032222");List<Article> list = new ArrayList<>();list.add(article1);list.add(article2);NewsMessage newMessage =  new NewsMessage();newMessage.setArticleCount(4);newMessage.setCreateTime(new Date().getTime());newMessage.setFromUserName(decryptMap.get("ToUserName"));newMessage.setToUserName(decryptMap.get("FromUserName"));newMessage.setMsgType("news");newMessage.setArticles(list);newMessage.setFuncFlag(1);String returnMap = getXmlString2(newMessage);logger.error(returnMap);return returnMap;} else {}}return null;}

说明:

public String getXmlString2(NewsMessage newMessage) {String xml = "";if(newMessage != null) {List<Article> articles = newMessage.getArticles();xml = "<xml>";xml += "<ToUserName><![CDATA[";xml += newMessage.getToUserName();xml += "]]></ToUserName>";xml += "<FromUserName><![CDATA[";xml += newMessage.getFromUserName();xml += "]]></FromUserName>";xml += "<CreateTime>";xml += newMessage.getCreateTime();xml += "</CreateTime>";xml += "<MsgType><![CDATA[";xml += newMessage.getMsgType();xml += "]]></MsgType>";xml += "<ArticleCount>";xml += newMessage.getArticleCount();xml += "</ArticleCount>";xml += "<Articles>";for (Article article : articles) {xml += "<item>";xml += "<Title><![CDATA[";xml += article.getTitle();xml += "]]></Title>";xml +=  "<Description><![CDATA[";xml += article.getDescription();xml += "]]></Description>";xml +=  "<PicUrl><![CDATA[";xml += article.getPicUrl();xml += "]]></PicUrl>";xml +=   "<Url><![CDATA[";xml += article.getUrl();xml += "]]></Url>";xml += "</item>";}xml += "</Articles>";xml += "</xml>";}return xml;}

说明:以上缺少类型自己可以进行封装,但注意,发送文本消息和图文消息要特别注意,文本消息不需要更换发送者和接受者的信息,但图文消息需要调换才可正常发送,同事关注和未关注的decryptMap.get(“EventKey”)的值是有区别的,要注意改地方。同时,若有多个公众调用同一接口,可根据接收到的ToUserName进行区分。

结果:

该文章是在参考Gene Xu博主的两篇文章后进行的一次功能开发,和总结。

特别感谢Gene Xu博主:https://blog.csdn.net/Goodbye_Youth

参考链接:https://blog.csdn.net/Goodbye_Youth/article/details/80653132

JAVA 实现微信公众号的生成带参数二维码和扫码后被动回复消息相关推荐

  1. 微信公众号之生成带参数的二维码

    生成带参数的二维码 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送.目前有2 ...

  2. 微信订阅号渠道推广带参数二维码如何生成和统计呢?

    2019独角兽企业重金招聘Python工程师标准>>> 微信公众号订阅号渠道推广带参数二维码,公众号功能接口不支持订阅号生成 带参数二维码,只有服务号才可以,订阅号只能通过服务号转接 ...

  3. 微信公众号怎么生成带参数的二维码?

    每位运营过微信公众平台的野生小编都知道,微信提供给开发者的文档是很高深的,最近为了弄个带参数的二维码,同样技术小白的小编也死了不少脑细胞了,然而我终于知道官方生成带参数的二维码的方法了. 1.注意事项 ...

  4. 微信公众号开发----生成带参数的临时二维码

    本文只提供代码实现,具体参数含义请先仔细阅读微信公众号技术文档之生成带参数的二维码 临时二维码请求说明: 一.常量类 public class WechartConst {//生成带参数的二维码pub ...

  5. 基于OpenJWeb平台的微信服务号开发培训-生成带参数二维码

    因为OpenJWeb平台已经集成了微信服务号接口,所以在OpenJWeb平台上开发微信服务号会起到事半功倍的作用.本文介绍如何使用微信公众号接口生成带参数二维码功能. 下面是开发及操作过程: (1)首 ...

  6. 微信公众号怎么生成带粉丝关注统计的渠道二维码

    关于微信公众号在线生成带粉丝关注统计的渠道二维码,第三方工具微号帮提供了渠道二维码生成功能实现,可以为公众号生成带粉丝关注统计的渠道二维码,可以生成多个不同的渠道二维码,每个渠道二维码都可以单独统计粉 ...

  7. 实例:用C#.NET手把手教你做微信公众号开发(11)--生成带参数二维码

    上一篇讲了普通关注的各种情景,接下来准备详细讲解带参数的二维码的应用实例.在下一篇详解之前,这里先介绍一下如何下载二维码.生成二维码表,为后续的应用做好准备. 为了满足用户渠道推广分析和用户帐号绑定等 ...

  8. 微信公众号 订阅号 生成带参数二维码

    1.公众号的任意一篇文章页链接 例如: http://mp.weixin.qq.com/s?__biz=MjM5NzAwNzMwMQ==&mid=2655787844&idx=3&am ...

  9. 微信公众平台开发(83) 生成带参数二维码

    本文介绍在微信公众平台上如何使用高级接口开发生成带参数二维码的功能. 一.场景二维码 为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码, ...

最新文章

  1. 活动报名 | MIT陈涛:如何让机器人学习高频接触的操作技能
  2. 8月18日 | 智能车竞赛云比赛过半,华南赛区成绩小结
  3. 【翻译】《理解收益率曲线》系列
  4. java自学手记——继承
  5. Oracle配置方面问题收集
  6. 实施工程师常用linux命令,009Linux管理日常使用的基本命令
  7. 化工原理知识点总结复习重点
  8. 仅输入单张图片,就能“看”出物体材质!这篇图形学论文已被SIGGRAPH 2021收录...
  9. Python读取excel文件可读取xlsx格式和xls格式可直接读取超链接,读出为字典格式(列表套字典),处理合并单元格的问题
  10. 最新版chrome 70浏览器同步、清除Cookie设置将更改
  11. 316. 去除重复字母
  12. 下载Windows10纯净官方镜像
  13. nod32 lic 99用户授权文件可以用到2015年4月的许可证下载
  14. 淘宝奇门接口的签名方法
  15. vue做音乐播放器完整功能
  16. Unity中国象棋(二)——走棋
  17. UFO-ViT:没有Softmax的高性能线性视觉Transformer
  18. Flutter学习指南:UI布局和控件,作为Android开发者
  19. edg击败we视频_超神圣枪无情屠杀 EDG击败WE全取三分
  20. java多线程 isAlive方法的有趣现象

热门文章

  1. VMware12+Ubuntu16.04 安装 以及全屏的实现
  2. sql server增量备份mysql_sqlserver增量备份 指令
  3. 使用简单CSS操作SVG图标
  4. 可汗学院风格电子板书攻略:Wacom+ArtRage
  5. feof函数重读问题
  6. 数字雕刻软件哪个好?ZBrush 2021推荐给大家
  7. 算法-基于成交量的Adaboost股价涨跌预测模型
  8. SBAS 电离层修正中的双线性插值方法
  9. Charles 和 ProxyDroid 抓取Websocket
  10. 科目二考试项目和操作要求