基于cpolar实现微信公众号访问本地服务

咱先跟着cpolar官方教程学一下怎么使用cpolar

一、使用cpolar

1 使用cpoloar进行内网穿透

1.1 下载安装cpolar内网穿透 【macOS】

前提:已经安装Homebrew。详见:macOS的设置与常用软件

  • 安装cpolar
brew tap probezy/core && brew install cpolar

在这里插入图片描述

1.2 token认证

  • 注册帐号
  • 查看自己的认证token
    在这里插入图片描述
  • 执行:cpolar authtoken xxx
    在这里插入图片描述

1.3 安装服务

  • sudo cpolar service install

1.4 启动服务

  • sudo cpolar service start

1.5 查看是否正常启动服务

在这里插入图片描述

1.6 创建隧道映射本地端口

  • 使用cpolar账号登录
  • 创建隧道
    在这里插入图片描述

更正:“China Top”改为“China VIP

  • 查看公网地址
    在这里插入图片描述

1.7 测试公网地址

  • 本地服务器的代码:
@RequestMapping("/test")
@RestController
public class SimpleTestCpolarController {

    /**
     * 接收前端请求,进行接口测试
     * @param data 请求参数,包含测试数据
     * @return 返回测试结果,如果测试数据为空则返回null
     */
    @PostMapping("interTest")
    public Map<String, String> interTest(@RequestBody Map<String, String> data) {
        System.out.println(data);

        if (data.size() > 0) {
            return data;
        } else {
            return null;
        }
    }
}
  • 结果(Apifox发生http请求):
    在这里插入图片描述

2 固定公网地址

免费套餐,随机公网地址,24小时内会随机变化,不利于长期远程访问。

  • 解决办法:为其配置二级子域名,该地址为固定地址,不会随机变化。

2.1 保留一个二级子域名

需要花钱…
在这里插入图片描述

  • 结果:
    在这里插入图片描述

2.2 配置二级子域名

在这里插入图片描述

  • 查看:
    在这里插入图片描述

2.3 测试使用固定公网地址

在这里插入图片描述

3 Cpolar监听器

  • 使用cpolar监听器(http://localhost:4040)查看接口请求日志,处理讨厌的bug。
  • 甚至可以重播请求消息包,加速测试的请求,单击重放(Replay)按钮,重新发送该HTTP信令请求,而不是手动重新触发操作。

3.1 开启侦听功能

在这里插入图片描述

3.2 请求侦听

  • 在浏览器访问本地4040端口,http://localhost:4040
  • 结果:
    在这里插入图片描述

我replay没效果… 而且,我还是习惯在apifox发起请求。

二、微信公众号开发:对接本地开发环境【内网穿透】

1 配置本地服务器

  • 代码:
/**
 * 微信服务调用接口
 */
@Controller
@RequestMapping("/wechat")
public class WeChatController {
	// 与“微信公众号-基本配置-Token”保持一致
    private static String wxToken = "xxx";

    @GetMapping("")
    public void weChatTestV(HttpServletRequest request, HttpServletResponse response) {

        // 1、验证消息的确来自微信服务器
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");

        //将微信echostr返回给微信服务器
        try (OutputStream os = response.getOutputStream()) {
            //和signature进行对比
            if (check(wxToken, signature, timestamp, nonce)) {
                // 返回echostr给微信
                os.write(URLEncoder.encode(echostr, "UTF-8").getBytes());
                os.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static boolean check(String token, String signature, String timestamp, String nonce) {
        String[] arr = new String[]{token, timestamp, nonce};
        // 将token、timestamp、nonce三个参数进行字典序排序
        Arrays.sort(arr);
        StringBuilder content = new StringBuilder();
        for (String s : arr) {
            content.append(s);
        }
        MessageDigest md;
        String tmpStr = null;
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三个参数字符串拼接成一个字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null && tmpStr.equals(signature.toUpperCase());
    }

    /**
     * 将字节数组转换为十六进制字符串
     */
    private static String byteToStr(byte[] byteArray) {
        StringBuilder strDigest = new StringBuilder();
        for (byte b : byteArray) {
            strDigest.append(byteToHexStr(b));
        }
        return strDigest.toString();
    }

    /**
     * 将字节转换为十六进制字符串
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        return new String(tempArr);
    }
}

2 配置微信公众号

在这里插入图片描述

  • 点击“提交”后,微信服务器将发送GET请求到填写的服务器地址URL上。

因此,必须先启动本地服务!

  • 结果:
    在这里插入图片描述

点击“提交”后,本地服务就能收到请求了!
在这里插入图片描述

3 使用本地服务器进行微信开发(demo)

  • 代码:
@PostMapping("")
public void replyMessage(@RequestParam("openid") String openid, HttpServletResponse response) {
    // 简单回复
    ReplyTextMessage replyTextMessage = new ReplyTextMessage()
            .setToUserName(openid) // 用户向公众号发消息,现在要回复ta,也就是to ta
            .setFromUserName("xxx")  // 公众号设置-注册信息-原始ID
            .setCreateTime(String.valueOf(System.currentTimeMillis()))
            .setMsgType("text")
            .setContent("Happy New Year"); // 中文无法显示

    //将回复xml的数据包输出给用户
    try (PrintWriter out = response.getWriter()) {
        out.print(XmlUtil.beanToXml(replyTextMessage));
        out.flush();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
  • 结果:
    在这里插入图片描述
  • 成功实现基于cpolar微信公众号访问本地服务!
  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值