微信公众号开发,实现本地开发调试

本文指导如何申请微信测试公众号,包括填写基本信息、选择类型,以及配置服务器以实现与微信服务器通信。重点介绍了服务器配置中的URL、Token设置,以及如何通过内网穿透解决调试问题,包括获取token、配置隧道和签名验证过程。
摘要由CSDN通过智能技术生成

一、申请一个微信测试公众号

1.1 要在微信公众号上挂载应用,首先自己得需要一个公众号测试用,所以需要去微信公众平台上申请一个,我们个人的话只能申请订阅号。

1.2 这边申请一个订阅号。

1.3填写基本信息,需要注意的是需要一个未激活过微信公号的邮箱,然后点击注册。

这里会在所填邮箱中收到一个验证码。

1.4 选择类型,中国大陆即可。

1.5 下一步选择订阅号。

1.6 下一步填写信息,这里选择个人,按找要求填写各个信息。

1.7 最后注册成功。

二、填写服务器配置

2.1 选择 开发–基本配置(第一次点开可能会出现需要成为开发者,审核后才会出现下图页面。)

2.2 接下来配置服务器。为了能和我们自己的服务通信,我们需要在接口配置信息中填写URL和Token和我们的服务建立连接。需要注意的是需要在我们自己服务中接收微信公众号传输的信息并且给出回应,不然会提示验证失败。第二点是这里的URL只对公网有效,对我们本地项目启动的IP是无效的,因此需要把我们的服务挂在一台有公网IP的服务器上,才能建立通信,我自己这边是通过内网穿透实现的,因为使用内网穿透的优点是可以在本地调试。(URL分成两部分,第一部分为公网IP,第二部分为接口路径,该接口是为了接收参数并给出回应)

2.4 开发基于微信公众号的应用最大就是调试问题,每次测试都需要部署到公网服务器进行测试。微信用户每次向公众号发起请求时,微信服务器会先接收到用户的请求,然后再转发到我们的服务器上,也就是说,微信服务器是要和我们的服务器进行网络交互,所以我们必须保证我们的服务器外网可以访问到,这种部署到公网服务器进行测试的做法对于我们开发者来说非常不方便,没法debug查看每一步代码的运行情况,解决办法就是将内网的部署服务器映射到外网,让微信服务器可以正常访问到。下面推荐一个我自己免费实现内网穿透的方法。通过natapp进入natapp官网NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

进入官网主要目的是获取token,首先先下载客户端。

然后注册账号:

然后购买一个免费隧道:

然后在本地环境变量中配置path,路径就是第一步下载客户端解压后的位置:

接着双击下载解压后的natapp.exe,输入以下命令:

natapp -authtoken  yourtoken

回车后会出现

外网访问上边Forwarding后边的那个地址,就能访问到我们本地的地址了。

需要注意的是:隧道上配置的端口需要和本地项目启动的端口一致!

隧道端口:

本地端口:

至此内网穿透成功,公网地址就填Forwarding后边的那个地址就可以了。

最后一步,需要在URL所写的接口中写一段代码来响应微信服务器,token需要和配置中的一致,这样才能配置成功。下面代码仅供参考:

package cn.e4j.modular.api.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 2023/11/13
 *
 * @author XiaoYu
 * @version 1.0.0
 */
@RequestMapping("connect")
@Controller
public class test {
    //切记:这里是自定义的token,需和你微信配置界面提交的token完全一致
    private final String TOKEN  = "LongGeTest";

    static Logger logger = LoggerFactory.getLogger(test.class);

    @RequestMapping("test")
    public  void checkSignature(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("校验签名start");

        /**
         * 接收微信服务器发送请求时传递过来的参数
         */
        //签名
        String signature = request.getParameter("signature");
        //时间戳
        String timestamp = request.getParameter("timestamp");
        //随机数
        String nonce = request.getParameter("nonce");
        //随机字符串
        String echostr = request.getParameter("echostr");

        /**
         * 将token、timestamp、nonce三个参数进行字典序排序
         * 并拼接为一个字符串
         */
        String sortStr = this.sort(TOKEN,timestamp,nonce);
        /**
         * 对排序后的sortStr进行shal加密
         */
        String mySignature = shal(sortStr);
        /**
         * 校验"微信服务器传递过来的签名"和"加密后的字符串"是否一致, 如果一致则签名通过,否则不通过
         */
        if(!"".equals(signature) && !"".equals(mySignature) && signature.equals(mySignature)){
            System.out.println("校验结果:"+"签名校验通过");
            try {
                //必须响应给微信,不然会提示"token校验失败"
                response.getWriter().write(echostr);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            System.out.println("校验结果:"+"校验签名失败");
        }
    }
    /**
     * 参数排序
     * @param token
     * @param timestamp
     * @param nonce
     * @return
     */
    public String sort(String token, String timestamp, String nonce) {
        String[] strArray = {token, timestamp, nonce};
        Arrays.sort(strArray);
        StringBuilder sb = new StringBuilder();
        for (String str : strArray) {
            sb.append(str);
        }
        return sb.toString();
    }
    /**
     * 字符串进行shal加密
     * @param str
     * @return
     */
    public String shal(String str){
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte messageDigest[] = digest.digest();

            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

}

然后启动项目后,点击提交。(如果提交成功,说明通信完成)。

三、需要注意的是,我们申请的是正式使用的公众号,它提供的接口权限很少,所以微信平台专门为开发者提供了一个微信公众测试号来方便我们测试更全面的接口。

3.1  所以我们可以申请一个微信公众测试账号。在开发者工具中申请公众平台测试账号。

3.2 进入公众平台测试账号页面,可以看到appID、appsecret等参数,这些都是后面我们调用微信公众号接口所需要给的参数。

3.3 在接口配置信息中填写和上面配置一样的参数,点击提交。

这边需要注意的是,只有在正式公众号中服务器配置成功后,测试号才能配置成功!!

至此我们就可以根据微信公众号提供的接口文档去开发公众号啦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余小鱼o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值