1、微信订阅号之连接服务器
前言
Github:https://github.com/HealerJean
不得不说,最近有点忙了,刚刚换了项目组,现在单独负责一个微信公众号好以及淘宝联盟接口的对接服务。就是有关淘宝优惠券分发的这样一个系统。因为没有接触过微信,所以对我来说是个学习的机会哦。
再说说最近的一件事吧,最近有个网友找到我问了我一些关于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