微信公衆平臺開發(1)-接入指南

接入指南 java

第一步:申請消息接口 web

登陸https://mp.weixin.qq.com/ 後,在公衆平臺後臺管理頁面 – 開發者中心頁,點擊「修改配置」按鈕,填寫URL、Token和EncodingAESKey, spring

其中URL是開發者用來接收微信服務器數據的接口URL。Token可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。 apache

EncodingAESKey由開發者手動填寫或隨機生成,將用做消息體加解密密鑰。同時,開發者可選擇消息加解密方式:明文模式、兼容模式和安全模式。 api

模式的選擇與服務器配置在提交後都會當即生效,請開發者謹慎填寫及選擇。加解密方式的默認狀態爲明文模式, 安全

選擇兼容模式和安全模式須要提早配置好相關加解密代碼,詳情請參考消息體簽名及加解密部分的文檔。  服務器

第二步:驗證URL有效性 微信

開發者提交信息後,微信服務器將發送GET請求到填寫的URL上,GET請求攜帶四個參數: app

參數 描述 網站

signature  微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。

timestamp  時間戳

nonce  隨機數

echostr  隨機字符串

開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。

加密/校驗流程以下:

1. 將token、timestamp、nonce三個參數進行字典序排序

2. 將三個參數字符串拼接成一個字符串進行sha1加密

3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信

檢驗signature的JAVA示例代碼:

 

import java.io.IOException; import java.util.Arrays; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.company.project.util.Util; import javacommon.base.BaseRestSpringController; @Controller @RequestMapping("/wxapi") public class WeixinApiController extends BaseRestSpringController<Object, java.lang.Long>{ public static final Logger log = Logger.getLogger(WeixinApiController.class); public static final String WX_TOKEN = "weixin"; /** * 微信回調地址 * * @author qincd * @throws IOException * @date Nov 3, 2014 4:01:42 PM */ @RequestMapping(method=RequestMethod.GET) public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException { // 微信會在配置的回調地址上加上signature,nonce,timestamp,echostr4個參數
String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); log.info("微信傳遞的參數:"); log.info("signature:"+signature); log.info("timestamp:"+timestamp); log.info("nonce:"+nonce); log.info("echostr:"+echostr); // 1).排序
String sortString = sort(WX_TOKEN, timestamp, nonce); // 2).加密
String mytoken = Util.sha1(sortString); // 3).校驗簽名
if (StringUtils.isNotEmpty(mytoken) && mytoken.equals(signature)) { log.info("簽名校驗經過。"); response.getWriter().println(echostr); } else { log.warn("簽名校驗失敗。"); } } /** * 將token,timestamp,nonce按字典序排序,並返回拼接的字符串 * * @author qincd * @date Nov 3, 2014 4:09:43 PM */
public static String sort(String token,String timestamp,String nonce) { String[] strArray = {token,timestamp,nonce}; Arrays.sort(strArray); StringBuilder sbuilder = new StringBuilder(); for (String str : strArray) { sbuilder.append(str); } return sbuilder.toString(); } } import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.log4j.Logger; public class Util { private static Logger log = Logger.getLogger(Util.class); /** * sha1加密 * * @author qincd * @date Nov 3, 2014 4:16:39 PM */
public static String sha1(String str) { if (str == null || str.length() == 0) return ""; try { MessageDigest md = MessageDigest.getInstance("SHA1"); byte[] bytes = md.digest(str.getBytes()); return byte2Hex(bytes); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); log.error("SHA1加密出錯:" + e.getMessage()); throw new RuntimeException("SHA1加密出錯"); } } public static String byte2Hex(byte[] data) { if (data == null || data.length == 0) return ""; StringBuilder sbu = new StringBuilder(); for (int i=0;i<data.length;i++) { if ((data[i] & 0xff) < 0x10) { sbu.append("0"); } sbu.append(Integer.toHexString(data[i] & 0xff)); } return sbu.toString(); } }

第三步:成爲開發者

驗證URL有效性成功後即接入生效,成爲開發者。若是公衆號類型爲服務號(訂閱號只能使用普通消息接口),能夠在公衆平臺網站中申請認證,認證成功的服務號將得到衆多接口權限,以知足開發者需求。

此後用戶每次向公衆號發送消息、或者產生自定義菜單點擊事件時,響應URL將獲得推送。

公衆號調用各接口時,通常會得到正確的結果,具體結果可見對應接口的說明。返回錯誤時,可根據返回碼來查詢錯誤緣由。全局返回碼說明

用戶向公衆號發送消息時,公衆號方收到的消息發送者是一個OpenID,是使用用戶微信號加密後的結果,每一個用戶對每一個公衆號有一個惟一的OpenID。

此外請注意,微信公衆號接口只支持80接口。

相關文章
相關標籤/搜索