微信开发-回调模式

前言

越来越多的企业借助微信平台做开发,下面记录最近开发微信项目(企业号)一些关键设置、原理及代码

一:添加应用

关注企业微信号后,点击企业号,能看到该企业号下的应用列表,它类似我们常见后台中的模块或栏目,首先我们要创建自己的应用。

二:设置应用为回调模式

创建好应用后,把应用设置成回调模式,按要求设置回调URL及密钥。保存时它会访问URL,只有URL能正确访问信息时才能保存成功,否则一直会提示失败

  原理

以下摘自微信开发文档:

验证URL有效性

当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功。

参数 描述 是否必带
msg_signature 微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体
timestamp 时间戳
nonce 随机数
echostr 加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文 首次校验时必带

企业通过参数msg_signature对请求进行校验,如果确认此次GET请求来自企业号,那么企业应用对echostr参数解密并原样返回echostr明文(不能加引号,不能带bom头,不能带换行符),则接入验证生效,回调模式才能开启。

实操

为了能正确验证URL有效性,还需要以下操作

首先,我们需要一台服务器,并且有一个域名指向了该服务器,在该服务器上配置好网站。把验证URL的代码放置在该服务器上。wxpush代码如下:

package com.bf.weixin;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bf.meal.entity.App;
import com.qq.weixin.mp.aes.AesException;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;

public class wxpush extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        WXBizMsgCrypt wxcpt = null;
        try {
            wxcpt = new WXBizMsgCrypt(App.getToken(), App.getEncodingAESKey(), App.getCorpID());
        } catch (AesException e1) {
            e1.printStackTrace();
        }

        // 解析出url上的参数值如下:
        String sVerifyMsgSig = request.getParameter("msg_signature");
        String sVerifyTimeStamp = request.getParameter("timestamp");
        String sVerifyNonce = request.getParameter("nonce");
        String sVerifyEchoStr = request.getParameter("echostr");
        App.logger.info("url:" + request.getQueryString());

        String sEchoStr; //需要返回的明文

        try {
            sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr);
            App.logger.info("verifyurl echostr: " + sEchoStr);

            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println(sEchoStr);
            out.flush();
            out.close();
        } catch (Exception e) {
            App.logger.error(e);
            e.printStackTrace();
        }
    }
}

注:需要到微信官网上下载

com.qq.weixin.mp.aes.AesException;

com.qq.weixin.mp.aes.WXBizMsgCrypt;

当然web.xml中还得有如下节点

  <servlet-mapping>
        <servlet-name>wxpush</servlet-name>
        <url-pattern>/servlet/wxpush</url-pattern>
    </servlet-mapping>

