欢迎访问宙启技术站
智能推送

JAVA微信开发总结的代码分享

发布时间:2023-05-16 19:09:10

本文是针对JAVA微信开发过程中的总结以及开发经验做的一份总结,包括微信公众号菜单配置以及消息处理等方面。下面我将分享一些相关的代码实现。

首先,我们需要在微信公众平台中配置菜单,代码实现如下:

public class WechatMenuUtil {
    private static Logger log = LoggerFactory.getLogger(WechatMenuUtil.class);
    public static void createMenu(String menu) {
        String accessToken = AccessTokenUtil.getAccessToken().getToken();
        String url = "https://api.weixin.qq" +
                ".com/cgi-bin/menu/create?access_token=" + accessToken;
        JSONObject result = JSONObject.parseObject(HttpUtil.sendPost(url,menu));
        if (result.getInteger("errcode")!=0){
            log.error("菜单创建失败:"+result.toJSONString());
        }else {
            log.info("菜单创建成功");
        }
    }
}

其中,AccessTokenUtil类负责向微信服务器请求获取access_token。HttpUtil类用于发起http请求,对应代码如下:

public class HttpUtil {
    private static Logger log = LoggerFactory.getLogger(HttpUtil.class);
    public static String sendGet(String url){
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response;
        try {
            response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                String result = EntityUtils.toString(entity, "UTF-8");
                return  result;
            }
        } catch (IOException e) {
            log.error("http请求出错",e);
        }
        return null;
    }

    public static String sendPost(String url,String data){
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setHeader("Content-Type","application/json;charset=UTF-8");
        StringEntity stringEntity = new StringEntity(data,Charset.forName("UTF-8"));
        httpPost.setEntity(stringEntity);
        CloseableHttpResponse response;
        try {
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                String result = EntityUtils.toString(entity, "UTF-8");
                return  result;
            }
        } catch (IOException e) {
            log.error("http请求出错",e);
        }
        return null;
    }
}

接着,我们需要处理微信公众号接收到的请求消息,主要涉及到文本、图片、语音、视频和链接消息处理,对应代码如下:

public class WechatMessageService implements MessageService {

    private static final Logger log = LoggerFactory.getLogger(WechatMessageService.class);

    @Override
    public String processTextMessage(TextMessage textMessage) {
        // 处理文本消息
        return null;
    }

    @Override
    public String processImageMessage(ImageMessage imageMessage) {
        // 处理图片消息
        return null;
    }

    @Override
    public String processVoiceMessage(VoiceMessage voiceMessage) {
        // 处理语音消息
        return null;
    }

    @Override
    public String processVideoMessage(VideoMessage videoMessage) {
        // 处理视频消息
        return null;
    }

    @Override
    public String processLinkMessage(LinkMessage linkMessage) {
        // 处理链接消息
        return null;
    }

    @Override
    public String processLocationMessage(LocationMessage locationMessage) {
        // 处理地理位置消息
        return null;
    }

    @Override
    public String processSubscribeEvent(SubscribeEvent subscribeEvent) {
        // 处理关注公众号事件
        return null;
    }

    @Override
    public String processUnsubscribeEvent(UnsubscribeEvent unsubscribeEvent) {
        // 处理取消关注公众号事件
        return null;
    }

    @Override
    public String processClickEvent(ClickEvent clickEvent) {
        // 处理点击菜单事件
        return null;
    }

    @Override
    public String processViewEvent(ViewEvent viewEvent) {
        // 处理点击链接菜单事件
        return null;
    }

    @Override
    public String processScanEvent(ScanEvent scanEvent) {
        // 处理用户扫描带参二维码事件
        return null;
    }

    @Override
    public String processLocationEvent(LocationEvent locationEvent) {
        // 处理用户上报地理位置事件
        return null;
    }
}

根据实际需求,具体实现消息处理方法即可。

最后,我们需要将接收到的消息回复给用户,注:此处需要自行实现加密解密和xml转化等处理,具体实现可参考官方文档或者第三方开源库。

