微信后臺怎么確保你填的url有效呢?
最近在研究微信公眾號的開發。 這些文章是我的筆記。
首先,你需要有一個公眾號并注冊。 現在個人只能注冊訂閱號。 訂閱號部分接口未開放。 我們只好先看看它的開放接口。
我們先登錄后臺,看看公眾平臺的開發者文檔,《開發者必讀》中的《接入指南》。 我建議您仔細閱讀本指南。
先簡單說一下微信公眾號的發展。 有了微信公眾號之后,需要有一個服務器(可以用百度bae,或者新浪sae或者阿里云服務器),登錄微信公眾號后臺,進入最左邊的菜單“開發” - “基本配置”,您可以啟用服務器配置。
在這里,您填寫服務器地址 url 和令牌(有關詳細信息,請參閱文檔)。 你要確保你填寫的url有響應。 然后,當有人向你的公眾號發送消息時,微信服務器會將消息發送到你配置的url,然后將你的url的響應返回給其他人。 大致過程是這樣的。
指南非常清晰,并提供了php代碼示例,我們要做的就是將其翻譯成java版本。 我指的是這個博客。 第一次訪問的代碼比較簡單,所以基本都是直接copy過來的。 特此說明,對方博客目前無法訪問。
其實這第一篇我們要做的就是配置并提供一個可以響應微信服務器的url。 那么武漢公眾號運維,微信后臺如何保證你填寫的url有效呢? 當你在服務器配置中填寫你的url,點擊確定后,微信服務器會向填寫的服務器地址URL發送GET請求。 GET請求攜帶四個參數:
范圍
描述
微信加密簽名結合了開發者填寫的token參數、請求中的參數、nonce參數。
時間戳
隨機數
隨機數
隨機字符串
如果你的url可以響應這個請求,首先要驗證,》如果確認GET請求來自微信服務器,請原樣返回參數內容,則訪問生效,成為開發者成功,否則訪問將失敗。”
驗證方法如下:
加密/校驗流程如下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源于微信
不知道大家看到這里有沒有疑惑呢? 你是不是覺得:如果我不驗證,就直接返回參數的內容? 微信后臺能讓我配置成功嗎? 我自己試了一下,答案是肯定的! 為什么? 因為只要返回你配置的url,微信后臺就會認為你的url可以正確響應,可用。 至于你有沒有真的驗證過,微信服務器不知道。 之所以要驗證,是為了確認請求來自微信服務器。 反正微信告訴你驗證方法。 如果你不去驗證武漢公眾號運維,由此帶來的安全問題是你自己的事。

處理get請求的類如下:
/**
*@ClassName: WeixinController
*@Description: 響應Controller
*@author zhutulang
*@date 2016年1月4日
*@version V1.0
*/
@Controller
@RequestMapping("/weixinCon")
public class WeixinController {
private Logger log =Logger.getLogger(WeixinController.class);
@RequestMapping(method =RequestMethod.GET)
public void get(HttpServletRequest request,HttpServletResponse response) {
log.info("請求進來了...");
// 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
String signature =request.getParameter("signature");
// 時間戳
String timestamp =request.getParameter("timestamp");

// 隨機數
String nonce =request.getParameter("nonce");
// 隨機字符串
String echostr =request.getParameter("echostr");
PrintWriter out = null;
try {
out = response.getWriter();
// 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,否則接入失敗
if (SignUtil.checkSignature(signature,timestamp, nonce)) {
out.print(echostr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
out.close();
out = null;
}
}
}