配置好后,应该能正确的访问URL(http://*.*.com.cn/meal/servlet/wxpush),把该URL作为微信后台填写的值,此时应该能正确保存了。

三:获取用户帐号信息

要针对企业号关注用户做一些应用,最重要一点是要识别该用户,以便能正确区分不同的用户。

根据文档OAuth2.0验证接口说明, 建议的方案

1、企业应用中的URL链接直接填写企业自己的页面地址

2、成员跳转到企业页面时,企业校验是否有代表成员身份的cookie,此cookie由企业生成

3、如果没有获取到cookie,重定向到OAuth验证链接,获取成员身份后,由企业生成代表成员身份的cookie

4、根据cookie获取成员身份,进入相应的页面

我的做法是,配置Filter拦截所有jsp或.do文件的请求,在Filter中先去Cookie,如果Cookie不存在,则调用OAuth2.0获取信息,具体还是看关键代码

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        String userId = getUserId(request, response);
……
时间: 2024-10-10 23:30:00

微信开发-回调模式的相关文章

微信企业号回调模式配置讲解 Java Servlet+Struts2版本 echostr校验失败解决

微信企业号回调模式配置讲解 Java Servlet+Struts2版本 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.security.InvalidKeyException:illegal Key Size 也就是echostr校验失败,请您检查是否正确解密并输出明文echostr这个错误 企业微信登陆地址http://qy.weixin.qq.com/ 配置成功以后 Servlet public void doGet(Htt

微信企业号回调模式验证与发送消息

最近放假闲着无聊,研究了一下微信企业号, 打算通过企业号做一个运维报警信息发送的功能,记录自己的操作 第一步 注册企业号,网上一搜一大把的教程,这里略过  微信企业号登录地址  https://qy.weixin.qq.com/ 第二步  登录后 点左侧 应用中心 -新建应用 第三步  在第二步第一图中的自建应用下面找到刚刚新建的应用 拉到最下面有一个模式选择,点击回调模式 会看到下图界面 Token 和EncodingAESKey 点击随机获取即可,上面的url需要你有自己的服务地址  你的服

python 微信企业号-回调模式接收微信端客户端发送消息并被动返回消息

说明:此代码用于接收手机微信端发送的消息 #-*- coding:utf-8 -*- from flask import Flask,request from WXBizMsgCrypt import WXBizMsgCrypt import xml.etree.cElementTree as ET import sys app = Flask(__name__) @app.route('/index',methods=['GET','POST']) def index():         s

微信企业号开发之回调模式的接口开发

一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信的信息,转发到用户提供的一个回调接口上,该接口解析用户发送过来的信息,解析后进行相应,而且回调模式中,可以调用的东西不少,扫码,图片,视频,地理位置信息等. 在应用的模式下,选择回调模式,之后,需要设置3个参数(1.回调接口URL:2.token:3.ASESKey),URL就是提供的回调接口,微信

微信企业号开发(1)WebAPI在回调模式中的URL验证

微信回调模式的官方文档. 开发语言:C#(微信相关功能代码可以从官网下载) 首先,必须要明确几个参数,这几个参数在微信企业号中,每次调用都会使用到. 1.msg_signature:签名(已加密,加密方法可从官网下载) 2.timestamp:时间戳 3.nonce:随机数 4.echostr:随机字符串(已加密) 注:前面3个参数每次都会自动带上,属于必填项,第4个参数只有在首次校验URL时(意思就是点下图中的“保存”按钮时,可能不准确,先这样理解吧)才会带上. 针对上图的说明: 1.URL:

如何用php开启企业微信开发的回调模式

猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/api/doc#10128 看似很好理解(并不,背后封装了不算简单的加密方法) 获取参数->解密->输出解密后的参数 然而却因为一个函数引用传参知识点的缺失而困扰了许久 public function VerifyURL($sMsgSignature, $sTimeStamp, $sNonce,

微信企业号开发:启用回调模式

微信企业号开发如何启用回调模式?就是简单的登陆PC版微信,点击应用中心,选择需要应用,再点击回调模式启用? 似乎不是这么简单!! 可以看到核心的只有三个URL,Token,EncodingAESKey这三个参数可以随便填写吗?1URL可以随便填写吗? 可以肯定的是,不能随便填写.不信你可以试试.因为点击确定后微信会给这个URL发送信息.因此这个URL必须是外网可以访问的地址.而且后台还必须处理微信发送过来的信息.例如URL 是http://www.hao123.com/可以在外网方法,但点击保存

.net之微信企业号开发(三) 回调模式的接口开发

一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信的信息,转发到用户提供的一个回调接口上,该接口解析用户发送过来的信息,解析后进行相应,而且回调模式中,可以调用的东西不少,扫码,图片,视频,地理位置信息等. 在应用的模式下,选择回调模式,之后,需要设置3个参数(1.回调接口URL:2.token:3.ASESKey),URL就是提供的回调接口,微信

微信公众平台企业号开发—开启回调模式

2014年9月17日,微信发布了期待已久的企业号.网上关于企业号的教程几乎还是0,所以这里分享一下的我的开发经验. 对比于订阅号和服务号的开发,企业号的开发显得更加复杂一点.这大概也是腾讯考虑到企业信息安全性要求比较高的缘故,在消息的收发和一些验证上都增加了加密解密的操作.这就需要开发者认真去阅读官方说明(其实通过官方说明你可以解决几乎所有问题),接下来我开启回调模式的步骤: 1.申请企业号:这个步骤这里就不详细赘述了,可以参考 http://jingyan.baidu.com/article/

C#微信企业号开发二:配置回调模式与接入验证

转载请附加本文链接:http://www.cnblogs.com/hispring/p/4496575.html(Created by Aaron) 官方提供了针对不同语言开发的包,下载地址为:下载地址 一.配置回调模式 填写url.token.encodingAESKey即可. 在这里进行配置后,微信会在我们填写的url后附加几个参数用以进行验证,格式如下: http://xxxx?msg_signature=xxxx&timestamp=xxxx&nonce=xxxx&echo