微信公眾號開發——開發模式啟用及介面配置
1.1 在微信公眾平臺中的配置
在你剛申請公眾號之後你還不是開發者,需要你在微信公眾平臺的基本配置裡面授權成為開發者
授權之後你就會看到這樣的介面:
在這個頁面裡面拿到開發時所必要的資訊:appid、appsecret、
獲取appsecret需要點選啟用後通過管理員或者長期運營者授權之後才可以檢視,授權之後你會看到下面這樣的頁面,你需要把appsecret儲存起來以便於後續開發。
在檢視appsecret之後會出現ip白名單的選項:
點選配置ip白名單,ip白名單裡面填寫的ip是你當前伺服器的網路ip可以通過騰訊的提供的http://ip.qq.com進行檢視。
Ip白名單的作用:在後續建立選單獲取access_token的時候需要用到,還有在支付,調取相簿,回覆模板訊息等都需要用到,如果ip白名單配置的和你實際伺服器上的不一致,以上的功能都無法使用。切記這個也是個坑
以上三個引數獲取(appid、appsecret)配好(ip白名單)後就需要對介面進行配置了。
這裡需要填寫URL和Token兩個值。URL指的是能夠接收處理微信伺服器傳送的GET/POST請求的地址,並且是已經存在的,現在就能夠在瀏覽器訪問到的地址,這就要求我們先把公眾帳號後臺處理程式開發好(至少應該完成了對GET請求的處理)並部署在公網伺服器上。在介面配置資訊中的Token就要填寫什麼值,兩邊保持一致即可,沒有其他要求,建議用專案名稱、公司名稱縮寫等,我在這裡用的是專案名稱weixinCourse。也就是說要完成介面配置,只需要先完成微信伺服器的GET請求處理就可以?是的。 那這是為什麼呢?因為這是微信公眾平臺介面中定義的。
具體請參考API文件-訊息介面-訊息介面指南中的網址接入部分。文件連線如下:
上面寫的很清楚,其實你只要能理解上面在說什麼就OK了,至於怎麼編寫相關程式碼,我已經幫你完成了,請繼續往下看。
1.2建立公眾號後臺介面程式
首先建立一個web專案,在web專案中依賴進去Spring+Springmvc+SpringDataJpa+Hibernate+mysql+log4日誌依賴(框架和資料庫根據實際情況來我這裡用的是這些框架)。
注:依賴就不附上講解了,這裡主要以微信公眾號開發為主。
直接上程式碼:
首先建立一個核心處理類,核心處理類的請求路徑必須要和你在微信公眾號的基本配置下面伺服器配置中的請求路徑一致(下圖紅色框內的請求路徑配置一致),否則校驗不會通過,校驗的時候微信會給你在下圖中配置的伺服器地址傳送一個
然後在該類寫上get,和post的請求方法,你在微信公眾號配置或者修改基本配置中的伺服器配置完成後點選提交的時候微信會給你配置的url傳送一個get請求,請求的帶過來的數有四個(signature,timestamp,nonce,echostr)程式裡面通過這四個引數來判斷當前請求是否是微信傳送過來的,是就原樣返回echostr 不是就把傳過來的引數列印成日誌並給出提示,如下圖所示:
下面程式碼是對微信傳來的引數驗證工具類,這裡需要你在公眾號伺服器配置中配置的token來進行驗證
注意:程式中的token必須要和伺服器配置中的保持一致,不然配置會失敗
package com.xing.payment.weixinUtils.Util; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 請求校驗工具類 * * @author xr * @date 2018-05-28 */ @Component public class SignUtil { // 與介面配置資訊中的Token要一致 private static String token = ""; @Value("${server.token}") public void setToken(String token) { SignUtil.token = token; } /** * 驗證簽名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 將token、timestamp、nonce三個引數進行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 將三個引數字串拼接成一個字串進行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 將sha1加密後的字串可與signature對比,標識該請求來源於微信
return tmpStr !=null ?
tmpStr.equals(signature.toUpperCase()) :false; } /** * 將位元組陣列轉換為十六進位制字串 * * @param byteArray * @return */ public static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 將位元組轉換為十六進位制字串 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; } }
當把get請求寫好後就可以點選提交了如下圖所示:
成功會給出這個提示:
到這裡,介面配置、開發模式的開啟就都完成了,接下來要講的就是如何接收、處理、響應由微信伺服器轉發的使用者傳送給公眾帳號的訊息,也就是完成Post請求方法的編寫
以下是post,get請求的完整程式碼:
package com.xing.payment.weixinUtils.Controller; import com.xing.payment.weixinUtils.Service.MessageCoreService; import com.xing.payment.weixinUtils.Util.SignUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; 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 org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException;/** * 核心請求處理類 * @author xr * @date 2018-05-29 */@Controller @RequestMapping("/wechat/portal")@Slf4jpublic class WechatController { @Autowired private MessageCoreService messageCoreService; /** * 確認請求來自微信伺服器 * @param signature 微信加密簽名 * @param timestamp 時間戳 * @param nonce 隨機數 * @param echostr 隨機字串 * @return echostr */ @RequestMapping(method = {RequestMethod.GET}) @ResponseBody public String doGet(@RequestParam(value = "signature",
required = false) String signature, @RequestParam(value = "timestamp",
required = false) String timestamp, @RequestParam(value = "nonce",
required = false) String nonce, @RequestParam(value = "echostr",
required = false) String echostr) { log.info("\n接收到來自微信伺服器的認證訊息:[{}, {},{},{}]", signature,timestamp, nonce, echostr); System.err.println("echostr值是:"+echostr); // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回 echostr,表示接入成功,否則接入失敗 if (SignUtil.checkSignature(signature, timestamp, nonce)) { return echostr; } log.info("請求失敗:\n接收到來自微信伺服器的認證訊息:[{}, {}, {}, {}]", signature, timestamp, nonce, echostr); return "請求非法"; } /** * 處理微信伺服器發來的訊息 * @return */ @RequestMapping(method={RequestMethod.POST},produces="application/xml; charset=UTF-8") @ResponseBody public String dopost(HttpServletRequest request) throws UnsupportedEncodingException { // 呼叫核心業務類接收訊息、處理訊息 String respMessage = messageCoreService.processRequest(request); //響應訊息 return respMessage; } }
post請求主要用於處理使用者想公眾號傳送的訊息:
可以通過該連結進行檢視微信文件,主要關注下圖中紅框內的兩項:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453