`

public class WechatResponder {

private static Logger log = LoggerFactory.getLogger(WechatResponder.class);

public static String buildTextResponse(String fromUser,String toUser,String content){

long createTime = System.currentTimeMillis() / 1000;

String xml = "<xml>";

xml += "<ToUserName><![CDATA["+fromUser+"]]></ToUserName>";

xml += "<FromUserName><![CDATA["+toUser+"]]></FromUserName>";

xml += "<CreateTime>"+createTime+"</CreateTime>";

xml += "<MsgType><![CDATA[text]]></MsgType>";

xml += "<Content><![CDATA["+content+"]]></Content>";

xml +="</xml>";

log.info("回复文本消息:{}",xml);

return xml;

}

public static String buildImageResponse(String fromUser,String toUser,String mediaId){

long createTime = System.currentTimeMillis() / 1000;

String xml = "<xml>";

xml += "<ToUserName><![CDATA["+fromUser+"]]></ToUserName>";

xml += "<FromUserName><![CDATA["+toUser+"]]></FromUserName>";

xml += "<CreateTime>"+createTime+"</CreateTime>";

xml += "<MsgType><![CDATA[image]]></MsgType>";

xml += "<Image><MediaId><![CDATA["+mediaId+"]]></MediaId></Image>";

xml +="</xml>";

log.info("回复图片消息:{}",xml);

return xml;

}

public static String buildVoiceResponse(String fromUser,String toUser,String mediaId){

long createTime = System.currentTimeMillis() / 1000;

String xml = "<xml>";

xml += "<ToUserName><![CDATA["+fromUser+"]]></ToUserName>";

xml += "<FromUserName><![CDATA["+toUser+"]]></FromUserName>";

xml += "<CreateTime>"+createTime+"</CreateTime>";

xml += "<MsgType><![CDATA[voice]]></MsgType>";

xml += "<Voice><MediaId><![CDATA["+mediaId+"]]></MediaId></Voice>";

xml +="</xml>";

log.info("回复语音消息:{}",xml);

return xml;

}

public static String buildVideoResponse(String fromUser,String toUser,String mediaId){

long createTime = System.currentTimeMillis() / 1000;

String xml = "<xml>";

xml += "<ToUserName><![CDATA["+fromUser+"]]></ToUserName>";

xml += "<FromUserName><![CDATA["+toUser+"]]></FromUserName>";

xml += "<CreateTime>"+createTime+"</CreateTime>";

xml += "<MsgType><![CDATA[video]]></MsgType>";

xml += "<Video><MediaId><![CDATA["+mediaId+"]]></MediaId></Video>";

xml +="</xml>";

log.info("回复视频消息:{}",xml);

return xml;

}

public static String buildMusicResponse(String fromUser,String toUser,String title,String description,String musicUrl,String hqMusicUrl,String thumbMediaId){

long createTime = System.currentTimeMillis() / 1000;

String xml = "<xml>";

xml += "<ToUserName><![CDATA["+fromUser+"]]></ToUserName>";

xml += "<FromUserName><![CDATA["+toUser+"]]></FromUserName>";

xml += "<CreateTime>"+createTime+"</CreateTime>";

xml += "<MsgType><![CDATA[music]]></MsgType>";

xml += "<Music>";

xml += "<Title><![CDATA["+title+"]]></Title>";

xml += "<Description><![CDATA["+description+"]]></Description>";

xml += "<MusicUrl><![CDATA["+musicUrl+"]]></MusicUrl>";

xml += "<HQMusicUrl><![CDATA["+hqMusicUrl+"]]></HQMusicUrl>";

xml += "<ThumbMediaId><![CDATA["+thumbMediaId+"]]></ThumbMediaId>";

xml += "</Music>";

xml +="</xml>";

log.info("回复音乐消息:{}",xml);

return xml;

}

public static String buildNewsResponse(String fromUser,String toUser,List<WechatNews> newsList){

long createTime = System.currentTimeMillis() / 1000;

String xml = "<xml>";

xml += "<ToUserName><![CDATA["+fromUser+"]]></ToUserName>";

xml += "<FromUserName><![CDATA["+toUser+"]]></FromUserName>";

xml += "<CreateTime>"+createTime+"</CreateTime>";

xml += "<MsgType><![CDATA