公众号开启开发者模式

来源:互联网 发布:大白菜安装linux iso 编辑:程序博客网 时间:2024/04/26 04:37

1、公众号开启开发者模式之后,就需要通过代码去生成目录;

2、可以让我们随心所欲地去给公众号用户端发现各种消息;

3、如何开启:





直接上代码:

package com.wp.index.user;


import java.io.OutputStream;
import java.util.Date;
import java.util.Map;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.wp.index.BasicController;
import com.wp.util.weixin2.BaseMessage;
import com.wp.util.weixin2.Constant;
import com.wp.util.weixin2.MessageUtil;
import com.wp.util.weixin2.TextMessage;
import com.wp.util.weixin2.WeixinUtil;


public class WeixinContoller extends BasicController {
private static final Logger LOG = LoggerFactory.getLogger(WeixinContoller.class);


public void index() {
HttpServletRequest req = getRequest();
HttpServletResponse resp = getResponse();
try {
String echostr = getPara("echostr");
Map<String, String> paramsMap = new MessageUtil().parseXml(req);
String openId = paramsMap.get("FromUserName");
String weixinName = paramsMap.get("ToUserName");
String createTime = paramsMap.get("CreateTime");
String msgType = paramsMap.get("MsgType");
String content = paramsMap.get("Content");
String magId = paramsMap.get("MsgId");
String event = paramsMap.get("Event");
String eventKey = paramsMap.get("EventKey");


LOG.info(new StringBuffer().append("FromUserName|").append(openId)
.append(",ToUserName|").append(weixinName)
.append(",CreateTime|").append(createTime)
.append(", MsgType|").append(msgType)
.append(", Content|").append(content)
.append(", MsgId|").append(magId)
.append(", Event|").append(event)
.toString());


String signature = getPara("signature");
String timestamp = getPara("timestamp");
String nonce = getPara("nonce");


if (WeixinUtil.validate(signature, timestamp, nonce)) {
String responseXML = new String();


if (Constant.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) {
if(StringUtils.isNotEmpty(content)){
responseXML = buildTextResponseXML(openId,
"客服上班时间为9:00-18:00\n\n请先详细描述您的问题,看到您的消息后,客服第一时间会给您回复哦!/:rose", 
weixinName);
}
} else if (Constant.REQ_MESSAGE_TYPE_EVENT.equals(msgType)) {
if (Constant.EVENT_TYPE_SUBSCRIBE.equals(event)) {
responseXML = buildTextResponseXML(openId, 
"欢迎来到有猜才有财,全世界最好玩的游戏就在这里,元宝、现金来就送,超多福利等你来领,<a href=\"http://game.wzcc8.com/user/index\">点击马上游戏~</a>", 
weixinName);

if (Constant.EVENT_TYPE_CLICK.equals(event)) {
if(StringUtils.isNotEmpty(eventKey) && "SEND_MESSAGE_TIP".equals(eventKey)){
responseXML = buildTextResponseXML(openId, 
"PC端也可以登录玩游戏啦!登录网址:<a href=\"http://game.wzcc8.com/login\">http://game.wzcc8.com/login</a>登录账号密码可在游戏任务设置。", 
weixinName);
}

}
if (responseXML == null) {
execResponse(resp, echostr);
} else {
execResponse(resp, responseXML);
}
} else {
LOG.error("Validate signature failure");
}
} catch (Exception e) {
execResponse(resp, getPara("echostr"));
LOG.error("Process error", e);
}
renderNull();
}


private String buildTextResponseXML(String openId, String content, String weixinName) {
TextMessage textMessage = new TextMessage();
textMessage.setContent(content);
//拼接消息回复的xml
setBaseAttribute(textMessage, openId, weixinName);
return new MessageUtil().textMessageToXml(textMessage);
}

private void setBaseAttribute(BaseMessage message, String openId, String weixinName) {
message.setToUserName(openId);
message.setFromUserName(weixinName);
message.setCreateTime(new Date().getTime());
message.setMsgType(Constant.RESP_MESSAGE_TYPE_TEXT);
}


private void execResponse(HttpServletResponse resp, String content) {
try {
if (content == null) {
return;
}
LOG.debug("Rresponse message: " + content);
OutputStream output = resp.getOutputStream();
output.write(content.getBytes("UTF-8"));
output.flush();
} catch (Exception e) {
LOG.error("execResponse error", e);
}
}

}



package com.wp.util.weixin2;


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;


import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.kit.PropKit;


public class WeixinTool {
private static final Logger log = LoggerFactory.getLogger(WeixinTool.class);


// 菜单创建(POST) 限100(次/天)
private static String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
// 获取access_token的接口地址(GET) 限200(次/天)
private final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";


public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();


URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);


httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);


// if ("GET".equalsIgnoreCase(requestMethod))
httpUrlConn.connect();


// 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}


// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);


String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
jsonObject = JSON.parseObject(buffer.toString());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return jsonObject;
}


