前言
不得不說,最近有點忙了,剛剛換了項目組,現在單獨負責一個微信公衆号好以及淘寶聯盟接口的對接服務。就是有關淘寶優惠券分發的這樣一個系統。因為沒有接觸過微信,是以對我來說是個學習的機會哦。
再說說最近的一件事吧,最近有個網友找到我問了我一些關于cas自定義主題的問題,也是奇了怪了,就是出不來自定義的主題,service也能夠比對到,但是就是出不來。煩人,好了,煩心的事情不說了,下面開始我們的博文吧
1、準備
1、一台伺服器
2、具備開發能力的微信公衆号
2、接入伺服器
2.1、先打開開發指南
可以看到須
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";
}