最近老板下发了个任务,有一个业务是整合用户的微信公众号(服务号),然后在我们的erp系统里给下家客户发送模板消息,找了一下发现微信第三方平台可以实现,那就干起来。

先在微信开放平台,申请一个第三方平台服务。
然后通过下面几步实现消息推送

1 、微信验证接口,拿到 ticket
2 、拿到调用令牌 component_access_token
3 、获取预授权码 pre_auth_code
4 、扫码授权,获取授权码 auth_code
5 、通过授权码拿到调用令牌(authorizer_access_token)和刷新令牌(authorizer_refresh_token)
6 、通过 authorizer_access_token 实现消息推送

1、验证接口代码

@RequestMapping("getTicket")public String componentVerifyTicket(HttpServletRequest request, HttpServletResponse response) throws Exception{log.info("接收component_verify_ticket 或 authorized事件");String nonce = request.getParameter("nonce");String timestamp = request.getParameter("timestamp");String msgSignature = request.getParameter("msg_signature");StringBuilder sb = new StringBuilder();BufferedReader in = request.getReader();String line;while((line = in.readLine()) != null) {sb.append(line);}String postData = sb.toString();log.info("nonce: " + nonce);log.info("timestamp: " + timestamp);log.info("msgSignature: " + msgSignature);log.info("postData: " + postData);getComponentVerifyTicket(timestamp, nonce, msgSignature, postData);return "success";}
public static void getComponentVerifyTicket(String timestamp, String nonce, String msgSignature, String postData) throws Exception {// 需要加密的明文// COMPONENT_TOKEN  token// aesKey   加密密钥WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, aesKey, appId);DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);dbf.setXIncludeAware(false);dbf.setExpandEntityReferences(false);DocumentBuilder db = dbf.newDocumentBuilder();StringReader sr = new StringReader(postData);InputSource is = new InputSource(sr);Document document = db.parse(is);Element root = document.getDocumentElement();NodeList nodelist1 = root.getElementsByTagName("Encrypt");String encrypt = nodelist1.item(0).getTextContent();String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";String fromXML = String.format(format, encrypt);String result = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);log.info("解密后: " + result);Map<String, String> map = XMLUtil.doXMLParse(result);String componentVerifyTicket = map.get("ComponentVerifyTicket");System.out.println("获取ticket====="+componentVerifyTicket);}

XMLUtil

/*** 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。** @param strxml* @return* @throws JDOMException* @throws IOException*/public static Map doXMLParse(String strxml) throws JDOMException, IOException {strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");if (null == strxml || "".equals(strxml)) {return null;}Map m = new HashMap();InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));SAXBuilder builder = new SAXBuilder();Document doc = builder.build(in);Element root = doc.getRootElement();List list = root.getChildren();Iterator it = list.iterator();while (it.hasNext()) {Element e = (Element) it.next();String k = e.getName();String v = "";List children = e.getChildren();if (children.isEmpty()) {v = e.getTextNormalize();} else {v = XMLUtil.getChildrenText(children);}m.put(k, v);}//关闭流in.close();return m;}/*** 获取子结点的xml** @param children* @return String*/public static String getChildrenText(List children) {StringBuffer sb = new StringBuffer();if (!children.isEmpty()) {Iterator it = children.iterator();while (it.hasNext()) {Element e = (Element) it.next();String name = e.getName();String value = e.getTextNormalize();List list = e.getChildren();sb.append("<" + name + ">");if (!list.isEmpty()) {sb.append(XMLUtil.getChildrenText(list));}sb.append(value);sb.append("</" + name + ">");}}return sb.toString();}

2、拿到调用令牌 component_access_token

微信文档链接:
https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/ticket-token/getComponentAccessToken.html

通过上一步拿到的ticket,传入第三方的appid和appsecret ,调用微信接口获取第三方的调用令牌:
component_access_tokenhttps://api.weixin.qq.com/cgi-bin/component/api_component_token{"component_appid":  "*****" , //  第三方平台appid"component_appsecret":  "*****",  //  密钥"component_verify_ticket":""}

3、拿到component_access_token后再次调用接口获取预授权码

微信文档:
https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/ticket-token/getPreAuthCode.html


ACCESS_TOKEN: 就是上一步获取到的component_access_tokenhttps://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?access_token=ACCESS_TOKEN{"component_appid": "wxe7986597a6b2a7e4"}

4、通过预授权码生成链接,管理员扫码后授权获取授权码

将上一步获取到的预授权吗填入下面:
https://mp.weixin.qq.com/cgi-bin/componentloginpage?
component_appid=wxe7986597a6b2a7e4
&pre_auth_code=preauthcode@@@IbLBSSV_2LkGjtZKk8aPCFc4JI2Wzzawfj6tse60aktFdrTD1oP_nWNULntkhPjHKvp3Ae1GnL4sReu_7A2zjA
&redirect_uri=http://ys99.top/bed/wx/getAuthCode

component_appid:第三方平台的appid
pre_auth_code:上一步拿到的预授权码
redirect_uri:授权后重定向地址,接口里拿到正式的授权码 queryauthcode

然后通过a链接打开就可以了

5、通过授权码获取第三方公众号的授权令牌 authorizer_access_token

https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=******{"component_appid":"wxe7986597a6b2a7e4","authorization_code":"queryauthcode@@@qCsx1osdrsQRn7LoiLVOIz3Ut273KrqYJlT9cdbQS3lCupjsPvFcaAbaT3zHG2EDhCgJ3dUw94gbgrOOTFhl_g"
}

6、通过上一步获取到了公众号的调用令牌authorizer_access_token

后续的公众号所有操作都使用这个令牌

https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=
66_Ew0rFnSUMD56EEsZBk8aVTteynjtjojSliKpAIvBd8AR750VvN0O3puNI2srbPAIlkesBainkEBJTT4dRQWVQbxf2wuFB_om-mgJ-AXxZ26gJKjIAdPpNIQzkUOX9x8TJllWGBqU2Fr7oR16OCNaAHDAOZ

access_token:就是上一步获取到的调用令牌
touser:用户在微信公众号的openid
template_id:在公众号的消息模板id

微信第三方平台集成公众号发送模板消息相关推荐

  1. php之微信公众号发送模板消息

    讲一下开发项目中微信公众号发送模板消息的实现过程(我用的还是Thinkphp5.0).先看一下效果,如图: 就是类似于这样的,下面讲一下实现过程: 第一步:微信公众号申请模板消息权限: 立即申请: 申 ...

  2. springboot微信公众号发送模板消息

    springboot微信公众号发送模板消息 1.准备工作 申请你所需要模板 配置ip白名单(你所需要部署的服务器ip) 2.编写模板消息的请求参数封装类 import java.util.HashMa ...

  3. php 微信模板消息url,【求助】php 微信公众号 发送模板消息改变不了颜色

    php 微信公众号 发送模板消息改变不了颜色 不知道为什么 1.模板消息内容: 2.发送的模板消息效果: 序列化的模板消息内容如下: 大家可以测试下,touser需要另外添加下 a:4:{s:11:& ...

  4. 微信公众号 发送模板消息和获取关注公众号人数

    微信公众号发送模板消息 1.创建模板,拿到模板ID 2.创建发送消息工具类 import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JS ...

  5. 公众号发送模板消息40165错误

    今天在做公众号发送模板消息的功能的时候报了一个错误"errcode":40165,"errmsg":"invalid weapp pagepath h ...

  6. 微信开放平台(第三方平台)代替微信公众号发送模板消息(基于lavarel框架开发,EasyWeChat)

    1.公众号必须得把模板消息授权到第三方平台. 2.我用的是 EasyWeChat 3.通过接口修改账号所属行业 (实质上就是开通模板消息) //修改账号所属行业public function set_ ...

  7. 使用微信公众号发送模板消息

    使用微信公众号 API 本文所有内容均使用微信公众号测试号平台来演示 打开公众平台的测试号管理页面后我们可以在页面中看到测试号的信息 图中的 appId 和 appSecret 就是我们需要用到的 图 ...

  8. .Net Core 3.1实现微信公众号发送模板消息,且跳转微信小程序

    .Net Core 3.1开发微信相关 背景 微信公众号和小程序关联 微信小程序获取UnionId及OpenId 微信公众号获取UnionId及OpenId 背景 公司需要将内部产品的审批放到微信小程 ...

  9. 微信公众号 java发送消息_微信公众号发送模板消息 Java实现。

    本博文是测试公众号调用模板接口测试.请不要完全复制我的代码.里面的测试代码中有本人测试号的微信模板id.麻烦替换成自己的可以吗? 第一步:创建模板信息 第二步:准备模板代码实体类用到的属性自行加入就行 ...

最新文章

  1. 由浅入深解读Redis高级能力及性能调优
  2. Oracle 11g必须开启的服务及服务详细介绍
  3. Python Matplotlib.pyplot 中文显示异常的简单解决方法
  4. BZOJ2888 : 资源运输
  5. 区块链即数字生产关系
  6. HTML设置允许冒泡,html css hover也会冒泡
  7. OneNand、Nand和Nor三种Flash的区别
  8. 容器安全 - 利用特权模式运行的容器,实现容器逃逸和入侵
  9. 大数据应用的优势在哪
  10. Linux使用yum安装JDK
  11. 按顺序发起多次请求的loading使用
  12. Introduction to Computer Networking学习笔记(十四):网络中为什么使用packet switching
  13. android 毫秒值转换时分秒],毫秒数转换成天时分秒、时分秒
  14. html css js php是否区分大小写 总结
  15. android 设置文本加粗,如何在Android中将文本更改为粗体?
  16. “有点笨”的数学大师迈克尔·弗里德曼
  17. IBM服务器修改时间为24小时制,联想携IBM为用户提供24小时全天候技术支持
  18. JavaScript设计模式——工厂模式
  19. 【计算机组成原理】计算机组成原理——概述篇
  20. 浙大计算机各个实验室 详细介绍(持续更新)

热门文章

  1. 视图view基本概念
  2. 程序员Mac 电脑必备软件
  3. 分享76个ASP新闻文章源码,总有一款适合您
  4. CE6 驱动: 你不得不知道的事情
  5. 设计模式 | 挑战策略模式
  6. 啃Docker之必备基础管理操作
  7. 讨论:何同学画的这个PCB有啥问题?
  8. java multiply_Java.math.BigInteger.multiply()方法实例
  9. 基金经理评比及明星基金经理介绍
  10. 解义盼:12月21日BTC、ETH行情走势分析策略