private static AccessToken getAccessToken(String appid, String appsecret) {
AccessToken accessToken = null;
String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
if (null != jsonObject && jsonObject.getString("access_token") != null) {
accessToken = new AccessToken();
accessToken.setToken(jsonObject.getString("access_token"));
accessToken.setExpiresIn(jsonObject.getIntValue("expires_in"));
} else {
log.error(jsonObject.toJSONString());
}
return accessToken;
}


private static int createMenu(Menu menu, String accessToken) {
System.out.println("###############################################create menu...");
int result = 0;


String url = menu_create_url.replace("ACCESS_TOKEN", accessToken);


String jsonMenu = "{"
+ "     \"button\":["
+ "      {"
+ "           \"name\":\"热门游戏\","
+ "  \"sub_button\":["
+ "               {"
+ "                   \"type\":\"view\","
+ "                   \"name\":\"猜猜乐\","
+ "                   \"url\":\"http://new.wzcc8.com/user/index\""
+ "               },"
+ "                {"
+ "                   \"type\":\"view\","
+ "                   \"name\":\"大转盘\","
+ "                   \"url\":\"http://new.wzcc8.com/user/cj\""
+ "                }"
+ " ]"
+ "       },"
+ "      {"
+ "           \"name\":\"游戏大厅\","
+ "           \"type\":\"view\","
+ "           \"url\":\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx32372222223334455公众号&redirect_uri=http%3A%2F%2Fnew.wzcc8.com&response_type=code&scope=snsapi_base&state=123#wechat_redirect\""
+ "       },"
+ "      {"
+ "           \"name\":\"我的福利\","
+ "  \"sub_button\":["
+ "                {"
+ "                   \"type\":\"view\","
+ "                   \"name\":\"每日福利\","
+ "                   \"url\":\"http://new.wzcc8.com/user/index2\""
+ "                },"
+ "                {"
+ "                   \"type\":\"view\","
+ "                   \"name\":\"排行榜\","
+ "                   \"url\":\"http://new.wzcc8.com/user/ranking\""
+ "                },"
+ "               {"
+ "                   \"type\":\"click\","
+ "                   \"name\":\"PC端登录\","
+ "                   \"key\":\"SEND_MESSAGE_TIP\""
+ "               },"
+ "                {"
+ "                   \"type\":\"view\","
+ "                   \"name\":\"设置PC账号\","
+ "                   \"url\":\"http://new.wzcc8.com/reg\""
+ "                }"
+ " ]"
+ "       }"
+ "]}";





JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);


if (null != jsonObject) {
if (0 != jsonObject.getIntValue("errcode")) {
result = jsonObject.getIntValue("errcode");
System.out.println("create menu failed, errcode:" + jsonObject.getIntValue("errcode") + " errmsg:"
+ jsonObject.getString("errmsg"));
} else {
System.out.println("create menu success");
}
}


System.out.println("###############################################crate done");
return result;
}


private static JSONObject queryMenu(String accessToken) {
System.out.println("###############################################query menu:");
return httpRequest("https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" + accessToken, "POST", null);
}


private static JSONObject deleteMenu(String accessToken) {
System.out.println("###############################################delete menu...");
return httpRequest("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + accessToken, "POST", null);
}


private static JSONObject getTicket(String accessToken, String outputStr) {
System.out.println("###############################################getTicket...");
return httpRequest("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + accessToken, "POST",
outputStr);
}


static String token = null;


static String getToken() {
if (token != null) {
return token;
}


AccessToken accessToken = getAccessToken(PropKit.get("appID"), PropKit.get("appsecret"));// 线上用的
log.info(JSON.toJSONString(accessToken));
token = accessToken.getToken();


return token;
}


// public static String getQRC(String deviceId) {
// JSONObject ticketJson = getTicket(getToken(),
// "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"" + deviceId
// + "\"}}}");
// return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticketJson.getString("ticket");
// }


public static void main(String[] args) {
String token = getToken();
System.out.println("token:" + token);
String ot = "q";
if ("c".equals(ot))
createMenu(new Menu(), token);
else if ("d".equals(ot))
System.out.println(deleteMenu(token));
else if ("q".equals(ot))
System.out.println(queryMenu(token));
else if ("t".equals(ot))
System.out.println(getTicket(token,
"{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\":{\"scene\": {\"scene_str\":\"0aaaade6eac30b3bb989d02d6c024bb1\"}}}"));
else
System.out.println("unknown args");
}
}


class MyX509TrustManager implements X509TrustManager {


public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}


public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}


public X509Certificate[] getAcceptedIssuers() {
return null;
}
}


class AccessToken {
private String token;
private int expiresIn;


public String getToken() {
return token;
}


public void setToken(String token) {
this.token = token;
}


public int getExpiresIn() {
return expiresIn;
}


public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}


class Menu {
}




原创粉丝点击