微信企业微信应用开启API接收信息来读取用户发送内容

开启企业微信应用API接收信息

  1. 第一步登录企业微信后台
    企业微信后台
    找到自己要开启的应用,里面有一个开启API接收信息
    应用管理
    然后就是开启中所要用到的一些参数说明,
    这些东西官方文档也说的特别清楚的
    参数说明
    当你点击保存的时候,微信官方会进行一个请求发送到你所填写的url上
    所以点击保存的时候必须项目要启动,并且可以进行访问
  2. 现在开始说代码层面
    对接这个接口主要要给官方提供两个接口
    一个get请求的校验接口:验证你的项目官方是不是可以调通
    一个是post请求的内容发送接口:是给微信官方发送每个用户所发送的内容
    下次就展示代码,说的有点啰嗦,我这边用的是springBoot项目
    给你们看一下我的项目结构以及要用到的那些类
    weixin.mp.aes里面的类都是官方提供的
    下载地址:https://work.weixin.qq.com/api/doc/90000/90138/90307
    我这边是java的所以只展示Java的,可以点击下面直接下载
    xml版本(2018年10月11日更新,点击下载)
    项目结构
    Controller层
    注解比较多,主要让小白看清楚每步都干了什么,
    后面可以自己进行删除
package com.tian.spring_boot.controller;

import cn.hutool.core.util.XmlUtil;
import com.tian.spring_boot.service.WxService;
import com.tian.spring_boot.utils.WeiXinParamesUtil;
import com.tian.spring_boot.weixin.mp.aes.AesException;
import com.tian.spring_boot.weixin.mp.aes.WXBizMsgCrypt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @ProjectName: spring_boot
 * @Package: com.tian.spring_boot.controller
 * @ClassName: WxController
 * @Author: TZQ
 * @Date: 2021/5/14 16:22
 * @Version: 1.0
 */
@RestController
public class WxController {

    @Autowired
    private WxService wxService;

    @GetMapping("/WxReceiveMessage")
    public void coreJoinGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        // 微信加密签名
        String msg_signature = request.getParameter("msg_signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        // 随机字符串
        String echostr = request.getParameter("echostr");

        System.out.println("msg_signature = " + msg_signature);
        System.out.println("timestamp = " + timestamp);
        System.out.println("nonce = " + nonce);
        System.out.println("echostr = " + echostr);

        System.out.println("request=" + request.getRequestURL());

        PrintWriter out = response.getWriter();
        // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
        String result = null;
        try {
            WXBizMsgCrypt crypt = new WXBizMsgCrypt(WeiXinParamesUtil.token, WeiXinParamesUtil.encodingAESKey, WeiXinParamesUtil.corpId);
            result = crypt.verifyUrl(msg_signature, timestamp, nonce, echostr);
        } catch (AesException e) {
            e.printStackTrace();
        }
        if (result == null) {
            result = WeiXinParamesUtil.token;
        }
        out.write(result);
        out.close();
        out = null;
    }

    @PostMapping("/WxReceiveMessage")
    public void coreJoinPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        String timeMillis = System.currentTimeMillis() + "";
        // 微信加密签名
        String msg_signature = request.getParameter("msg_signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        PrintWriter out = response.getWriter();
        String result = null;
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse(request.getInputStream());
            Element root = document.getDocumentElement();
            String corpID = root.getElementsByTagName("ToUserName").item(0).getTextContent();
            String agentID = root.getElementsByTagName("AgentID").item(0).getTextContent();
            String encrypt = root.getElementsByTagName("Encrypt").item(0).getTextContent();//用户发送的内容
            System.out.println("CorpID = " + corpID);
            System.out.println("agentID = " + agentID);
            System.out.println("encrypt = " + encrypt);
            WXBizMsgCrypt crypt = new WXBizMsgCrypt(WeiXinParamesUtil.token, WeiXinParamesUtil.encodingAESKey, WeiXinParamesUtil.corpId);
            result = crypt.verifyUrl(msg_signature, timestamp, nonce, encrypt);

            System.out.println("result = " + result);
            Document parse = XmlUtil.readXML(result);
            String fromUserName = parse.getElementsByTagName("FromUserName").item(0).getTextContent();
            String createTime = parse.getElementsByTagName("CreateTime").item(0).getTextContent();
            String msgType = parse.getElementsByTagName("MsgType").item(0).getTextContent();
            String content = parse.getElementsByTagName("Content").item(0).getTextContent();
            String msgId = parse.getElementsByTagName("MsgId").item(0).getTextContent();

            System.out.println("FromUserName = " + fromUserName);
            System.out.println("CreateTime = " + createTime);
            System.out.println("MsgType = " + msgType);
            System.out.println("Content = " + content);
            System.out.println("MsgId = " + msgId);

            String msg = "";
            //对用户发送过来的内容选择要回复的内容
            //PS:这边你就可以对用户传过来的参数进行一个除了根据回复的内容配合自己的业务
            if (content.contains("df")) {
                content = content.substring(2);
                if (wxService.confirmPayment(fromUserName, content)) {
                    msg = "党费确认成功!";
                }
            }
            String replyMsg = "<xml>"
                    + "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"//成员UserID
                    + "<FromUserName><![CDATA[" + corpID + "]]></FromUserName>"//企业微信CorpID
                    + "<CreateTime>" + timeMillis + "</CreateTime>"//消息创建时间(整型)
                    + "<MsgType><![CDATA[text]]></MsgType>"//消息类型,此时固定为:text
                    + "<Content><![CDATA[" + msg + "]]></Content>"//文本消息内容,最长不超过2048个字节,超过将截断
                    + " </xml>";
            System.out.println("replyMsg = " + replyMsg);//打印出来
            //这里可以存放你要自动回复给用户的信息
            String encryptMsg = crypt.encryptMsg(replyMsg, timeMillis, nonce);
            System.out.println("encryptMsg = " + encryptMsg);
            out.println(encryptMsg);//回复
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}

WeiXinParamesUtil

package com.tian.spring_boot.utils;

/**
 * @ProjectName: spring_boot
 * @Package: com.tian.spring_boot.utils
 * @ClassName: WeiXinParamesUtil
 * @Author: TZQ
 * @Date: 2021/5/16 14:49
 * @Version: 1.0
 */
public class WeiXinParamesUtil {

