天天看點

微信訂閱号之連接配接伺服器

前言

不得不說,最近有點忙了,剛剛換了項目組,現在單獨負責一個微信公衆号好以及淘寶聯盟接口的對接服務。就是有關淘寶優惠券分發的這樣一個系統。因為沒有接觸過微信,是以對我來說是個學習的機會哦。

再說說最近的一件事吧,最近有個網友找到我問了我一些關于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";


}

      

3、将代碼放到伺服器上,如果成功就會儲存

繼續閱讀