微信公众号开发教程(一)

上一篇博客初始化项目已经完成,现在我们继续学习
1.装填spring-boot-starter-weixin依赖并完成快速开发框架的前置代码(README.md
pom.xml填写依赖
在这里插入图片描述
完整依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>net.dreamlu</groupId>
            <artifactId>spring-boot-starter-weixin</artifactId>
            <version>1.3.6</version>
        </dependency>
    </dependencies>

boot入口函数RedDustFootprintApplication开启缓存注解在这里插入图片描述
配置文件application.yml在这里插入图片描述
这个配置文件我配了我自己服务器的数据库和redis缓存,如果只是单纯的微信后台而不牵扯数据存储是可以不写的,这是我直接照搬的以前写过的
在这里插入图片描述
这三个方框的参数是很重要的,这是你链接微信官方接口的通行证
这是测试号
在这里插入图片描述
这是正式号
在这里插入图片描述
然后我们直接写控制器

@WxMsgController("/weixin/wx")
public class WeixinController extends DreamMsgControllerAdapter {
    @Autowired
    private DreamWeixinProperties weixinProperties;

    @Override
    protected void processInFollowEvent(InFollowEvent inFollowEvent) {
        OutTextMsg outMsg = new OutTextMsg(inFollowEvent);
        outMsg.setContent("关注消息~");
        render(outMsg);
    }

    @Override
    protected void processInTextMsg(InTextMsg inTextMsg) {
        System.out.println(weixinProperties.getWxaConfig().getAppId());
        OutTextMsg outMsg = new OutTextMsg(inTextMsg);
        outMsg.setContent(inTextMsg.getContent());
        render(outMsg);
    }

    @Override
    protected void processInMenuEvent(InMenuEvent inMenuEvent) {
        OutTextMsg outMsg = new OutTextMsg(inMenuEvent);
        outMsg.setContent("菜单消息~");
        render(outMsg);
    }
}

这个控制器最原始的代码是我照搬这个框架的demo的,主要是一个例子
做完这些我们运行一下,如果控制台不报错我们在继续
2.配置外网穿透
说到外网穿透自然是免费的最好了,因为我们只是个人偶尔使用
natapp官网
时间长了,我也忘了当时是怎么注册得了,想学的自己弄吧(总不至于一个注册还要教吧?那干脆别当程序员了)

natapp官网教程
在这里插入图片描述
这是我的配置,记住本地端口配到你的boot项目配置的端口就行了
在这里插入图片描述
启动natapp,复制下域名填到测试号接口配置信息URL在这里插入图片描述

点击提交,出现配置成功即建立起与微信官网接口的联系在这里插入图片描述
然后我们测试一下
用你的微信扫一下测试号界面中间的二维码关注一下
在这里插入图片描述在这里插入图片描述
后台显示的信息是微信传递过来的信息,是xml类型的
在这里插入图片描述
微信开发文档有介绍,我这里就不说了,文档是每一个攻城狮或者程序员必须了解的东西
如果只是讲解方法也是太过于无趣了,不如我们来点有难度的,没兴趣或者基础的可以不看下边的了
扩展
首先建立连接是微信根据appid,appsecret,token进行的验证
开发文档中也有这样的一段说明
在这里插入图片描述
不严谨的,我们写个接口也不用校验直接原样将echoster发给微信服务器也可以对接成功,不过这样一来安全性大大的降低了,不是微信服务器的请求也会被直接对接

解析流程:
1.我们先来创建一个控制器WeiXinTestController,加上注解

@RestController
public class WeiXinTestController {
    @GetMapping("/weixin")
    public void test(String signature,String timestamp,String nonce,String echostr){
        System.out.println(signature);
        System.out.println(echostr);

    }

}

运行项目,然后把微信配置的url由“/weixin/wx”改成“/weixin”提交
可以看到后台打印出在这里插入图片描述
证明信息接收到了,这里接收参数太多可以写成对象实体,我就不写了,省点劲,这里也只是稍微讲点原理,也不是彻底剖析这个快速开发框架,水平还不到
那接下来就好办了,根据开发文档的校验流程去写

在这里插入图片描述

@RestController
public class WeiXinTestController {
    @GetMapping("/weixin")
    public void test(String signature,String timestamp,String nonce,String echostr){
        String token = "123456";
        String[] array = new String[]{token, timestamp, nonce};
        Arrays.sort(array);
        String tempStr = array[0] + array[1] + array[2];
        tempStr = EncryptUtils.getShaUseApacheCodec(tempStr,"SHA-1");
        System.out.println(tempStr);
        System.out.println(signature);

    }

}

这里用了一个加解密工具,是开源中国找到的(不用也可以,直接用依赖的加密方法)https://my.oschina.net/hongchq/blog/70348
还需要导入依赖

<dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>
package com.test.weixin.controller;



import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

import java.security.MessageDigest;



/**
 * 加密方式工具类 (JDK1.6以上)
 */
public class EncryptUtils {

    /**
     * 使用指定的加密算法加密字符串<br>
     * @param text 待加密的字符串
     * @param encName 加密方法,为null时默认为SHA-256,可以为SHA-1,MD5,SHA-256,SHA-384,SHA-512
     * @return
     */
    public static byte[] degestString(String text, String encName) {
        MessageDigest md = null;
        byte[] bt = text.getBytes();
        try {
            if (null == encName) {
                encName = "SHA-256";
            }
            md = MessageDigest.getInstance(encName);
            md.update(bt);
            return md.digest();
        } catch (Throwable t) {
            t.printStackTrace();
        }
        return null;
    }

    /**
     * BASE64加密
     * @param origin 待机解密的byte数组
     * @return
     */
    public static byte[] encryptBASE64(byte[] origin) {
        if (origin == null) {
            return null;
        }
        return Base64.encodeBase64(origin);
    }

    /**
     * BASE64解密,采用Apache的commons-codec包中方法,不建议使用sun自己的
     * @param dest 待解密的字节数组
     * @return
     */
    public static byte[] decryptBASE64(byte[] dest) {
        if (dest == null) {
            return null;
        }
        return Base64.decodeBase64(dest);
    }

    /**
     * 使用Apache的codec加密,使用MD5算法<br>
     * 注意:返回的字符串为小写,请比较时注意
     * @param text 待加密的字符串
     * @return
     */
    public static String getMd5UseApacheCodec(String text) {
        if (null == text) {
            return null;
        }
        return DigestUtils.md5Hex(text);
    }

    /**
     * 使用Apache的codec加密,使用SHA算法<br>
     * 注意:返回值为小写字符,请比较时注意
     * @param text 待加密的字符串
     * @param algorithm 加密算法 SHA-1,SHA-256,SHA-384,SHA-512
     * @return
     */
    public static String getShaUseApacheCodec(String text, String algorithm) {
        if (text == null) {
            return null;
        }
        if (null == algorithm) {
            return DigestUtils.shaHex(text);
        } else {
            if ("SHA-1".equals(algorithm)) {
                return DigestUtils.shaHex(text);
            } else if ("SHA-256".equals(algorithm)) {
                return DigestUtils.sha256Hex(text);
            } else if ("SHA-384".equals(algorithm)) {
                return DigestUtils.sha384Hex(text);
            } else if ("SHA-512".equals(algorithm)) {
                return DigestUtils.sha512Hex(text);
            } else {
                return null;
            }
        }
    }

}

这点java反而感觉写着难了,加解密没接触过,水平还是太低了
至于框架的签名校验部分我也找到了
项目这里
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大概107行,用ctrl+左键找着就行了,对于这框架我毕竟不常用,而且快速开发嘛,对着文档会用就行了,提升水平才来找根源
至于这一个接口是怎么处理那么多事件(关注,消息,推广链接等)就是在于微信发送的消息了
在这里插入图片描述
微信发送的消息是xml数据包,本质还是字符串,以字符串接收过来进行xml方式的解析,然后找对应的格式就知道是什么类型的推送了,这里就不用多说了,可以直接找这个快速框架来学习
在这里插入图片描述
这个就是它的消息控制了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值