Spring Boot集成weixin4j

####1.weixin4j官方网站
http://www.weixin4j.org/

weixin4j入门视频传送门
weixin4j入门:https://v.qq.com/x/page/t0630doxoaz.html
weixin4j-spring-boot入门:https://v.qq.com/x/page/e0764lyx518.html

####2.weixin4j

weixin4j是一个用Java编写针对微信开发的工具包,为Java微信开发爱好者提供的微信公众开发平台SDK. 

项目地址:https://github.com/ansitech/weixin4j
####3.weixin4j-spring

weixin4j-spring主要是针对Spring MVC项目,集成了weixin4j,支持xml配置和注解配置bean.

####4.weixin4j-spring-boot-starter

这是为了集成spring boot而搭建的框架,所以针对weixin4j也做了一定的修改。
父项目名为weixin4j-spring-boot
其本身包含2个模块weixin4j-spring-boot-autoconfigure和weixin4j-spring-boot-starter。

####5.添加maven依赖pom.xml
好消息:weixin4j、weixin4j-spring、weixin4j-spring-boot-starter三大组件终于全部上maven了,可以直接pom引用了。
Spring Boot用户,直接添加依赖:

<dependency>
    <groupId>org.weixin4j.spring.boot</groupId>
    <artifactId>weixin4j-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

Spring MVC用户,直接添加依赖:

<dependency>
    <groupId>org.weixin4j</groupId>
    <artifactId>weixin4j-spring</artifactId>
    <version>1.0.0</version>
</dependency>

独立使用:

<dependency>
    <groupId>org.weixin4j</groupId>
    <artifactId>weixin4j</artifactId>
    <version>0.1.3</version>
</dependency>

####6.创建weixin4j配置
weixin4j的配置有2种方式:
第一种:使用weixin4j.properties配置文件
将配置文件放在资源目录即classess下名称为weixin4j.properties。
配置参数:

#微信SDK配置文件
#读取规则:优先读取System.getProperty()
#再从weixin4j.properties读取,key
#如果System.getProperty()与weixin4j.properties都没设置,则默认未NULL

#开发者调试设置
weixin4j.debug=true
#公众号Token
weixin4j.token=weixin4j

#公众号原始ID
weixin4j.oauth.originalid=
#开发者第三方用户唯一凭证
weixin4j.oauth.appid=
#开发者第三方用户唯一凭证密钥
weixin4j.oauth.secret=
#消息加密方式 0:明文模式(默认), 1:兼容模式, 2:安全模式(推荐)
weixin4j.oauth.encodingtype=0
#消息加密密钥(43位字符组成A-Za-z0-9)
weixin4j.oauth.encodingaeskey=0123456789abcedfghijklmnopqrstuvwxyzZXCVBNM
#网页安全授权URL
weixin4j.oauth.url=

#公众平台接口域名
#通用域名(api.weixin.qq.com),使用该域名将访问官方指定就近的接入点;
#上海域名(sh.api.weixin.qq.com),使用该域名将访问上海的接入点;
#深圳域名(sz.api.weixin.qq.com),使用该域名将访问深圳的接入点;
#香港域名(hk.api.weixin.qq.com),使用该域名将访问香港的接入点。
weixin4j.api.domain=api.weixin.qq.com

#微信支付_商户ID
weixin4j.pay.partner.id=
#微信支付_商户密钥
weixin4j.pay.partner.key=
#微信支付_通知URL
weixin4j.pay.notify_url=

#连接超时设置
weixin4j.http.connectionTimeout=25000
#请求超时设置
weixin4j.http.readTimeout=25000
#证书路径
weixin4j.http.cert.path=
weixin4j.http.cert.secret=

#默认消息处理函数
weixin4j.handler=org.weixin4j.spi.DefaultMessageHandler
weixin4j.message.handler.normal=org.weixin4j.spi.DefaultNormalMessageHandler
weixin4j.message.handler.event=org.weixin4j.spi.DefaultEventMessageHandler

第二种:基于spring boot的配置文件,application.properties或application.yml
application.properties配置参数:

#微信开发配置
#开发者第三方用户唯一凭证
weixin4j.config.appid=
#开发者第三方用户唯一凭证密钥
weixin4j.config.secret=
#公众号原始ID
weixin4j.config.originalid=
#消息加密方式 0:明文模式(默认), 1:兼容模式, 2:安全模式(推荐)
weixin4j.config.encodingtype=0
#消息加密密钥(43位字符组成A-Za-z0-9)
weixin4j.config.encodingaeskey=0123456789abcedfghijklmnopqrstuvwxyzZXCVBNM
#网页安全授权URL
weixin4j.config.oauthUrl=

