看了波总在群里给一个兄弟的回复,刚开始想按波总的思路搞,其实很简单,甚至都没有自己写拦截器 @jfinal
微信的每个touser 和fromuser都是不一样的,就根据传过来的原始ID与系统的用户表匹配,然后查询出相应信息,包括生成菜单、配置的回复消息什么的之类,思路就这样。
新建一张公众账号的数据库表 ,保存公众号的appid ,appsecret,原始ID等,当然,还有一个字段和系统用户表关联,如user_id
新建一张系统用户表,如sys_user ,其中有user_id
Controller如下,BsPublic是我的微信公众账号信息表 ,bsmsg表是配置的关键字表(微信的菜单都有个event_key,即在这个表里配置对应关系,或自动消息回复也可以依此配置)
public class WechatCtrl extends WeixinController {
/**
* 获取userid
* @param oriId 微信的原始ID
*/
private int getUserId(String oriId){
int userId = BsPublic.dao.getByOriId(oriId).getInt("user_id");
return userId;
}
//
protected void processInTextMsg(InTextMsg inTextMsg) {
int userId = getUserId(inTextMsg.getToUserName());
BsReceivedMsg bsReceivedMsg = new BsReceivedMsg();
bsReceivedMsg.set("user_id",userId);
bsReceivedMsg.set("msg_type","text");
bsReceivedMsg.set("msg_content",inTextMsg.getContent());
bsReceivedMsg.set("msgid",inTextMsg.getMsgId());
bsReceivedMsg.set("sender_openid",inTextMsg.getFromUserName());
bsReceivedMsg.save();
OutTextMsg outTextMsg = new OutTextMsg(inTextMsg);
outTextMsg.setContent("您的消息已记录,如果有需要,我们将会在2个工作日内答复您");
render(outTextMsg);
}
//关注时回复(这里是从bsmsg表根据key取到的信息,当然也需要用user_id条件)
protected void processInFollowEvent(InFollowEvent inFollowEvent) {
int userId = getUserId(inFollowEvent.getToUserName());
BsMsg bsMsg = BsMsg.dao.getByKey(userId,"follow_msg");
OutTextMsg outTextMsg = new OutTextMsg(inFollowEvent);
outTextMsg.setContent(bsMsg.getStr("msg_content"));
render(outTextMsg);
}
}
生成菜单的简单代码如下
public class PublicMenuCtrl extends BaseController {
/**
* 生成
*/
public void generate(){
String userId = getPara("u");
String str = BsMenu.dao.getJsonMenu(userId);
Map<String, String> postParams=new HashMap<String,String>();
postParams.put("body",str);
BsPublic bsPublic = BsPublic.dao.getByUserId(userId);
renderJson(WechatUtil.generateMenu(bsPublic.getStr("app_id"), bsPublic.getStr("app_secret"), postParams));
}
}
基本上就这样,感觉还是挺简单的,并且暂时没有发现什么问题。