微信公众号的初步开发区怎么连接微信公众号

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42335421/article/details/82907667

首先我们可以通过以下地址获取一个专门用于测试的公众号,https://mp.weixin.qq.com/

    然后我们可以设置

           

其中URL是通过微信服务器将发送GET请求到填写的服务器地址url上,get请求携带参数如下表所示

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr

随机字符串

 

 

 

 

   

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

将token、timestamp、nonce三个参数进行字典序排序 和将三个参数字符串拼接成一个字符串进行sha1加密 获得加密后的字符串可与signature对比,标识该请求来源于微信

即我们在jsp的项目里的servlet中的get方法中就可以听过代码获取到微信服务器发到我们项目里的get方法里

@WebServlet("/wx")
public class WexxinCoreServlet extends HttpServlet {

	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		/*
		 *    signature	微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
              timestamp	时间戳
             nonce	随机数
             echostr	随机字符串
		 * 
		 * 
		 * 1)将token、timestamp、nonce三个参数进行字典序排序 2)
		 * 将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
		 * 
		 * */
		
	String  signature  =req.getParameter("signature");
	String  timestamp=	req.getParameter("timestamp");
	String  nonce=	req.getParameter("nonce");
	String  echostr=req.getParameter("echostr");
	System.out.println(echostr);
	boolean falg = DataUtil.verify(signature,timestamp,nonce);
	if(falg) {
		System.out.println("接入成功");
		PrintWriter out  = resp.getWriter();
                  //把加密后的token的字符输出出去
		out.write(echostr);
		out.flush();
		out.close();
		
	}else {
		System.out.println("接入失败");
	}
		
	}

然后我们再通过shal加密方式对获取到的 echostr进行加密

        

//加密方式
	public static boolean verify(String signature, String timestamp, String nonce) {
            //这是在微信服务器上的设置上的token
	String token = "da";
        //将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行
	String[] teamp  = new String[] {token,timestamp,nonce};
       //进行排序
	Arrays.sort(teamp);
	
	StringBuilder sb = new StringBuilder();
	for(String s:teamp) {
		sb.append(s);
	}
	String str  = shal(sb.toString());
		return str.equalsIgnoreCase(signature);
	}

        //传入要加密的方式	
	private static String shal(String src) {
	
		return digest(src,"sha1");
	}
	
//进行加密

	private static String digest(String src, String algorithm) {
	try {
		MessageDigest md =MessageDigest.getInstance(algorithm);
		byte[] digest = md.digest(src.getBytes());
		
		char[] chars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
		return toHexStr(digest,chars);
	} catch (NoSuchAlgorithmException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
		return null;
	}

	
	//返回加密的字符串
	private static String toHexStr(byte[] digest, char[] chars) {
	StringBuilder sb = new StringBuilder();
	for(byte b:digest) {
		sb.append(chars[b>>4&15]);
		sb.append(chars[b&15]);
		
		
		
	}
	
		return sb.toString();
	}

           即这样我们就与微信公众号进行了连接

            即我们可以设置公众号被动回复文本消息

一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:

              1、开发者在5秒内未回复任何内容 2、开发者回复了异常数据,比如JSON数据等

   当有人发消息给公众号的时候这是我们可以通过post看到用户发过来的其实是个xml

<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>

即图上这种格式

参数 是否必须 描述
ToUserName 接收方帐号(收到的OpenID)
FromUserName 开发者微信号
CreateTime 消息创建时间 (整型)
MsgType text
Content 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)

            即我们要解析这个xml 解析xml我们可以用到一个jar包dom4j-2.1.1.jar

            

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	   //即我们获取用户传过来的xml
		
		req.setCharacterEncoding("utf8");
		resp.setCharacterEncoding("utf8");
		//获取io流
		ServletInputStream is = req.getInputStream();
		//解析xml
    	Map<String,String> requesMap = DataUtil.parseXml(is);
    	//回复消息用户发什么文本消息我就给他回什么
	    String respXml="<xml><ToUserName><![CDATA["+requesMap.get("FromUserName")+"]]></ToUserName><FromUserName>< ![CDATA["+requesMap.get("ToUserName")+"] ]></FromUserName> <CreateTime>"+System.currentTimeMillis()/1000+"</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA["+requesMap.get("Content")+"]]></Content></xml>";
		
		System.out.println(respXml);
	    //输出
		PrintWriter  out = resp.getWriter();
		out.write(respXml);
		out.flush();
		out.close();
		
		

	}

 

//微信回复文本消息
	private static final SAXReader reader = new SAXReader();
	public static Map<String, String> parseXml(ServletInputStream is) {

		Map<String, String> map  = new  HashMap<>();
		try { 
                          //调用jar包的方法解析xml并把它放在map里
			Document document = reader.read(is);
			Element root = document.getRootElement();
			//
			List<Element> elements = root.elements();
			
			for(Element e :elements) {
				map.put(e.getName(), e.getStringValue());
				
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return map;
		// TODO Auto-generated method stub
		
	}  

即这样我们可以用户发一个文本信息公众号就会复给他相同的消息

展开阅读全文

没有更多推荐了,返回首页