知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
您當(dāng)前位置>首頁 » 新聞資訊 » 公眾號相關(guān) >
java微信公眾號開發(fā)之各種事件推送
發(fā)表時(shí)間:2020-11-5
發(fā)布人:葵宇科技
瀏覽次數(shù):52
1.配置微信公眾服務(wù)器
2.提前下好公眾號SHA1算法生成安全簽名類
/**
* SHA1 class
*
* 計(jì)算公眾平臺的消息簽名接口.
*/
public class SHA1 {
/**
* 用SHA1算法生成安全簽名
* @param token 票據(jù)
* @param timestamp 時(shí)間戳
* @param nonce 隨機(jī)字符串
* @param encrypt 密文
* @return 安全簽名
*/
public static String getSHA1(String token, String timestamp, String nonce, String encrypt)
{
try {
String[] array = new String[] { token, timestamp, nonce, encrypt };
StringBuffer sb = new StringBuffer();
// 字符串排序
Arrays.sort(array);
for (int i = 0; i < 4; i++) {
sb.append(array[i]);
}
String str = sb.toString();
// SHA1簽名生成
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(str.getBytes());
byte[] digest = md.digest();
StringBuffer hexstr = new StringBuffer();
String shaHex = "";
for (int i = 0; i < digest.length; i++) {
shaHex = Integer.toHexString(digest[i] & 0xFF);
if (shaHex.length() < 2) {
hexstr.append(0);
}
hexstr.append(shaHex);
}
return hexstr.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
3.創(chuàng)建一個(gè)接口,就是配置公眾號服務(wù)的接口
//微信公眾號驗(yàn)證
@RequestMapping("openWx/gzhVerification")
public String gzhVerification(HttpServletRequest request){
log.info("微信公眾號驗(yàn)證");
String signature=request.getParameter("signature");
String timestamp=request.getParameter("timestamp");
String nonce=request.getParameter("nonce");
String echostr=request.getParameter("echostr");
String token="token";//這里填基本配置中的token
String jiami="";
try {
jiami= SHA1.getSHA1(token, timestamp, nonce,"");//這里是對三個(gè)參數(shù)進(jìn)行加密
if(echostr!=null && jiami.equals(signature)){
log.info("第一次申請驗(yàn)證成功");
return echostr;
}
//判斷是否是公眾號發(fā)來的請求
if(jiami==null || !jiami.equals(signature)){
log.info("錯(cuò)誤的請求");
return null;
}
//----------------------事件推送
Map<String, String> stringStringMap = parseXml(request);
//---按鈕事件
if("CLICK".equalsIgnoreCase(stringStringMap.get("Event"))){
log.info("按鈕事件");
//因?yàn)橹挥幸粋€(gè)按鈕所以不用判斷key了
String fromUserName = toXML(stringStringMap.get("FromUserName"),stringStringMap.get("ToUserName"));
log.info("fromUserName:"+fromUserName);
//發(fā)送消息
return fromUserName;
//關(guān)注公眾號數(shù)據(jù)
}else if("subscribe".equalsIgnoreCase(stringStringMap.get("Event")) && stringStringMap.get("EventKey")==null && stringStringMap.get("Ticket")==null){
log.info("關(guān)注公眾號");
customerWxGzhService._add(stringStringMap.get("FromUserName"),null);
//取消關(guān)注
}else if("unsubscribe".equalsIgnoreCase(stringStringMap.get("Event"))) {
log.info("取消關(guān)注");
customerWxGzhService._delete(stringStringMap.get("FromUserName"));
//二維碼關(guān)注
}else if("subscribe".equalsIgnoreCase(stringStringMap.get("Event")) && stringStringMap.get("EventKey")!=null && stringStringMap.get("Ticket")!=null){
log.info("二維碼關(guān)注");
//獲取二維碼參數(shù)值
String eventKey =stringStringMap.get("EventKey");
eventKey= eventKey.substring(8);
customerWxGzhService._add(stringStringMap.get("FromUserName"),eventKey);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* dom4j 解析 xml 轉(zhuǎn)換為 map
* @param request
* @return
* @throws Exception
*/
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
// 將解析結(jié)果存儲在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 從request中取得輸入流
InputStream inputStream = request.getInputStream();
// 讀取輸入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子節(jié)點(diǎn)
List<Element> elementList = root.elements();
// 遍歷所有子節(jié)點(diǎn)
for (Element e : elementList)
map.put(e.getName(), e.getText());
// 釋放資源
inputStream.close();
inputStream = null;
return map;
}
//發(fā)送聯(lián)系我們
public String toXML(String toUserName,String fromUserName){
StringBuilder sb = new StringBuilder();
sb.append("<xml>");
sb.append("<ToUserName><![CDATA["+toUserName+"]]></ToUserName>");
sb.append("<FromUserName><![CDATA["+fromUserName+"]]></FromUserName>");
sb.append("<CreateTime>"+System.currentTimeMillis()/1000+"</CreateTime>");
sb.append("<MsgType><![CDATA[text]]></MsgType>");
sb.append("<Content><![CDATA[您好]]></Content>");
sb.append("</xml>");
return sb.toString();
}
公眾號事件的提示只有一個(gè)接口 就是不斷判斷Event參數(shù)來處理事件,
相關(guān)案例查看更多
相關(guān)閱讀
- 貴州小程序開發(fā)
- 微信小程序
- 云南網(wǎng)站建設(shè)優(yōu)化
- 網(wǎng)站建設(shè)服務(wù)公司
- 買小程序被騙
- 云南科技公司
- 云南etc小程序
- 小程序模板開發(fā)公司
- 小程序
- 快排推廣
- 排名
- 云南網(wǎng)站優(yōu)化公司
- 網(wǎng)站建設(shè)列表網(wǎng)
- 小程序被騙
- 汽車拆解管理軟件
- Web開發(fā)框架
- 汽車回收管理
- 報(bào)廢車管理
- 小程序用戶登錄
- 網(wǎng)站開發(fā)哪家好
- flex
- 云南網(wǎng)站建設(shè)報(bào)價(jià)
- 人人商城
- 報(bào)廢車拆解回收管理系統(tǒng)
- 云南網(wǎng)站維護(hù)
- 北京小程序開發(fā)
- 正規(guī)網(wǎng)站建設(shè)公司
- 跳轉(zhuǎn)小程序
- 網(wǎng)站開發(fā)公司哪家好
- 小程序被攻擊