微信公众号平台Url Token EncodingAESKey 注意点
最近公司让我开发微信公众号平台扫码登录,同步用户信息于PC端,所做的过程当中遇到了一些坑,做完了就总结一下需要注意的点,如若大家开发过程中遇到同样的问题,可以借鉴!
第一:配置域名
作用:配置域名为了在微信的开发过程中,让微信服务器可以通过域名映射到调用你的服务器接口,进行后续的逻辑处理!
配置步骤:设置 --> 公众号设置 --> 功能设置 --> 网页授权设置 (设置你自己的域名即可)
注意:(1)根据微信官网描述,看到 MP_verify_HAlZDt72bkvxIrb6.txt 这个文件,需要下载下来放到你的根目录Webapp下,启动你的服务器。此时,微信服务器会自动的根据你所配置的域名 dcm.xxxxxx.cc/MP_verify_HAlZDt72bkvxIrb6.txt 访问这个文件,并成功读取到该文件中的内容就意味着配置成功!
(2)要是提示失败,有可能是你的服务器中配置了权限拦截,例如:登录权限
第二:配置微信服务器访问你接口的URL Token EncodingAESKey
作用:URL是开发者用来接收微信消息和事件的接口URL。Token可以由开发者任意填写,用作生成签名(该Token会配置在服务器中和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
配置步骤:开发 --> 基本设置 (填写URL Token EncodingAESKey)
注意(重中之重):Token EncodingAESKey 需要配置在你的服务器中 WxMpService 的 Config 中,此时还需要编写微信服务访问你接口的代码,返回微信服务器需要返回的结果才会提交成功(这一块的坑我遇到了好多:Token验证失效,URL超时之类,基本问题都是点击提交按钮,微信会自动访问你配置的接口不能返回微信所需要的结果)
例如:配置的域名为:dcm.xxxxxx.cc/mp/login/notify
@Controller
@RequestMapping("/mp/login")
public class ValidateWeiXin extends HttpServlet {
private static final long serialVersionUID = 1L; private String TOKEN = "这里随便填入32位以内的数字英文,也就是token"; @RequestMapping("/notify")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain;charset=utf-8");
// 微信加密签名
String signature = request.getParameter("signature");
// 随机字符串
String echostr = request.getParameter("echostr");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce"); String[] str = { TOKEN, timestamp, nonce };
Arrays.sort(str); // 字典序排序
String bigStr = str[0] + str[1] + str[2];
// SHA1加密,我这里用的是common-codec的jar包,你们也可以用java自带的消息消息摘要来写,只不过要多写几行代码,但结果都一样的
DigestUtils.sha1Hex(bigStr);
String digest = DigestUtils.sha1Hex(bigStr); // 确认请求来至微信
if (digest.equals(signature)) {
response.getWriter().print(echostr);
}
}
}
将这段代码写入你配置微信服务器访问的接口中,就可以提交成功了,后续需要重构这个接口中的代码,例如接收:微信扫码通知、关注通知、取消关注通知、接收发送消息等业务逻辑处理!
第三:微信扫码登录
(1)选用第三方SDK包:https://github.com/Wechat-Group/WxJava (个人认为这个SDK第三方Jar包涵盖了微信不同开发平台的所有功能,封装的很好,推荐使用)可以查看一下具体封装的特点和使用方式,可以提高开发效率!
(2)参考微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
(3)需要详细阅读 【微信公众平台 --> 消息管理 --> 接收事件推送】 文档,借助第三方SDK工具包进行开发
(4)关注、取消公众号,微信会自动访问你配置的URL接口,根据接收的事件类型,处理不同的业务逻辑
用户未关注时,进行关注后的事件推送
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml> 用户已关注时的事件推送(已经关注了,又扫码登录)
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>
自己编写的一段扫码通知、关注、取消关注的Controller代码,可以借鉴一下:
@RequestMapping("/notify")
public String wxnotify(HttpServletRequest request, HttpServletResponse response) {
log.info("【微信通知】wxnotify 接收到请求!"); String message = "success";
try {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8"); //把微信返回的xml信息转义成map
Map<String, String> map = XmlUtil.xmlToMap(request);
String fromUserName = map.get("FromUserName"); //消息来源用户标识
String toUserName = map.get("ToUserName"); //消息目的用户标识
String msgType = map.get("MsgType"); //消息类型
String eventType = map.get("Event");
String eventKey = map.get("EventKey"); log.info("【微信通知】fromUserName = {}, toUserName = {}, msgType = {}, eventType = {}, eventKey={}", fromUserName, toUserName, msgType, eventType, eventKey); if (WxConsts.XmlMsgType.EVENT.equals(msgType)) { //如果为事件类型
if (WxConsts.EventType.SCAN.equals(eventType)) { //扫码通知
if (StringUtils.isNotEmpty(eventKey)) {
log.info("【扫码通知】mid = {}", eventKey);
mpReceiveMessageService.scanQrCodeNotify(fromUserName, eventKey, redisTemplate);
} } else if (WxConsts.EventType.SUBSCRIBE.equals(eventType)) { //关注通知
if (StringUtils.isNotEmpty(eventKey)) {
String[] paramArray = eventKey.split("_");
String mid = paramArray[1];
log.info("【关注通知】mid = {}", mid);
mpReceiveMessageService.subscribleNotify(fromUserName, mid, redisTemplate);
message = MessageUtil.subscribeForText(toUserName, fromUserName);
} } else if (WxConsts.EventType.UNSUBSCRIBE.equals(eventType)) {//取消关注通知
log.info("【取消关注通知】");
mpReceiveMessageService.unsubscribleNotify(fromUserName, redisTemplate);
}
}
} catch (Exception e) {
log.error("【微信通知】异常, message = {}", e.getMessage());
}
return message;
}
如有问题,可以一起讨论,相互学习,我也是刚刚接触,需要后续继续努力!
微信公众号平台Url Token EncodingAESKey 注意点的更多相关文章
- 用iframe嵌入了一个微信公众号平台文章的URL
JS: $.ajaxPrefilter( function (options) { if (options.crossDomain && jQuery.support.cors) { ...
- 微信公众号平台接口开发:基础支持,获取access_token
新建Asp.net MVC 4.0项目 WeChatSubscript是项目UI层 WeChatTools是封装操作访问公众号接口的一些方法类库 获取AccssToken 我们要的得到AccessTo ...
- 微信公众号平台接口开发:基础支持,获取微信服务器IP地址
官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 public static string Serve ...
- 第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"
下午ytkah在自己小博客搜索时看到有几篇文章图片显示不了,再访问一些网站时发现有些图片无法显示出来,显示"此图片来自微信公众号平台未经允许不可引用",如下图所示,这个应该是最近微 ...
- tp6微信公众号开发者模式token认证
微信公众号开发完整教程(一) PHP7.0版本,TP5.0框架 技术标签: 微信公众号开发 因为工作的需要,这一两年对微信公众号和小程序,项目制作的比较多.所以我才打算写一篇全面的 ...
- 微信公众号服务器配置url二次修改
最近微信公众号配置的服务器的域名和云服务到期,就想着更换到别的域名下的服务器:修改的时候出现token验证失败: 我同样的微信签名验证代码在以前服务器上是没问题的,但是修改到新的域名地址时候,总是提醒 ...
- 微信 公众号平台 与 开放平台 获取用户信息 scope snsapi_login
微信公众号(公众平台) 和 微信开放平台 是两码事.公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知:后者是需要用户确 ...
- 使用flask搭建微信公众号:完成token的验证
上一篇文章讨论了官方给的例子验证token失败的解决方法:微信公众号token验证失败 想了一下,还是决定不适用web.py这个框架.因为搜了一下他的中文文档不多,学起来可能会有点麻烦.而且看着他没有 ...
- [转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台
先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号. function CheckSignature(const ...
随机推荐
- java 第五课 异常
1.为什么使用异常? 若没有异常处理机制,会使用流程控制语句if switch等来处理异常情况,程序复杂 2.捕捉异常try catch finally 3.方法中抛出异常throw(throw 可 ...
- scrapy爬取豆瓣电影信息
最近在学python,对python爬虫框架十分着迷,因此在网上看了许多大佬们的代码,经过反复测试修改,终于大功告成! 原文地址是:https://blog.csdn.net/ljm_9615/art ...
- pc和移动与ipad自适应布局的相关问题和解决
一.通过CSS检测本机设备屏幕大小分配样式 1.最小尺寸分辨率1024*768(传统17寸显示器),则可以采用940px.960px.或者常用的980px作为最小宽度. ---- 在可视区域的宽度小于 ...
- 《JavaScript高级程序设计》——第一章JavaScript简介
第一章主要讲了JavaScript的诞生和发展.刚刚接触JavaScript的我,似乎对这些内容并不感兴趣,快速看了一遍就开始去看第二章了. 看完第一章,收获也就是了解到JavaScript由ECMA ...
- PHP定界符的用法
当面临大段的负责的文本输入的时候,建议使用定界符. 例如: $age = 28; $str = <<<cont 第一行数据 第二行数据 特殊字符 ' " asdf abc ...
- 撸个反向代理,激活JRebel~
持续原创输出,点击上方蓝字关注我 目录 前言 本地反向代理 服务器反向代理[个人推荐] IDEA安装JRebel并激活 服务器安装JRebel并激活 总结 前言 热部署相信大家都听说过,比如Sprin ...
- hdu3974 Assign the task线段树 dfs序
题意: 无序的给编号为1-n的员工安排上下级, 操作一:给一个员工任务C,则该员工以及他的下级任务都更换为任务C 操作二:询问一个员工,返回他的任务 题解: 给一个员工任务,则他所在组都要改变,联 ...
- IOC容器小结
IOC容器: Ioc-Inversion of Control,即"控制反转",就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化.定位.配置应用程序中的对象及 ...
- php数据映射到echarts中国地图
echarts和php结合 根据php后台数据,映射到地图上所有的省份,地图市下钻的形式,每次下钻到新地图不合并(合并缩放的话会导致下钻地图位置找不到了),添加了自定义工具栏里面的返回到顶级下钻地图 ...
- SpringBoot的外部化配置最全解析!
目录 SpringBoot中的配置解析[Externalized Configuration] 本篇要点 一.SpringBoot官方文档对于外部化配置的介绍及作用顺序 二.各种外部化配置举例 1.随 ...