微信公众号开发接入

这篇具有很好参考价值的文章主要介绍了微信公众号开发接入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信公众号开发

准备工作

你要有一个微信公众号,一个内网穿透工具

相关网站

  • 微信公众号:https://mp.weixin.qq.com/
  • 官网文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

需要资料

  • 服务器配置:设置与开发-->基本配置-->服务器配置
  • token:3-32字符,自己生成配置到服务器配置
  • 公网 IP:云服务器一般都有公网IP
  • 内网穿透工具:本地测试需要穿透,否则无法对接。花生壳、natapp 等自行百度

注意事项

  1. 请求URL超时,说明内网穿透有问题
  2. 微信验证消息和推送消息事件接口是同一地址,验证消息是GET请求 ,事件推送消息是POST
  3. 验证成功接口需要给微信原样返回随机字符串(echostr)内容,否则配置失败
  4. 响应类型(Content-Type) 一定要是 text/plan
  5. 切记自己对接的系统要是有权鉴,一定要放行微信消息验证接口

代码示例

消息验证

public void pushGet(HttpServletRequest request, HttpServletResponse response) {
    String signature = request.getParameter("signature"); // 签名
    String echostr = request.getParameter("echostr"); // 随机字符串
    String timestamp = request.getParameter("timestamp"); // 时间戳
    String nonce = request.getParameter("nonce"); // 随机数
    log.debug("signature:{}", signature);
    log.debug("echostr:{}", echostr);
    log.debug("timestamp:{}", timestamp);
    log.debug("nonce:{}", nonce);
    System.out.println("signature:" + signature);
    String sha1 = getSHA1(token, timestamp, nonce);
    System.out.println("sha1:" + sha1);
    if (sha1.equals(signature)) {
        log.debug("成功");
        this.responseText(echostr, response);
    }
}

事件推送

