Bootstrap

SpringBoot对接微信公众平台(1)--- 配置微信公众平台测试号URL并校检

SpringBoot对接微信公众平台(1)--- 配置微信公众平台测试号URL并校检

说明

这里记录下自己学习SpringBoot对接微信公众平台的成长过程,以防止后面继续踩坑且方便以后直接使用。这里使用微信公众号的接口测试号来开发微信公众平台。
微信公众号官网:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

微信公众号接口测试号申请

访问微信公众号平台,如下图:
在这里插入图片描述
点击进去后,只需要填接口配置信息即可。
在这里插入图片描述

后端代码实现

微信公众平台接入指南:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

因为我的代码是在本地开发的,ip地址是127.0.0.1,SpringBoot项目端口是8080,因为微信测试号那个URL接口地址配置必须是域名加外网访问,所以我这里在本地使用了内网穿透,将127.0.0.1:8080映射成了一个域名,这里的域名是软件生成给我们的,内网穿透成功后就可在外网访问。这样我们相当于将本地开发服务作为了一台服务器。
如果有小伙伴不知道什么是内网穿透,或者怎么配置内网穿透,请自行百度解决哦。网上有相关教程。
我映射后如下:
在这里插入图片描述
创建一个SpringBoot项目,如下:
在这里插入图片描述
pom.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>wechat-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>wechat-service</name>
    <description>wechat-service</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--web依赖,内嵌入tomcat,RestTempLate使用该依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--用来将string的json格式字符串转换成json对象-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
        <!--lombok依赖,用来对象省略写set、get方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.wechatservice.WechatServiceApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

application.yml代码:

server:
  port: 8080

wxChat:
  appID:你的测试公众号appID
  appsecret:你的测试公众号appsecret

WeChatController代码如下:

package com.example.wechatservice.controller;

import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@RestController
@RequestMapping(value = "/weChat")
public class WeChatController {

    //测试内网穿透后在外网访问接口
    @GetMapping(value = "/hello")
    public String hello(){
        return "hello";
    }

    //测试微信公众平台里面的接口配置信息里面的URL能否调用成功,这种只是测试微信公众平台能否调用接口,但是不能识别它是否真的来自于微信公众平台来调用你的,所以才需要做验证
    @GetMapping(value = "/test")
    public String test(@RequestParam(value = "signature", required = false) String signature,
                       @RequestParam(value = "timestamp", required = false) String timestamp,
                       @RequestParam(value = "nonce", required = false) String nonce,
                       @RequestParam(value = "echostr", required = false) String echostr){
        System.out.println("微信测试公众平台调用我了!!!!");
        System.out.println("signature="+signature);
        System.out.println("timestamp="+timestamp);
        System.out.println("nonce="+nonce);
        System.out.println("echostr="+echostr);
        //必须原封不动将echostr返回给微信公众号,微信公众测试号才能配置成功那个URL,返回其他值都会导致配置失败
        return echostr;
    }

    //测试微信公众平台里面的接口配置信息,并验证它是否真的来自微信公众平台
    @GetMapping(value = "/check")
    public String check(@RequestParam(value = "signature", required = false) String signature,
                       @RequestParam(value = "timestamp", required = false) String timestamp,
                       @RequestParam(value = "nonce", required = false) String nonce,
                       @RequestParam(value = "echostr", required = false) String echostr){
        System.out.println("微信公众平台调用我了!!!!");
        //微信公众平台配置的token值
        String token="testToken";
        //1.将token、timestamp、nonce三个参数进行字典序排序
        List<String> list= Arrays.asList(token,timestamp,nonce);
        //排序
        Collections.sort(list);
        //2.将三个参数字符串拼接成一个字符串进行sha1加密
        StringBuilder stringBuilder=new StringBuilder();
        for(String s:list){
            stringBuilder.append(s);
        }
        //加密
        try{
            MessageDigest instance = MessageDigest.getInstance("SHA-1");
            //使用sha1进行加密获得byte数组
            byte[] digest=instance.digest(stringBuilder.toString().getBytes());
            StringBuilder sum=new StringBuilder();
            for(byte b:digest){
                sum.append(Integer.toHexString((b>>4)&15));
                sum.append(Integer.toHexString(b&15));
            }
            //3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
            if(!StringUtils.isEmpty(signature)&&signature.equals(sum.toString())){
                System.out.println("一致");
                //必须原封不动将echostr返回给微信公众号,微信公众测试号才能配置成功那个URL,返回其他值都会导致配置失败
                return echostr;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

内网穿透接口测试

这里我在另外一台连了网络的电脑进行接口请求,发现接口请求成功。如下:
在这里插入图片描述
既然外网已经能够成功访问到我们的接口了,那我们直接在微信公众平台配置对应的URL即可。
使用这个http://你的域名/weChat/test接口进行测试,看看能否配置成功。如下:
在这里插入图片描述
后端控制台调用test接口打印如下:
在这里插入图片描述
/weChat/test接口只是我们用来验证能否正常配置成功,但是无法校检是否真的来自于微信公众平台,所以真正实际开发需要调用/weChat/check接口,如下:
在这里插入图片描述
后端控制台打印如下:
在这里插入图片描述
好了,到这里笔记就结束了。填写几个注意点:

  • 必须是域名加外网可以访问,测试公众号域名可以不用备案。
  • 接口配置信息那里的URL配置的是你后端接口地址,点击提交按钮的时候会去请求你的那个接口,使用get请求并会向你传signature、timestamp、nonce、echostr这四个参数,接口返回必须是echostr值,如果返回的不是这个echostr值,都会显示配置失败。
;