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

處理get請求的類如下:
/**
*@ClassName: WeixinController
*@Description: 響應(yīng)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("請求進(jìn)來了...");
// 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。
String signature =request.getParameter("signature");
// 時(shí)間戳
String timestamp =request.getParameter("timestamp");

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