微信公众平台推送消息企业号怎么把java web应用推送到微信

微信公众平台开发——如何保证access_token长期有效?
发表于 09:20|
来源CSDN博客|
摘要:由CSDN和《程序员》杂志联合主办的2014年微信开发者大会将于8月23日在北京举行。CSDN优秀博主、畅销书作者柳峰受邀担任讲师,带来《智能客服与LBS开发的“坑”与解决之道》的主题演讲,欢迎来现场与柳峰深度沟通。
【编者按】由CSDN和《程序员》杂志联合主办的&将于8月23日在北京举行。内容涵盖企业服务号开发和高级应用、企业号开发、业务系统对接、高级接口运用、微信支付、智能客服与LBS、HTML5社交应用、微信电商、微信广告自助平台等多方面。作为一线微信开发商云集、专注在开发实践方面的顶级技术活动,到目前为止本次活动已经得到了业界的极大关注度。为此,主办方还总结了技术团队&。&&&&值得一提的是,CSDN优秀博主、畅销书《微信公众平台应用开发:方法、技巧与案例》的作者柳峰受邀做本次活动讲师之一,演讲主题《智能客服与LBS开发的“坑”与解决之道》。他在CSDN博客中()撰写了几十篇+的微信开发技术文章,多篇访问量都在3万+,以下这篇《&》摘自他的博客。全文如下:为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证。
access_token的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当access_token过期时,才需要再次调用接口获取access_token。在理想情况下,一个7x24小时运行的系统,每天只需要获取12次access_token,即每2小时获取一次。如果在有效期内,再次获取access_token,那么上一次获取的access_token将失效。
目前,获取access_token接口的调用频率限制为2000次/天,如果每次发送客服消息、获取用户信息、群发消息之前都要先调用获取access_token接口得到接口访问凭证,这显然是不合理的,一方面会更耗时(多了一次接口调用操作),另一方面2000次/天的调用限制恐怕也不够用。因此,在实际应用中,我们需要将获取到的access_token存储起来,然后定期调用access_token接口更新它,以保证随时取出的access_token都是有效的。
下面将为大家介绍如何定时获取并存储access_token。请注意:这不是一篇讲解如何调用接口获取access_token的文章,关于access_token的获取,请参考文章
在动手前先来简单分析一下,我们要解决的无非是如下两个问题:
1.如何定时获取access_token?
在Java中,如果要定时执行某项任务,需要用到java.util.Timer类,对于喜欢使用框架的朋友,可以采用
,Spring框架也支持quartz。除此这外,还有一种方法就是启动一个线程,在线程的run()方法中写一个死循环,然后使用Thread.sleep()来保证线程定时执行某项任务。
2.将access_token保存在哪?
对于access_token的存储,可以考虑存储在文件、数据库或内存中。具体采用哪种存储方式,需要根据项目实际情况而定。如果只有一台服务器,直接将access_token存储在内存中是最简便有效的方式。
在本文中,笔者将演示的定期获取并存储access_token的流程为:Web服务器启动时就加载一个Servlet,在Servlet的init()方法中启动一个线程,在线程的run()方法中通过死循环+Thread.sleep()的方式定期获取access_token,然后将获取到的access_token保存在public
static修饰的变量中。
在工程中创建一个InitServlet类,该类的代码如下:
package org.liufeng.weixin.
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import org.liufeng.weixin.thread.TokenT
import org.liufeng.weixin.util.WeixinU
import org.slf4j.L
import org.slf4j.LoggerF
* 初始化servlet
* @author liuyq
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
public void init() throws ServletException {
// 获取web.xml中配置的参数
TokenThread.appid = getInitParameter("appid");
TokenThread.appsecret = getInitParameter("appsecret");
("weixin api appid:{}", TokenThread.appid);
("weixin api appsecret:{}", TokenThread.appsecret);
// 未配置appid、appsecret时给出提示
if ("".equals(TokenThread.appid) || "".equals(TokenThread.appsecret)) {
log.error("appid and appsecret configuration error, please check carefully.");
// 启动定时获取access_token的线程
new Thread(new TokenThread()).start();
从上面的代码可以看出,InitServlet类只重写了init()方法,并没有重写doGet()和doPost()两个方法,因为我们并不打算让InitServlet来处理访问请求。init()方法的实现也比较简单,先获取在web.xml中配置的参数appid和appsecret,再启动线程TokenThread定时获取access_token。
InitServlet在web.xml中的配置如下:
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="2.5" xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
&a href="/xml/ns/javaee/web-app_2_5.xsd" "=""&/xml/ns/javaee/web-app_2_5.xsd"&/a&&
&servlet-name&initServlet&/servlet-name&
&servlet-class&
org.liufeng.weixin.servlet.InitServlet
&/servlet-class&
&!-- 配置获取access_token所需参数appid和appsecret --&
&init-param&
&param-name&appid&/param-name&
&param-value&wx617a123bb8bc99cd&/param-value&
&/init-param&
&init-param&
&param-name&appsecret&/param-name&
&param-value&4d82cbbbbb62d7hn3dcb8&/param-value&
&/init-param&
&load-on-startup&0&/load-on-startup&
&/servlet&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
InitServlet在web.xml中的配置与普通Servlet的配置有几点区别:1)通过配置&init-param&向Servlet中传入参数;2)通过配置&load-on-startup&使得Web服务器启动时就加载该Servlet;3)没有配置&servlet-mapping&,因为InitServlet并不对外提供访问。
TokenThread的源代码如下:
package org.liufeng.weixin.
import org.liufeng.weixin.pojo.AccessT
import org.liufeng.weixin.util.WeixinU
import org.slf4j.L
import org.slf4j.LoggerF
* 定时获取微信access_token的线程
* @author liuyq
public class TokenThread implements Runnable {
private static Logger log = LoggerFactory.getLogger(TokenThread.class);
// 第三方用户唯一凭证
public static String appid = "";
// 第三方用户唯一凭证密钥
public static String appsecret = "";
public static AccessToken accessToken =
public void run() {
while (true) {
accessToken = WeixinUtil.getAccessToken(appid, appsecret);
if (null != accessToken) {
("获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());
// 休眠7000秒
Thread.sleep((accessToken.getExpiresIn() - 200) * 1000);
// 如果access_token为null,60秒后再获取
Thread.sleep(60 * 1000);
} catch (InterruptedException e) {
Thread.sleep(60 * 1000);
} catch (InterruptedException e1) {
log.error("{}", e1);
log.error("{}", e);
代码中的第23行通过while(true){}构造了一个死循环(永久执行);第25行调用公众平台接口获取access_token;第29行让线程休眠7000秒再运行,即每隔7000秒获取一次access_token,保证access_token永不失效。在项目中的其他类,可以通过调用&TokenThread.accessToken.getToken()&来得到接口访问凭证access_token。在本地部署运行该程序,Tomcat启动完成后就会在控制台显示如下日志:[INFO ] weixin api appid:wx617a123bb8bc99cd
[INFO ] weixin api appsecret:4d82cbbbbb62d7hn3dcb8
[INFO ] 获取access_token成功,有效时长7200秒 token:sFopJ9lMmLl4u-ad61ojKpS0TolhN2s3SnHoI2Mh5GgdiYb35i-7DG2T2CDyQKMe 为了能够直观看到定期获取access_token的效果,可以试着将TokenThread里的线程休眠时间修改为30秒或60秒。最后,附上本文所涉及的项目源代码,下载地址:PS:日微信团队发布了修改access_token长度的通知,很多开发者问这次修改会对我们的程序产生什么影响,这里顺便回答一下:如果开发者将获取到的access_token存入数据库,就必须保证对应的字段长度足够大,至少能存储512个字符;如果开发者是将access_token存储在内存中,那什么都不需要修改。持续关注欢迎大家来现场与柳峰深度沟通,与他零距离互动,现场提问,柳峰将为你解答各种疑惑。&,更多详情参见官网。关注&,了解更多研发资讯,参与互动讨论;当然您可以向我们推荐更多有趣、有质量的文章。&
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章众所周知,微信企业号可以推送图文信息到成员微信号,但是无法像普通微信号之间发送位置一样把位置从企业号推送到成员微信号。为此,想到一个解决办法:可以在程序中将传过来的经纬度结合腾讯逆地理接口拼接成一个链接(类似http://apis./uri/v1/geocoder?coord=24..0818025&coord_type=1&refere=myapp这样的链接)推动到成员微信号,然后成员微信号点击就可在地图控件上查看位置。(这里之所以选用腾讯逆地理接口是因为微信自带腾讯地图插件,这样点开链接后仍然还在微信内,不会跳到其他浏览器或者app)
需要的jar包:
commons-codec-1.8.jar
commons-io-2.4.jar
wx\lib\commons-logging-1.1.3.jar
gson-2.2.2.jar
httpclient-4.3.5.jar
httpcore-4.3.2.jar
httpmime-4.3.5.jar
jackson-all-1.9.11.jar
jaxb-api-2.2.7.jar
jaxb-core-2.2.7.jar
jaxb-impl-2.2.7.jar
jsr173_api-1.0.jar
commons-lang-2.6.jar
commons-beanutils-1.8.3.jar
ezmorph-1.0.3.jar
json-lib-2.4-jdk15.jar
slf4j-api-1.6.6.jar
slf4j-log4j12-1.7.2.jar
slf4j-log4j12-1.7.2-sources.jar
commons-collections-3.2.jar
部分代码如下:
public class TestSendMes1 { &
// &发送消息 &
public static String SEND_MSG_URL = &https://qyapi./cgi-bin/message/send?access_token=ACCESS_TOKEN&; &
public static void main(String[] args) { &
& & //应用ID,账号,部门为&&,标签为&&,消息类型,内容 &
& & //部门不为&&,标签不为&&,将会给该部门的每个成员发送消息 &
& & Send_msg(&1&,&企业号成员昵称&,&news&,&本人报警&,&厦门市思明区斗西路光明大厦附近&,&http://apis./uri/v1/geocoder?coord=24..0818025&coord_type=1&refere=myapp&,&http://g./exp/w=480/sign=f8c54e3d3cdee/d0c8a786cc3df3d5641.jpg&);
&* @Description : 主动发送文字给企业用户&
public static int Send_msg(String agentid,String touser,String msgtype,String title,String description,String url,String picurl){ &
& & int errCode=0; &
& & //拼接请求地址 &
& & String requestUrl=SEND_MSG_URL.replace(&ACCESS_TOKEN&, &ComUtil.getAccessToken(&你的corpid&, &你的corpsecret&)); &
& & //需要提交的数据 &
& & String postJson = &{\&agentid\&:\&%s\&,\&touser\&:\&%s\&,\&msgtype\&:\&%s\&,\&news\&:{\&articles\&:[{\&title\&:\&%s\&,\&description\&:\&%s\&,\&url\&:\&%s\&,\&picurl\&:\&%s\&}]},\&safe\&:\&0\&}&; & & &
& & String outputStr=String.format(postJson,agentid,touser,msgtype, title,description,url,picurl); &
& & System.out.println(outputStr); &
& & //创建成员 &
& & JSONObject jsonObject=ComUtil.httpsRequest(requestUrl, &POST&, outputStr);
& & if(null!=jsonObject){ &
& & & & System.out.println(jsonObject.toString()+&=====&); &
// & & & & &int errcode = jsonObject.getInt(&errcode&); &
// & & & & &errCode=jsonObject.getInt(&errcode&); &
& & & & & & &&
& & return errC &
&* 通用工具类
public class ComUtil {
// 凭证获取(GET)
public final static String token_url = &https://qyapi./cgi-bin/gettoken?corpid=CORPID&corpsecret=CORPSECRET&;
* 发送https请求
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject =
// 创建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 conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes(&UTF-8&));
outputStream.close();
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, &utf-8&);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str =
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream =
conn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
System.out.println(&连接超时:{}&+ce);
} catch (Exception e) {
System.out.println(&https请求异常:{}&+e);
return jsonO
* 获取接口访问凭证
* @param corpid 凭证
* @param corpsecret 密钥
public static String getAccessToken(String corpid, String corpsecret) {
String access_token = &&;
String requestUrl = token_url.replace(&CORPID&, corpid).replace(&CORPSECRET&, corpsecret);
// 发起GET请求获取凭证
JSONObject jsonObject = httpsRequest(requestUrl, &GET&, null);
if (null != jsonObject) {
access_token = jsonObject.getString(&access_token&);
} catch (JSONException e) {
access_token =
// 获取token失败
System.out.println(&获取token失败 errcode:{} errmsg:{}---&+jsonObject.getInt(&errcode&)+&---&+ jsonObject.getString(&errmsg&));
return access_
&* 信任管理器
public class MyX509TrustManager implements X509TrustManager {
// 检查客户端证书
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// 检查服务器端证书
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// 返回受信任的X509证书数组
public X509Certificate[] getAcceptedIssuers() {
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1418次
排名:千里之外
(1)(1)(1)(1)(2)(1)您所在的位置: &
微信企业号的配置和使用
微信企业号的配置和使用
伍华聪的博客
企业号是继公众号、订阅号的另外一种微信类型,它主要是面对企业的。企业号是微信为企业客户提供的移动应用入口。可以帮助企业建立员工、上下游供应链与企业 IT 系统间的连接。利用 企业号 ,企业或第三方合作伙伴可以帮助企业快速、低成本的实现高质量的移动轻应用,实现生产、管理、协作、运营的 移动化 。
在本系列随笔的前面,主要就是介绍微信公众号的门户应用开发,最近把整个微信框架进行了扩展补充,增加了最新的企业号的API封装和开发,后续主要介绍如何利用C#进行微信企业号的开发工作,本篇作为微信企业号的开发的起步篇,介绍微信企业号的配置和使用。
1、微信企业号的注册和登陆
企业号是继公众号、订阅号的另外一种微信类型,它主要是面对企业的。企业号是微信为企业客户提供的移动应用入口。可以帮助企业建立员工、上下游供应链与企业 IT 系统间的连接。利用 企业号 ,企业或第三方合作伙伴可以帮助企业快速、低成本的实现高质量的移动轻应用,实现生产、管理、协作、运营的 移动化 。
个人觉得企业号最大的亮点是可以不限数量的消息发送,也就是可以在企业员工之间畅通交流。相对于公众号和订阅号,发送消息的谨慎程度,微信企业号可谓给人眼前一亮的感觉。不过微信企业号是需要内部建立好通讯录,关注者需要匹配通讯录的微信号、邮箱、电话号码任一个通过才可以关注,也就是可以防止其他外来人员的自由关注了,另外如果为了安全考虑,还可以设置二次验证,也就是一个审核过程。
企业号的认证和公众号一样,需要提供相关的企业资质文件,并且认证每年都要收取费用,否则可能有人员和功能的一些限制。觉得微信真是想着方法赚钱,目前已有的收费模式有,订阅号、公众号、企业号、开放平台,好像都有认证收费的了,而且微信小店也还需要收2万的押金,一切都是钱呀。
好了,其他不多说,微信的注册地址是:https://qy.,一个邮箱不能同时注册微信公众号和微信企业号。
对于企业开通企业号并开始使用需要四步
1)&企业到微信官网(&http://qy.&)申请开通;
2)&开通后,企业在企业号管理后台导入成员,发布二维码;
3)&企业调用企业号&api&与企业自有系统对接开发;
4)&员工关注,收到微信信息,在微信中与企业交互
注册好企业号,就可以通过微信扫一扫,扫描企业二维码进行登录了,扫描的时候,需要微信进行确认,才可以继续输入密码进行登录,操作界面如下所示(左边是手机截图,右边是网页截图)。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M00/4B/1E/wKioL1QoGqLiQBvnAABAZXxjgW4369.jpg" />&498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M00/4B/1C/wKiom1QoGnnS_nhkAABJusZ-8W4132.jpg" width="370" height="477" />
登录后我们就可以看到对应的电脑端的管理界面了。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M02/4B/1E/wKioL1QoGqKzDxHuAABWxYwWjVw537.jpg" />
2、设置开发回调模式
如果开发过微信公众号,那么我们就知道,如果需要在微信服务器和网站服务器之间建立连接关系,实现消息的转发和处理,那么就应该设置一个回调模式,需要配置好相关的参数。然后在自己&网站服务器里面建立一个处理微信服务器消息的入口。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M01/4B/1E/wKioL1QoGqLiAL3nAAAnhhu_bvM694.jpg" />&
进入配置后,我们需要修改相关的URL、Token、EncodingAESKey等参数,主要是URL,这个就是和公众号的入口处理一样的,需要我们发布到网站服务器上的处理入口。
Token和AESKey可以根据提示动态生成一个即可,AESKey好像必须是23位的,所以这个一般是让它自己生成的,这个主要用来加密解密使用的。
URL、Token、EncodingAESKey三个参数说明。
1)URL是企业应用接收企业号推送请求的访问协议和地址,支持http或https协议。
2)Token可由企业任意填写,用于生成签名。
3)EncodingAESKey用于消息体的加密,是AES密钥的Base64编码。
验证URL、Token以及加密的详细处理请参考后续 &接收消息时的加解密处理& 的部分。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M02/4B/1C/wKiom1QoGnqSDNzSAABl_aEGS-I645.jpg" width="436" height="310" />
我公司的企业号配置后的界面如下所示。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M01/4B/1C/wKiom1QoGnrR9E-cAABHasOB5NA423.jpg" />
这个URL里面指向的页面功能,需要对数据进行解析并返回给微信服务器,因此我们需要在服务器上预先部署好这个处理功能入口。
除了上面的几个函数,还有一个CorpID的参数需要使用,我们可以在后台主界面-设置里面查看到。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M00/4B/1E/wKioL1QoGqPwHCh2AAAfpCK_xxs344.jpg" />
然后我们为了方便网站后台使用,我们和公众号的配置一样,把它放到了Web.Config里面,如下所示。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/wyfs02/M02/4B/1E/wKioL1QoGqPhSfEEAABnki1f1-w631.jpg" />
3、实现回调页面的功能开发
前面介绍了几个配置项,需要在回调页面里面使用的,本小节继续介绍如何实现企业号信息的回发,使之通过回调测试的操作。
由于回调测试的数据是通过Get方式发送的,因此我们的处理逻辑代码如下所示,和公众号的类似处理,只是实现部分不太一样而已。
&&&&&&&&&&&&&&&public&class&corpapi&:&IHttpHandler &&&&&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&void&ProcessRequest(HttpContext&context) &&&&&&&&&{ &&&&&&&&&&&&&string&postString&=&string.E &&&&&&&&&&&&&if&(HttpContext.Current.Request.HttpMethod.ToUpper()&==&&POST&) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&using&(Stream&stream&=&HttpContext.Current.Request.InputStream) &&&&&&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&&&&&Byte[]&postBytes&=&new&Byte[stream.Length]; &&&&&&&&&&&&&&&&&&&&&stream.Read(postBytes,&0,&(Int32)stream.Length); &&&&&&&&&&&&&&&&&&&&&postString&=&Encoding.UTF8.GetString(postBytes); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&if&(!string.IsNullOrEmpty(postString)) &&&&&&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&&&&&Execute(postString); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&} &&&&&&&&&&&&&else&&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&Auth(); &&&&&&&&&&&&&} &&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&private&void&Auth() &&&&&&&&&{ &&&&&&&&&&&&&#region&获取关键参数 &&&&&&&&&&&&&string&token&=&ConfigurationManager.AppSettings[&CorpToken&];&&&&&&&&&&&&&if&(string.IsNullOrEmpty(token)) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&LogTextHelper.Error(string.Format(&CorpToken&配置项没有配置!&)); &&&&&&&&&&&&&} &&&&&&&&&&&&&string&encodingAESKey&=&ConfigurationManager.AppSettings[&EncodingAESKey&];&&&&&&&&&&&&&if&(string.IsNullOrEmpty(encodingAESKey)) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&LogTextHelper.Error(string.Format(&EncodingAESKey&配置项没有配置!&)); &&&&&&&&&&&&&} &&&&&&&&&&&&&string&corpId&=&ConfigurationManager.AppSettings[&CorpId&];&&&&&&&&&&&&&if&(string.IsNullOrEmpty(corpId)) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&LogTextHelper.Error(string.Format(&CorpId&配置项没有配置!&)); &&&&&&&&&&&&&}& &&&&&&&&&&&&&#endregion &&&&&&&&&&&&&&string&echoString&=&HttpContext.Current.Request.QueryString[&echoStr&]; &&&&&&&&&&&&&string&signature&=&HttpContext.Current.Request.QueryString[&msg_signature&];&&&&&&&&&&&&&string&timestamp&=&HttpContext.Current.Request.QueryString[&timestamp&]; &&&&&&&&&&&&&string&nonce&=&HttpContext.Current.Request.QueryString[&nonce&]; &&&&&&&&&&&&&&string&decryptEchoString&=&&&; &&&&&&&&&&&&&if&(new&CorpBasicApi().CheckSignature(token,&signature,&timestamp,&nonce,&corpId,&encodingAESKey,&echoString,&ref&decryptEchoString)) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&if&(!string.IsNullOrEmpty(decryptEchoString)) &&&&&&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&&&&&HttpContext.Current.Response.Write(decryptEchoString); &&&&&&&&&&&&&&&&&&&&&HttpContext.Current.Response.End(); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&} &&&&&&&&&}&
具体的处理代码如下所示,里面的一个加解密处理的类是微信企业号附录里面提供的,我使用了C#版本的SDK而已。
&&&&&&&&&&&&&&&public&class&CorpBasicApi&:&ICorpBasicApi &&&&&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&bool&CheckSignature(string&token,&string&signature,&string&timestamp,&string&nonce,&string&corpId,&string&encodingAESKey,&string&echostr,&ref&string&retEchostr) &&&&&&&&&{ &&&&&&&&&&&&&WXBizMsgCrypt&wxcpt&=&new&WXBizMsgCrypt(token,&encodingAESKey,&corpId); &&&&&&&&&&&&&int&result&=&wxcpt.VerifyURL(signature,&timestamp,&nonce,&echostr,&ref&retEchostr); &&&&&&&&&&&&&if&(result&!=&0) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&LogTextHelper.Error(&ERR:&VerifyURL&fail,&ret:&&&+&result); &&&&&&&&&&&&&&&&&return&false; &&&&&&&&&&&&&} &&&&&&&&&&&&&&return&true; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&
原文出自:【责任编辑: TEL:(010)】
关于的更多文章
编程领域在这几年里迎来了翻天覆地的变化,如果说C、C++、Java在
作为移动开发者,WOT2016移动互联网技术峰会,绝对有你不得不来的理由。
讲师: 9人学习过讲师: 26人学习过讲师: 53人学习过
Jquery是继prototype之后又一个优秀的Javascript框架
又到周末了。昨天是感恩节,小编也是听同事说起,才想
离年末越来越近了,不知道各位有没有倦怠的感觉?本周
在开始学习WAN资料时,我经常面对资料深度不够或者为电气工程师编写的书。另外,在看了几本书,并且对Internet进行了研究以后,
51CTO旗下网站

我要回帖

更多关于 微信公众平台推送模板 的文章

 

随机推荐