#微信支付配置
#微信支付_商户ID,例如10000000001
weixin4j.payConfig.partnerId=
#微信支付_商户密钥,由商户设置32位字符
weixin4j.payConfig.partnerKey=
#微信支付_通知URL,异步接收微信支付结果的URL
weixin4j.payConfig.notifyUrl=
#证书路径(pk12格式),例如:/opt/cert/10000000001.pk12
weixin4j.payConfig.certPath=
#证书密钥,默认为商户ID,例如:10000000001
weixin4j.payConfig.certSecret=

application.yml配置参数:

weixin4j:
  #微信开发配置
  config:
    #开发者第三方用户唯一凭证
    appid:
    #开发者第三方用户唯一凭证密钥
    secret:
    #公众号原始ID
    originalid:
    #消息加密方式 0:明文模式(默认), 1:兼容模式, 2:安全模式(推荐)
    encodingtype: 0
    #消息加密密钥(43位字符组成A-Za-z0-9)
    encodingaeskey: 0123456789abcedfghijklmnopqrstuvwxyzZXCVBNM
    #网页安全授权URL
    oauthUrl: 
  #微信支付配置
  payConfig:
    #微信支付_商户ID,例如10000000001
    partnerId:
    #微信支付_商户密钥,由商户设置32位字符
    partnerKey:
    #微信支付_通知URL,异步接收微信支付结果的URL
    notifyUrl:
    #证书路径(pk12格式),例如:/opt/cert/10000000001.pk12
    certPath:
    #证书密钥,默认为商户ID,例如:10000000001
    certSecret:

####7.实现ITokenLoader,自主选择存储AccessToken方式
本例给大家演示了使用Redis缓存方式:

package com.ansitech.weixin4j;

import com.alibaba.fastjson.JSON;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.weixin4j.loader.ITokenLoader;
import org.weixin4j.model.base.Token;

@Component
public class RedisTokenLoader implements ITokenLoader {

    private static final Logger LOG = LoggerFactory.getLogger(RedisTokenLoader.class);

    private final String ACCESS_TOKEN_KEY = "ats_wx100000000001";
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public RedisTokenLoader(String appid) {
        this.appid = appid;
    }

    @Override
    public Token get() {
        String accessToken = stringRedisTemplate.opsForValue().get(ACCESS_TOKEN_KEY);
        LOG.info("wechat access_token:{}", accessToken);
        return JSON.parseObject(accessToken, Token.class);
    }

    @Override
    public void refresh(Token token) {
        LOG.info("refresh wechat access_token:{}", token.toString());
        String accessToken = JSON.toJSONString(token);
        //ticket.getExpires_in() - 600L,是为了提前10分钟过期
        stringRedisTemplate.opsForValue().set(ACCESS_TOKEN_KEY, accessToken, token.getExpires_in() - 600L, TimeUnit.SECONDS);
    }
}

####8.同理可以实现ITicketLoader

package com.ansitech.weixin4j.factory;

import com.alibaba.fastjson.JSON;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.weixin4j.loader.ITicketLoader;
import org.weixin4j.model.js.Ticket;
import org.weixin4j.model.js.TicketType;

@Component
public class RedisTicketLoader implements ITicketLoader {

    private static final Logger LOG = LoggerFactory.getLogger(RedisTicketLoader.class);

    private final String ACCESS_TOKEN_KEY = "ats_wx100000000001";
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Ticket get(TicketType ticketType) {
        String key = "";
        if (null != ticketType) {
            switch (ticketType) {
                case JSAPI:
                    key = "wechat_ticket_jsapi";
                    break;
                case WX_CARD:
                    key = "wechat_ticket_wxcard";
                    break;
                default:
                    key = "wechat_ticket";
                    break;
            }
        }
        String ticket = stringRedisTemplate.opsForValue().get(key);
        LOG.info("wechat ticket:{}", ticket);
        return JSON.parseObject(ticket, Ticket.class);
    }