public void pushPost(HttpServletRequest request, HttpServletResponse response) {
    String signature = request.getParameter("signature"); // 签名
    String timestamp = request.getParameter("timestamp"); // 时间戳
    String nonce = request.getParameter("nonce"); // 随机数
    String sha1 = getSHA1(token, timestamp, nonce);
    if (sha1.equals(signature)) {
        Map<String, Object> map = null;
        try {
            map = XmlUtil.parseXMLToMap(request.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        log.debug("事件消息体:{}", map);

        this.responseText("", response); // 回复空串,微信服务器不会对此作任何处理
    }

}

完整代码

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.util.*;

/**
 * @description: 微信配置
 * @author: Mr.Fang
 * @create: 2023-05-26
 **/
@Api(tags = "微信配置")
@Slf4j
@RestController
@RequestMapping("/wx/")
public class WxController {

    String token="78******23";

    @ApiOperation(value = "微信 token URL 验证")
    @GetMapping(value = "push")
    public void pushGet(HttpServletRequest request, HttpServletResponse response) {
        String signature = request.getParameter("signature"); // 签名
        String echostr = request.getParameter("echostr"); // 随机字符串
        String timestamp = request.getParameter("timestamp"); // 时间戳
        String nonce = request.getParameter("nonce"); // 随机数
        log.debug("signature:{}", signature);
        log.debug("echostr:{}", echostr);
        log.debug("timestamp:{}", timestamp);
        log.debug("nonce:{}", nonce);
        System.out.println("signature:" + signature);
        String sha1 = getSHA1(token, timestamp, nonce);
        System.out.println("sha1:" + sha1);
        if (sha1.equals(signature)) {
            log.debug("成功");
            this.responseText(echostr, response);
        }
    }

    @ApiOperation(value = "接收微信事件")
    @PostMapping(value = "push")
    public void pushPost(HttpServletRequest request, HttpServletResponse response) {
        String signature = request.getParameter("signature"); // 签名
        String timestamp = request.getParameter("timestamp"); // 时间戳
        String nonce = request.getParameter("nonce"); // 随机数
        String sha1 = getSHA1(token, timestamp, nonce);
        if (sha1.equals(signature)) {
            Map<String, Object> map = null;
            try {
                // input 流返回是 xml 格式 这里转 map 了
                map = XmlUtil.parseXMLToMap(request.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            log.debug("事件消息体:{}", map);

            this.responseText("", response); // 回复空串,微信服务器不会对此作任何处理
        }

    }

    /**
     * 返回响应结果
     *
     * @param text     响应内容
     * @param response
     */
    public void responseText(String text, HttpServletResponse response) {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/plan;charset=UTF-8");
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.write(text);
        writer.flush();
        writer.close();
    }

    /**
     * 用SHA1算法生成安全签名
     *
     * @param token     票据
     * @param timestamp 时间戳
     * @param nonce     随机字符串
     * @return 安全签名
     */
    public String getSHA1(String token, String timestamp, String nonce) {
        try {
            String[] array = new String[]{token, timestamp, nonce};
            StringBuffer sb = new StringBuffer();
            // 字符串排序
            Arrays.sort(array);
            for (int i = 0; i < 3; i++) {
                sb.append(array[i]);
            }
            String str = sb.toString();
            // SHA1签名生成
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] digest = md.digest();

            StringBuffer hexstr = new StringBuffer();
            String shaHex = "";
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            return hexstr.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

响应结果

消息验证

signature:207e05105427e1203e769245b3860212c0ffcc56
echostr:5692172970033782203
timestamp:1685068850
nonce:499790541
signature:207e05105427e1203e769245b3860212c0ffcc56
sha1:207e05105427e1203e769245b3860212c0ffcc56
成功

事件推送

打开公众号发送消息,接口就可以获取到推送事件消息内容了

{"Content":"嘻嘻嘻","CreateTime":"1685068967","ToUserName":"gh_2121212a95","FromUserName":"333333333nSg8OlaSuB0d-f8FKZo","MsgType":"text","MsgId":"24124387253374797"}

其他信息

公众号配置
微信公众号开发接入

内网穿透
微信公众号开发接入文章来源地址https://www.toymoban.com/news/detail-459685.html

到了这里,关于微信公众号开发接入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Laf云平台,两步将ChatGPT接入微信公众号

    原文链接:https://husanr.cloud/views/ChatGPT/aircode_wechat

    2023年04月14日
    浏览(37)
  • 微信公众号程序或微信小程序接入微信支付流程(前后端程序示例)

      微信公众号程序或微信小程序项目中基本都要有微信支付。支付场景基本就是点击支付,然后手机底部拉起输入微信支付密码弹窗,密码输入正确后,支付完成。但是无论是微信小程序或微信公众号程序都是在后端调用微信api接口进行统一下单,将接口返回数据回传前端

    2024年02月09日
    浏览(62)
  • 唯一客服系统:Golang开发客服系统源码,支持网页,H5,APP,微信小程序公众号等接入,商家有PC端管理和H5,可以配置AI智能回复(搭建部署教程)

    本系统采用Golang Gin框架+GORM+MySQL+Vue+ElementUI开发的独立高性能在线客服系统。客服系统访客端支持PC端、移动端、小程序、公众号中接入客服,利用超链接、网页内嵌、二维码、定制对接等方式让网上所有通道都可以快速通过本系统联系到商家。 服务端可编译为二进制程序包

    2024年04月16日
    浏览(80)
  • (教程)微信公众号接入淘票票cps推广电影链接赚佣金

    淘票票属于淘宝联盟的一个cps项目,推广淘票票电影票可以获得订单实付金额5%的佣金,如果是新客下单还能拿到0.5元/张的额外奖励。 下面教大家如何在微信公众号里面接入淘票票 第一步:微信公众号关联淘票票小程序 登录微信公众号平台,在左侧菜单栏找到“小程序管理

    2024年02月08日
    浏览(52)
  • 国内服务器 3 分钟将 ChatGPT 接入微信公众号(超详细)

    最近很火的 ChatGPT 可以说已经满大街可见了,到处都有各种各样的体验地址,有收费的也有免费的,总之是五花八门、花里胡哨。 所以呢,最近我就在研究怎么才能方便快捷的体验到ChatGPT的强大功能,其中一个就是:把ChatGPT接入公众号。毕竟公众号是一种非常流行的社交媒

    2024年02月21日
    浏览(102)
  • 微信公众号订阅号(未认证)接入Chatgpt实现AI聊天(代码已开源)

    众说周知,微信未经过认证的订阅号在接口权限上面有非常大的限制,这里主要做的事是:用户通过关注订阅号发送消息到后台,处理调用chatgpt接口,缓存到redis中。因为chatgpt接口延迟问题,如果微信三次回调均没有收到chatgpt回复,就将数据存到redis通过openid 和msgid绑定用户

    2024年04月17日
    浏览(36)
  • 使用JAVA开发微信公众平台(一)——环境搭建与开发接入

    微信公众平台,即我们平时所说的“公众号”,曾用名“官方平台”、“媒体平台”,但最终命名为“公众平台”。从微信的命名我可以发现,公众平台不只是官方、媒体使用的平台,而是对所有公众都开放的统一平台。 喜欢本文,请点击下方喜欢按钮呗!❤️ 微信公众平

    2024年02月08日
    浏览(48)
  • 微信公众号对接ChatGPT-实现基于自己知识库的机器人功能-并且可以人工接入进行回复的客服系统...

    现在很多教程有介绍如何把chatGPT对接到自己的公众号上,利用公众号的自动回复接口功能,实现用户在公众号与chatGPT进行交互。 而我实现的功能比上面的要高级很多 首先,用户在公众号端发送咨询消息,可以得到自动回复,并且这个回复是基于我自己的知识库回答的 然后

    2024年02月16日
    浏览(81)
  • 微信公众号开发以及测试公众号前端自测网页授权

    测试号申请(开发的时候需要使用微信测试号进行开发) 微信测试号申请地址 进入网页之后选择微信登陆,直接用微信扫码登录,微信测试号就申请成功了 测试号配置 申请成功之后会有一个测试号管理界面 1、会自动生成appID、appsecret(需要记录一下,后面会用到)。 2、接口

    2024年02月06日
    浏览(48)
  • 微信公众号开发入门

    实在是太折腾,太难懂了。也太坑了。 下面是这几天来,有关微信公众号的工作总结。算不上全面,只是作为一个初学者的记录,仅以备忘。 公众号与小程序不同。小程序类似手机APP,独立开发,微信只是提供了一个入口;而公众号则基本上是在微信框架内。微信公众号本

    2023年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包