微信公众账号第三方平台全网发布源码(java)- 实战测试通过

(更多资料,关注论坛:www.jeecg.org)

技术交流请加:289709451、287090836


package org.jeecgframework.web.rest.controller;import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.jeecgframework.core.util.LogUtil;
import org.jeecgframework.core.util.ResourceUtil;
import org.jeecgframework.core.util.oConvertUtils;
import org.jeecgframework.web.system.service.SystemService;
import org.jeewx.api.core.exception.WexinReqException;
import org.jeewx.api.mp.aes.AesException;
import org.jeewx.api.mp.aes.WXBizMsgCrypt;
import org.jeewx.api.third.JwThirdAPI;
import org.jeewx.api.third.model.ApiComponentToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import weixin.open.entity.base.WeixinOpenAccountEntity;/*** 微信公众账号第三方平台全网发布源码(java)* @author: jeewx开源社区* @网址:www.jeewx.com* @论坛:www.jeecg.org* @date 20150801*/
@Controller
@RequestMapping("/openwx")
public class OpenwxController {private final String APPID = "???";/*** 微信全网测试账号*/private final static String COMPONENT_APPID = "???";private final String COMPONENT_APPSECRET = "???";private final static String COMPONENT_ENCODINGAESKEY = "?????";private final static String COMPONENT_TOKEN = "?????";@Autowiredprivate SystemService systemService;/*** 授权事件接收* * @param request* @param response* @throws IOException* @throws AesException* @throws DocumentException*/@RequestMapping(value = "/event/authorize")public void acceptAuthorizeEvent(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {
//       LogUtil.info("微信第三方平台---------微信推送Ticket消息10分钟一次-----------"+ DataUtils.getDataString(DataUtils.yyyymmddhhmmss));processAuthorizeEvent(request);output(response, "success"); // 输出响应的内容。}@RequestMapping(value = "/authorCallback")public void authorCallback(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {String auth_code = request.getParameter("auth_code");String expires_in = request.getParameter("auth_code");}/*** 一键授权功能* @param request* @param response* @throws IOException* @throws AesException* @throws DocumentException*/@RequestMapping(value = "/goAuthor")public void goAuthor(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {ApiComponentToken apiComponentToken = new ApiComponentToken();apiComponentToken.setComponent_appid(COMPONENT_APPID);apiComponentToken.setComponent_appsecret(COMPONENT_APPSECRET);WeixinOpenAccountEntity  entity = getWeixinOpenAccount(APPID);apiComponentToken.setComponent_verify_ticket(entity.getTicket());try {String component_access_token = JwThirdAPI.getAccessToken(apiComponentToken);//预授权码String preAuthCode = JwThirdAPI.getPreAuthCode(COMPONENT_APPID, component_access_token);String url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid="+COMPONENT_APPID+"&pre_auth_code="+preAuthCode+"&redirect_uri="+ResourceUtil.getConfigByName("domain")+"/rest/openwx/authorCallback";response.sendRedirect(url);} catch (WexinReqException e) {e.printStackTrace();}}@RequestMapping(value = "{appid}/callback")public void acceptMessageAndEvent(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {String msgSignature = request.getParameter("msg_signature");//LogUtil.info("第三方平台全网发布-------------{appid}/callback-----------验证开始。。。。msg_signature="+msgSignature);if (!StringUtils.isNotBlank(msgSignature))return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息StringBuilder sb = new StringBuilder();BufferedReader in = request.getReader();String line;while ((line = in.readLine()) != null) {sb.append(line);}in.close();String xml = sb.toString();Document doc = DocumentHelper.parseText(xml);Element rootElt = doc.getRootElement();String toUserName = rootElt.elementText("ToUserName");//微信全网测试账号
//        if (StringUtils.equalsIgnoreCase(toUserName, APPID)) {
//           LogUtil.info("全网发布接入检测消息反馈开始---------------APPID="+ APPID +"------------------------toUserName="+toUserName);checkWeixinAllNetworkCheck(request,response,xml);
//        }}/*** 处理授权事件的推送* * @param request* @throws IOException* @throws AesException* @throws DocumentException*/public void processAuthorizeEvent(HttpServletRequest request) throws IOException, DocumentException, AesException {String nonce = request.getParameter("nonce");String timestamp = request.getParameter("timestamp");String signature = request.getParameter("signature");String msgSignature = request.getParameter("msg_signature");if (!StringUtils.isNotBlank(msgSignature))return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息boolean isValid = checkSignature(COMPONENT_TOKEN, signature, timestamp, nonce);if (isValid) {StringBuilder sb = new StringBuilder();BufferedReader in = request.getReader();String line;while ((line = in.readLine()) != null) {sb.append(line);}String xml = sb.toString();
//            LogUtil.info("第三方平台全网发布-----------------------原始 Xml="+xml);String encodingAesKey = COMPONENT_ENCODINGAESKEY;// 第三方平台组件加密密钥String appId = getAuthorizerAppidFromXml(xml);// 此时加密的xml数据中ToUserName是非加密的,解析xml获取即可//LogUtil.info("第三方平台全网发布-------------appid----------getAuthorizerAppidFromXml(xml)-----------appId="+appId);WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, encodingAesKey, COMPONENT_APPID);xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml);
//            LogUtil.info("第三方平台全网发布-----------------------解密后 Xml="+xml);processAuthorizationEvent(xml);}}/*** 保存Ticket* @param xml*/void processAuthorizationEvent(String xml){Document doc;try {doc = DocumentHelper.parseText(xml);Element rootElt = doc.getRootElement();String ticket = rootElt.elementText("ComponentVerifyTicket");if(oConvertUtils.isNotEmpty(ticket)){LogUtil.info("8、推送component_verify_ticket协议-----------ticket = "+ticket);WeixinOpenAccountEntity  entity = getWeixinOpenAccount(APPID);entity = entity==null?new WeixinOpenAccountEntity():entity;entity.setTicket(ticket);entity.setAppid(APPID);entity.setGetTicketTime(new Date());systemService.saveOrUpdate(entity);}} catch (DocumentException e) {e.printStackTrace();}}/*** 获取授权账号信息* @param appid* @return*/WeixinOpenAccountEntity getWeixinOpenAccount(String appid){WeixinOpenAccountEntity  entity = null;List<WeixinOpenAccountEntity> ls = systemService.findByProperty(WeixinOpenAccountEntity.class, "appid", appid);if(ls!=null && ls.size()!=0){entity = ls.get(0);}return entity;}/*** 获取授权的Appid* @param xml* @return*/String getAuthorizerAppidFromXml(String xml) {Document doc;try {doc = DocumentHelper.parseText(xml);Element rootElt = doc.getRootElement();String toUserName = rootElt.elementText("ToUserName");return toUserName;} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public void checkWeixinAllNetworkCheck(HttpServletRequest request, HttpServletResponse response,String xml) throws DocumentException, IOException, AesException{String nonce = request.getParameter("nonce");String timestamp = request.getParameter("timestamp");String msgSignature = request.getParameter("msg_signature");WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, COMPONENT_ENCODINGAESKEY, COMPONENT_APPID);xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml);Document doc = DocumentHelper.parseText(xml);Element rootElt = doc.getRootElement();String msgType = rootElt.elementText("MsgType");String toUserName = rootElt.elementText("ToUserName");String fromUserName = rootElt.elementText("FromUserName");//        LogUtil.info("---全网发布接入检测--step.1-----------msgType="+msgType+"-----------------toUserName="+toUserName+"-----------------fromUserName="+fromUserName);
//        LogUtil.info("---全网发布接入检测--step.2-----------xml="+xml);if("event".equals(msgType)){
//           LogUtil.info("---全网发布接入检测--step.3-----------事件消息--------");String event = rootElt.elementText("Event");replyEventMessage(request,response,event,toUserName,fromUserName);}else if("text".equals(msgType)){
//           LogUtil.info("---全网发布接入检测--step.3-----------文本消息--------");String content = rootElt.elementText("Content");processTextMessage(request,response,content,toUserName,fromUserName);}}public void replyEventMessage(HttpServletRequest request, HttpServletResponse response, String event, String toUserName, String fromUserName) throws DocumentException, IOException {String content = event + "from_callback";
//        LogUtil.info("---全网发布接入检测------step.4-------事件回复消息  content="+content + "   toUserName="+toUserName+"   fromUserName="+fromUserName);replyTextMessage(request,response,content,toUserName,fromUserName);}public void processTextMessage(HttpServletRequest request, HttpServletResponse response,String content,String toUserName, String fromUserName) throws IOException, DocumentException{if("TESTCOMPONENT_MSG_TYPE_TEXT".equals(content)){String returnContent = content+"_callback";replyTextMessage(request,response,returnContent,toUserName,fromUserName);}else if(StringUtils.startsWithIgnoreCase(content, "QUERY_AUTH_CODE")){output(response, "");//接下来客服API再回复一次消息replyApiTextMessage(request,response,content.split(":")[1],fromUserName);}}public void replyApiTextMessage(HttpServletRequest request, HttpServletResponse response, String auth_code, String fromUserName) throws DocumentException, IOException {String authorization_code = auth_code;// 得到微信授权成功的消息后,应该立刻进行处理!!相关信息只会在首次授权的时候推送过来System.out.println("------step.1----使用客服消息接口回复粉丝----逻辑开始-------------------------");try {ApiComponentToken apiComponentToken = new ApiComponentToken();apiComponentToken.setComponent_appid(COMPONENT_APPID);apiComponentToken.setComponent_appsecret(COMPONENT_APPSECRET);WeixinOpenAccountEntity  entity = getWeixinOpenAccount(APPID);apiComponentToken.setComponent_verify_ticket(entity.getTicket());String component_access_token = JwThirdAPI.getAccessToken(apiComponentToken);System.out.println("------step.2----使用客服消息接口回复粉丝------- component_access_token = "+component_access_token + "---------authorization_code = "+authorization_code);net.sf.json.JSONObject authorizationInfoJson = JwThirdAPI.getApiQueryAuthInfo(COMPONENT_APPID, authorization_code, component_access_token);System.out.println("------step.3----使用客服消息接口回复粉丝-------------- 获取authorizationInfoJson = "+authorizationInfoJson);net.sf.json.JSONObject infoJson = authorizationInfoJson.getJSONObject("authorization_info");String authorizer_access_token = infoJson.getString("authorizer_access_token");Map<String,Object> obj = new HashMap<String,Object>();Map<String,Object> msgMap = new HashMap<String,Object>();String msg = auth_code + "_from_api";msgMap.put("content", msg);obj.put("touser", fromUserName);obj.put("msgtype", "text");obj.put("text", msgMap);JwThirdAPI.sendMessage(obj, authorizer_access_token);} catch (WexinReqException e) {e.printStackTrace();}}   /*** 验证是否过期* @param accessTokenExpires* @return*/boolean isExpired(long accessTokenExpires){return false;}/*** 回复微信服务器"文本消息"* @param request* @param response* @param content* @param toUserName* @param fromUserName* @throws DocumentException* @throws IOException*/public void replyTextMessage(HttpServletRequest request, HttpServletResponse response, String content, String toUserName, String fromUserName) throws DocumentException, IOException {Long createTime = Calendar.getInstance().getTimeInMillis() / 1000;StringBuffer sb = new StringBuffer();sb.append("<xml>");sb.append("<ToUserName><![CDATA["+fromUserName+"]]></ToUserName>");sb.append("<FromUserName><![CDATA["+toUserName+"]]></FromUserName>");sb.append("<CreateTime>"+createTime+"</CreateTime>");sb.append("<MsgType><![CDATA[text]]></MsgType>");sb.append("<Content><![CDATA["+content+"]]></Content>");sb.append("</xml>");String replyMsg = sb.toString();String returnvaleue = "";try {WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, COMPONENT_ENCODINGAESKEY, COMPONENT_APPID);returnvaleue = pc.encryptMsg(replyMsg, createTime.toString(), "easemob");
//            System.out.println("------------------加密后的返回内容 returnvaleue: "+returnvaleue);} catch (AesException e) {e.printStackTrace();}output(response, returnvaleue);}public static void main(String[] args) {Long createTime = Calendar.getInstance().getTimeInMillis() / 1000;String replyMsg = "LOCATIONfrom_callback";String returnvaleue = "";try {WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, COMPONENT_ENCODINGAESKEY, COMPONENT_APPID);returnvaleue = pc.encryptMsg(replyMsg, createTime.toString(), "easemob");System.out.println(returnvaleue);} catch (AesException e) {e.printStackTrace();}}/*** 工具类:回复微信服务器"文本消息"* @param response* @param returnvaleue*/public void output(HttpServletResponse response,String returnvaleue){try {PrintWriter pw = response.getWriter();pw.write(returnvaleue);
//          System.out.println("****************returnvaleue***************="+returnvaleue);pw.flush();} catch (IOException e) {e.printStackTrace();}}/*** 判断是否加密* @param token* @param signature* @param timestamp* @param nonce* @return*/public static boolean checkSignature(String token,String signature,String timestamp,String nonce){System.out.println("###token:"+token+";signature:"+signature+";timestamp:"+timestamp+"nonce:"+nonce);boolean flag = false;if(signature!=null && !signature.equals("") && timestamp!=null && !timestamp.equals("") && nonce!=null && !nonce.equals("")){String sha1 = "";String[] ss = new String[] { token, timestamp, nonce }; Arrays.sort(ss);  for (String s : ss) {  sha1 += s;  }  sha1 = AddSHA1.SHA1(sha1);  if (sha1.equals(signature)){flag = true;}}return flag;}
}class AddSHA1 {public static String SHA1(String inStr) {MessageDigest md = null;String outStr = null;try {md = MessageDigest.getInstance("SHA-1");     //选择SHA-1,也可以选择MD5byte[] digest = md.digest(inStr.getBytes());       //返回的是byet[],要转化为String存储比较方便outStr = bytetoString(digest);}catch (NoSuchAlgorithmException nsae) {nsae.printStackTrace();}return outStr;}public static String bytetoString(byte[] digest) {String str = "";String tempStr = "";for (int i = 0; i < digest.length; i++) {tempStr = (Integer.toHexString(digest[i] & 0xff));if (tempStr.length() == 1) {str = str + "0" + tempStr;}else {str = str + tempStr;}}return str.toLowerCase();}
}

微信公众账号第三方平台全网发布源码(java)- 实战测试通过相关推荐

  1. mysql 推送微信公众号_10分钟完成微信公众号第三方平台全网发布

    背景:在微信公众平台配置服务器URL时,使用了新浪云SAE自带的二级域名,提交时出现一个安全风险的警告,网上查了下,许多服务平台和团队也遇到同样的问题. 经过一番研究 - 为什么会有安全风险的警告? ...

  2. 微信开放平台(公众号第三方平台) -- 全网发布

    一.微信开放平台,第三方平台,全网发布怎么通 过?  二. 微信开放平台 全网发布 组件ticket检测失败?      解决步骤 1.将附件中的代码发布到你配置的域名下: 2.直接点全网发布: 3. ...

  3. 微信开放平台-第三方平台-全网发布接入【java版本】

    微信给出的文档 概述 在第三方平台方创建成功并最终开发测试完毕,提交全网发布申请时,微信服务器会通过自动化测试的方式,检测服务的基础逻辑是否可用,在确保基础可用的情况下,才会允许公众号第三方平台提交全 ...

  4. 微信公众平台第三方平台全网发布 java

    小弟初次写,写的不好,大神多多关照 总共分为两部分: 1.授权,微信每10分钟会给第三方平台推送一次,这里有需要用到的 COMPONENT_VERIFY_TICKET,并且需要响应 success. ...

  5. JAVA版本微信公众账号开源项目版本发布-jeewx1.0(捷微)

    JeeWx, 敏捷微信开发,简称"捷微". 捷微是一款免费开源的微信公众账号开发平台. 平台介绍: 一.简介 jeewx是一个开源,高效,敏捷的微信开发平台采用JAVA语言,它是基 ...

  6. 微赞config.修改php,微信公众号第三方平台 微赞WZ_V100.0版20170612整合包 整合人人商城V2新版+一键升级...

    php+mysql php版本5.3或者以上,OPENSSL必需开启,这是本程序与微信公众号通讯的需求. 我们建议您用云主机!Windows或者Linux皆可,windows主机不推荐用IIS环境,可 ...

  7. 微信公众账号导航平台

    微信公众账号导航平台 网站:http://www.weixinfans.com

  8. 微信公众号第三方平台开发PYTHON教程 PART 2

    github地址:cppfun@wechat-open-third-party-dev 微信公众号第三方平台开发python教程 Part 1 这一节肯定是在第一节的基础上,如果你没有看过第一节,可能 ...

  9. 公众平台模板消息所在行业_如何使用微信公众号第三方平台群发模板消息助手?...

    对于微信公众号群发模板消息助手的实现,公众号后台提供了接口编程实现,微号帮平台提供了模板消息群发功能实现,均可以让微信公众号群发模板消息,模板消息即按固定格式的文本模块消息,没有图文形式,纯固定格式的 ...

最新文章

  1. Android 手机震动
  2. elasticsearch启动错误解决
  3. C++的一般引用及其数组引用
  4. Maven高级之archetype(原型/骨架)开发
  5. c语言条件判断!,if条件判断语句,谁能帮我分析一下?
  6. Oracle迁移PPAS:中文表名的处理
  7. [leetcode]Insert Interval
  8. 数据库原理及应用实验二
  9. Windows10设置动态视频桌面(占少量内存)
  10. windows 超简单实现多用户远程桌面,RDP WRAPPER
  11. 取代奶瓶Minidwep-gtk破解WPA 全攻略
  12. 《薛兆丰的经济学课》课程总结6--经济学家们
  13. 分数相同的排名处理php,SQL实现相同分数排名相同--sql 语句 并列排名的问题
  14. 标准蕃茄钟_12月开始设计项目:番茄钟
  15. 理解async与await
  16. 考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
  17. itchat实现自动回复好友消息
  18. 数值作业:Guass全选主元消去法之C语言代码
  19. 深圳考公务员计算机专业的试卷,2016公务员考试计算机专业模拟试题
  20. random trick

热门文章

  1. 华为鸿蒙任正非专访,任正非接受专访:华为鸿蒙系统将比安卓速度快60%
  2. fabric 环境 搭建与安装
  3. 关于腾讯云服务器使用FTP详细配置教程
  4. Nachos环境搭建
  5. speedoffice(PPT)怎么给文字加粗
  6. Keil 出现报错:undefined symbol
  7. 取模运算总结 - 数论
  8. USB PD v1.0快速充电通信原理
  9. Downloader——Linux中的下载利器
  10. 什么是两化融合和数字化转型?