    @Override
    public void refresh(Ticket ticket) {
        String key = "";
        if (null != ticket.getTicketType()) {
            switch (ticket.getTicketType()) {
                case JSAPI:
                    key = "wechat_ticket_jsapi_" + appid;
                    break;
                case WX_CARD:
                    key = "wechat_ticket_wxcard_" + appid;
                    break;
                default:
                    key = "wechat_ticket_" + appid;
                    break;
            }
        }
        LOG.info("refresh wechat ticket:{}", ticket.toString());
        String ticketValue = JSON.toJSONString(ticket);
        //ticket.getExpires_in() - 600L,是为了提前10分钟过期
        stringRedisTemplate.opsForValue().set(key, ticketValue, ticket.getExpires_in() - 600L, TimeUnit.SECONDS);
    }

}

####9.微信开发者接入
weixin4j-spring包内置了消息接入处理Controller,直接继承即可。

package com.ansitech.weixin4j.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.weixin4j.spring.web.WeixinJieruController;

/**
 * 微信开发者接入
 *
 * @author yangqisheng
 */
@Controller
@RequestMapping("/weixin/jieru")
public class JieruController extends WeixinJieruController {

}

####10.实现公众号普通消息处理
实现接口INormalMessageHandler即可

package com.ansitech.weixin4j.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.weixin4j.model.message.OutputMessage;
import org.weixin4j.model.message.normal.ImageInputMessage;
import org.weixin4j.model.message.normal.LinkInputMessage;
import org.weixin4j.model.message.normal.LocationInputMessage;
import org.weixin4j.model.message.normal.ShortVideoInputMessage;
import org.weixin4j.model.message.normal.TextInputMessage;
import org.weixin4j.model.message.normal.VideoInputMessage;
import org.weixin4j.model.message.normal.VoiceInputMessage;
import org.weixin4j.model.message.output.TextOutputMessage;
import org.weixin4j.spi.INormalMessageHandler;

/**
 * 公众号普通消息处理
 *
 * @author yangqisheng
 */
@Component
public class MyNormalMessageHandler implements INormalMessageHandler {

    @Override
    public OutputMessage textTypeMsg(TextInputMessage msg) {
        return new TextOutputMessage("你的消息已收到");
    }

    @Override
    public OutputMessage imageTypeMsg(ImageInputMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage voiceTypeMsg(VoiceInputMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage videoTypeMsg(VideoInputMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage shortvideoTypeMsg(ShortVideoInputMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage locationTypeMsg(LocationInputMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage linkTypeMsg(LinkInputMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

####11.实现公众号事件消息处理
实现IEventMessageHandler接口即可实现事件消息的处理。

package com.ansitech.weixin4j.service;

import org.weixin4j.model.message.OutputMessage;
import org.weixin4j.model.message.event.ClickEventMessage;
import org.weixin4j.model.message.event.LocationEventMessage;
import org.weixin4j.model.message.event.LocationSelectEventMessage;
import org.weixin4j.model.message.event.PicPhotoOrAlbumEventMessage;
import org.weixin4j.model.message.event.PicSysPhotoEventMessage;
import org.weixin4j.model.message.event.PicWeixinEventMessage;
import org.weixin4j.model.message.event.QrsceneScanEventMessage;
import org.weixin4j.model.message.event.QrsceneSubscribeEventMessage;
import org.weixin4j.model.message.event.ScanCodePushEventMessage;
import org.weixin4j.model.message.event.ScanCodeWaitMsgEventMessage;
import org.weixin4j.model.message.event.SubscribeEventMessage;
import org.weixin4j.model.message.event.UnSubscribeEventMessage;
import org.weixin4j.model.message.event.ViewEventMessage;
import org.weixin4j.model.message.output.TextOutputMessage;
import org.weixin4j.spi.IEventMessageHandler;

/**
 * 公众号事件消息处理
 *
 * @author yangqisheng
 */
public class MyEventMessageHandler implements IEventMessageHandler{

    @Override
    public OutputMessage subscribe(SubscribeEventMessage msg) {
        return new TextOutputMessage("感谢你的关注");
    }

    @Override
    public OutputMessage unSubscribe(UnSubscribeEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage qrsceneSubscribe(QrsceneSubscribeEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage qrsceneScan(QrsceneScanEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage location(LocationEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage click(ClickEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage view(ViewEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage scanCodePush(ScanCodePushEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage scanCodeWaitMsg(ScanCodeWaitMsgEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage picSysPhoto(PicSysPhotoEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage picPhotoOrAlbum(PicPhotoOrAlbumEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage picWeixin(PicWeixinEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public OutputMessage locationSelect(LocationSelectEventMessage msg) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

weixin4j官网链接:http://www.weixin4j.org/
免费开源~,喜欢我小伙伴可以加weixin4j官方VIP群,QQ群:473227872

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值