前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

不得不说,最近有点忙了,刚刚换了项目组,现在单独负责一个微信公众号好以及淘宝联盟接口的对接服务。就是有关淘宝优惠券分发的这样一个系统。因为没有接触过微信,所以对我来说是个学习的机会哦。

再说说最近的一件事吧,最近有个网友找到我问了我一些关于cas自定义主题的问题,也是奇了怪了,就是出不来自定义的主题,service也能够匹配到,但是就是出不来。烦人,好了,烦心的事情不说了,下面开始我们的博文吧

1、准备

1、一台服务器

2、具备开发能力的微信公众号

2、接入服务器

2.1、先打开开发指南

可以看到须

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

2.1.1、controler接入请求

1、注意是Get方式

2、请求url前缀再微信公众号需要配置,这里提供给微信公众号进行验证


import com.duodian.youhui.admin.utils.WeChatValidateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

/**
 * @Desc: 微信Get请求验证
 * @Author HealerJean
 * @Date 2018/5/23  下午2:08.
 */
@Controller
@RequestMapping("weixin/test")
@Slf4j
public class WechatValidateController {

    /**
     * 验证微信服务器
     *
     * @param signature
     * @param timestamp
     * @param nonce
     * @param echostr
     */
    @RequestMapping(value = "", method = RequestMethod.GET)
    public void wechatService(PrintWriter out,
                              HttpServletResponse response,
                              HttpServletRequest request,
                              @RequestParam(value = "signature", required = false) String signature,
                              @RequestParam String timestamp,
                              @RequestParam String nonce,
                              @RequestParam String echostr) {

        log.info("\n接收到来自微信服务器的认证消息" +
                signature + "," + timestamp + "," + nonce + "," + echostr);
        if (WeChatValidateUtil.checkSignature(signature, timestamp, nonce)) {
            out.print(echostr);
        }
    }
}


2.1.2、验证秘钥逻辑


import com.duodian.youhui.admin.constants.WeChatMessageParams;

import java.util.Arrays;

/**
 * @Desc: 校验工具类
 * 开发者通过检验signature对请求进行校验(下面有校验方式)。
 * 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,
 * 成为开发者成功,否则接入失败。
 *
 * @Author HealerJean
 * @Date 2018/5/23  下午3:06.
 *
 *
 */
public class WeChatValidateUtil {
    //配置微信公众号时填写的Token

    public static boolean checkSignature(String signature, String timestamp, String nonce) {

        // 拼接字符串
        String[] arr = new String[] {WeChatMessageParams.WECHAT_TOAKEN, timestamp, nonce };
        // 排序
        Arrays.sort(arr);
        // 生成字符串
        StringBuffer content = new StringBuffer();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        // SHA1加密
        String tmp = DecriptUtil.SHA1(content.toString());
        return tmp.equals(signature);
    }
}

2.2.3、常亮工具类

1、下面没有给与赋值的原因是,我再开发的时候有一个测试的订阅号,再测试订阅号和线上订阅号不是同一个,所以我们设置为再启动SpringBoot的时候进行启动。这里没必要写上


import org.springframework.context.annotation.Profile;

/**
 * @Desc: 微信常亮参数
 * @Author HealerJean
 * @Date 2018/5/24  下午12:12.
 */
public class WeChatMessageParams {

    /**
     * 微信 appId
     */
    public static  String WECHAT_APPID ;

    /**
     *  微信appSecret
     */
    public static  String WECHAT_APPSECRET;


    /**
     * 微信 Toaken
     */
    public static  String WECHAT_TOAKEN ;



    // 各种消息类型,除了扫带二维码事件
    /**
     * 文本消息
     */
    public static final String MESSAGE_TEXT = "text";
    /**
     * 图片消息
     */
    public static final String MESSAtGE_IMAGE = "image";
    /**
     * 图文消息
     */
    public static final String MESSAGE_NEWS = "news";
    /**
     * 语音消息
     */
    public static final String MESSAGE_VOICE = "voice";
    /**
     * 视频消息
     */
    public static final String MESSAGE_VIDEO = "video";
    /**
     * 小视频消息
     */
    public static final String MESSAGE_SHORTVIDEO = "shortvideo";
    /**
     * 地理位置消息
     */
    public static final String MESSAGE_LOCATION = "location";
    /**
     * 链接消息
     */
    public static final String MESSAGE_LINK = "link";
    /**
     * 事件推送消息
     */
    public static final String MESSAGE_EVENT = "event";
    /**
     * 事件推送消息中,事件类型,subscribe(订阅)
     */
    public static final String MESSAGE_EVENT_SUBSCRIBE = "subscribe";
    /**
     * 事件推送消息中,事件类型,unsubscribe(取消订阅)
     */
    public static final String MESSAGE_EVENT_UNSUBSCRIBE = "unsubscribe";
    /**
     * 事件推送消息中,上报地理位置事件
     */
    public static final String MESSAGE_EVENT_LOCATION_UP = "LOCATION";
    /**
     * 事件推送消息中,自定义菜单事件,点击菜单拉取消息时的事件推送
     */
    public static final String MESSAGE_EVENT_CLICK = "CLICK";
    /**
     * 事件推送消息中,自定义菜单事件,点击菜单跳转链接时的事件推送
     */
    public static final String MESSAGE_EVENT_VIEW = "VIEW";


}


3、将代码放到服务器上,如果成功就会保存

1、服务器ip为:110.110.110.110/weixin/test

WX20180606-152243@2x

ContactAuthor