    //token
    public final static String token = "ttzzqq";
    // encodingAESKey
    public final static String encodingAESKey = "aJx22afLihLkcLdTQJg0C4wB5qUApoDg3tS6KOvUSCj";
    //企业ID,可以在企业微信后台->我的企业->企业信息->拉到最下面能看见
    public final static String corpId = "ww0971b514e055647b";
    //应用的凭证密钥
    public final static String corpsecret = "7LFu67ghtdsQGaJOcc_y4RLX61y0qqYXZ8O39x6J46I";
}

大致的代码就这些,然后主要说一下里面的坑
有些时候你本地进行测试的时候发送官方给的请求例子可以访问成功
但是放在官方测试的时候就不可以,这个时候你要试一下你本地项目能不能被外网进行访问
如果不能访问的话可以关闭防火墙试试,也可以进行内网穿透来完成
我这边用的是内网穿透,如果有小伙伴要跟我一样方法解决可以看下面这个文章
有其他问题也可以进行留言和私聊,主要看网上没有一个最新的教程,就想着自己琢磨出来的就记录一下,供大家进行一个参考

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 要让ESP32通过蓝牙发送数据微信小程序,你可以使用ESP32内置的蓝牙模块,以及微信小程序提供的蓝牙API接口。 以下是一些基本步骤: 1. 使用Arduino IDE或其他编程工具,编写ESP32的蓝牙发送程序。例如,你可以使用Arduino蓝牙库,通过Serial通信接口将数据发送到ESP32内置的蓝牙模块。 2. 在微信小程序中,使用微信提供的蓝牙API接口,连接到ESP32的蓝牙模块,并接收来自ESP32的数据。例如,你可以使用wx.createBLEConnection()函数建立连接,使用wx.onBLECharacteristicValueChange()函数监听数据变化事件,以及使用wx.readBLECharacteristicValue()函数读取数据。 需要注意的是,蓝牙连接和数据传输的稳定性需要根据具体情况进行优化。同时,你需要确保ESP32和微信小程序之间的通信协议一致,例如数据格式、编码方式等。 ### 回答2: ESP32是一款功能强大的开发板,它支持蓝牙功能,并可以通过蓝牙将数据发送微信小程序进行接收。 在ESP32上,我们可以使用它内置的蓝牙模块来实现数据发送。首先,我们需要在ESP32上启用蓝牙功能,并创建一个蓝牙服务,用于发送数据。可以使用ESP-IDF开发框架来实现这些功能。 接下来,在微信小程序中,我们需要使用wx.startBluetoothDevicesDiscovery函数来启用蓝牙设备的搜索功能。然后,使用wx.onBluetoothDeviceFound函数来监听蓝牙设备的发现事件,并获取到ESP32的蓝牙设备信息。 一旦微信小程序找到了ESP32的蓝牙设备,我们可以使用wx.createBLEConnection函数来建立与ESP32蓝牙设备的连接。 连接建立之后,可以使用wx.onBLEConnectionStateChange函数来监听蓝牙连接状态的变化,并在连接成功后发送数据请求到ESP32。 在ESP32上,当接收到来自微信小程序的数据请求时,可以通过蓝牙通信协议进行通信。ESP32可以将需要发送数据打包成特定格式的数据包,并通过蓝牙发送微信小程序。 在微信小程序中,可以使用wx.onBLECharacteristicValueChange函数监听从ESP32接收到的数据,并进行处理。 总而言之,通过在ESP32上启用蓝牙功能,并在微信小程序中使用蓝牙接口进行连接和数据接收处理,我们可以实现ESP32向微信小程序发送数据的功能。这样,我们就可以利用ESP32和微信小程序相互通信,实现更多有趣的功能。 ### 回答3: ESP32是一种高集成度的蓝牙Wi-Fi芯片,可以用于无线传输数据。要在ESP32上发送数据微信小程序蓝牙接收端,需要经过以下几个步骤: 1. 配置ESP32的蓝牙模块:首先,需要在ESP32上配置蓝牙模块,使其能够与其他设备进行通信。可以使用Arduino编程语言来编写代码,在代码中引入ESP32的蓝牙库,并设置蓝牙的名称和特性。 2. 连接微信小程序蓝牙接收端:在微信小程序中,需要使用wx.getBLEDevice函数获取到ESP32的蓝牙设备对象。然后通过wx.createBLEConnection函数进行连接。 3. 发送数据:一旦连接建立,就可以使用ESP32的蓝牙发送函数发送数据。可以使用ESP32的蓝牙库提供的函数来发送字符串、数字或二进制数据。 4. 接收数据:在微信小程序中,可以通过wx.onBLECharacteristicValueChange事件监听接收到的数据。当ESP32蓝牙发送数据时,该事件将被触发,从而可以获取到接收到的数据。 需要注意的是,ESP32和微信小程序蓝牙接收端的通信需要使用相同的数据格式和通信协议。通常情况下,可以使用文本字符串作为通信格式,例如发送JSON格式的数据。 总之,要实现ESP32蓝牙发送数据微信小程序蓝牙接收端,需要先配置ESP32的蓝牙模块,然后在微信小程序中建立连接并监听接收到的数据。通过这种方式,可以实现两者之间的无线数据传输。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值