1. 程式人生 > >微信公眾號開發筆記(一):配置公眾號開發模式

微信公眾號開發筆記(一):配置公眾號開發模式

寫部落格向來是直接乾貨走起,廢話不多說:

1.註冊微信公眾號就不多說了,

2.在進行配置公眾號之前先成為開發者,成為開發者需要進行身份驗證

3.進行微信公眾號的配置

    1.微信AppId和AppSecret直接可以在控制平臺拿到

    2.進行域名設定

JS介面安全域名: 此域名是進行呼叫微信js-sdk時需要驗證的域名。所有js-sdk元素都有在這個域名下。不需要新增http開頭。

網頁授權域名:是進行關注公眾號進行網頁授權用的回撥域名。請注意,這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協議頭,但是必須指到專案上,可自行判斷是否加專案名,一般線上環境不需要加專案名,本地花生殼測試環境會新增專案名;詳情檢視https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

   3.進行伺服器配置

URL必須為可直接訪問路徑,用於微信伺服器進行確認伺服器是通的。

Token為自定義的和微信伺服器約定值,儘量用數字。

程式碼例項:

URL介面實現程式碼

    /**
	 * 微信請求 即url
	 * @return
	 */
	@RequestMapping(value="/wechatEvent")
	public void wechatEvent(HttpServletRequest request, HttpServletResponse response){
		try {
			String signature = request.getParameter("signature");// 微信加密簽名
			String timestamp = request.getParameter("timestamp");// 時間戮
			String nonce = request.getParameter("nonce"); // 隨機數
			String echostr = request.getParameter("echostr"); // 隨機字串

			if(!StringUtils.isEmpty(echostr)){
			  //簽名驗證  此處就是處理伺服器驗證的,將隨機串返回微信伺服器
			   if(CheckSignature.checkSignature(signature, timestamp, nonce)==true) {
				  jsonOut(echostr);
			   }
		  	}else{
				ServletInputStream in=request.getInputStream();
				response.setCharacterEncoding("utf-8");
				//將微信訊息轉換為實體類
				EventMessage message= XMLConverUtil.convertToObject(new EventMessage().getClass(), in);
				//關注事件
				if (message.getEvent().toLowerCase().equals(MessageType.SUBSCRIBE)) {
					StringBuffer url = request.getRequestURL();
					String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getContextPath()).toString();
					message.setUrl(tempContextUrl);
					logger.info(message.getFromUserName());					
				}
				JsonUtil.toJSONString("接收到使用者發來訊息==="+message);
				//處理微信訊息
				String xml= WechatServiceUtil.getWechatMessageAndSendMessageToWechat(message);
				if (!StringUtils.isEmpty(xml)){
					response.getWriter().write(xml);//回覆訊息
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("微信請求異常====》"+e);
		}
			
	}

校驗方法checkSignature:

package com.chinatsp.wechat.util;

import com.chinatsp.wechat.bean.WechatBean;
import org.apache.log4j.Logger;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class CheckSignature {
	private Logger log = Logger.getLogger(getClass());

    /**
	 * 加密/校驗
	 * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
	 public static boolean checkSignature(String signature, String timestamp, String nonce) { 
        //此處TOKEN為微信伺服器後臺自定義的 token值,這裡只是進行了封裝bean,可自行獲取處理
		String[] arr = new String[] { WechatBean.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]);
		}

		// 將三個引數字串拼接成一個字串進行sha1加密
		MessageDigest md = null;
		String tmpStr = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
			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;

	 }

    /**
	 *將byte陣列轉換成字型串
	 * @param byteArray
	 * @return
	 */
	private 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;
	}

	public String getSignature(String jsapi_ticket,String noncestr,String timestamp,String url) {
		log.info("jsapi_ticket"+jsapi_ticket);
		String signature="";
		String a="jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
			// 將三個引數字串拼接成一個字串進行sha1加密
			byte[] digest = md.digest(a.getBytes());
			signature = byteToStr(digest);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return signature.toLowerCase();
	}
}

啟動專案,進行伺服器配置成功儲存,提示配置成功即代表通訊成功。

到此,基本上配置介紹了 。

附錄:下圖再配一張測試公眾號的配置概覽圖以供參考

 

 

如果看完此文章還有不明白的地方,請戳此處https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319