关于微信接收事件以及推送消息相关的java开发

写这个博客,希望能够帮助刚开始进行微信公众号开发的新手们(当然也包括我自己):

在这个地方找到公众号的AppID、AppSecret、并且设置IP白名单(就是你的服务器的ip)。因为本文涉及微信调用消息的接口,所以启用了服务器的配置,注意该选项中的服务器地址一定是能够接受微信服务器xml流并且返回一个信息的方法。我采用的是ssm框架,所以写的地址是一个controller的方法。令牌是自己设置的。下面上代码

@Controller
@RequestMapping("/weixinCon")
public class WeixinController {
@Resource
private OutBoundService outBoundService;//订单
@Resource
private OrderDetailService orderDetailService;

@RequestMapping(value = "/chat")
public void get(HttpServletRequest request, HttpServletResponse response)
throws IOException {
try {


// 获取了扫码的人的openID
Map map = parseXml(request);
String openID = (String) map.get("FromUserName");
String scene_str=(String) map.get("EventKey");//订单ID
System.out.println(scene_str+"==="+System.currentTimeMillis());
String orderid="";
if(scene_str.contains("qrscene_")){
orderid=scene_str.substring(8);
}
int order_id=Integer.parseInt(orderid);
// log.info((String) map.get("EventKey"));
// log.info((String) map.get("Event"));//SCAN
if (((String) map.get("Event")).equals("SCAN")) {
// 调用微信推送消息接口
AdvancedUtil.getKFsendMsg(openID, count);
OutBound outBound=outBoundService.getByOpenId(openID);
System.out.println(outBound);
if(outBound==null){
outBound.setIntegral(count);
int r=outBoundService.updateOpenIdAndIntegral(outBound);
System.out.println(r+"===null输出结果");
}else{
outBound.setIntegral(outBound.getIntegral()+count);
int r=outBoundService.updateIntegral(outBound);
System.out.println(r+"===输出结果");
}
}
} catch (Exception e1) {
e1.printStackTrace();
}

// 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
String signature = request.getParameter("signature") == null ? ""
: request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp") == null ? ""
: request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce") == null ? "" : request
.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr") == null ? "" : request
.getParameter("echostr");


PrintWriter out = null;
try {
out = response.getWriter();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,否则接入失败
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.write(echostr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
out.close();
out = null;
}
}

微信加密是必须反馈给微信服务器的。

猜你喜欢

转载自blog.csdn.net/guojing1173132123/article/details/79000166