微信公众号通过第三方平台完成授权前,第三方平台与公众号绑定关系。

为什么要使用第三方平台来完成授权,公众号本身授权也可以,但是微信平台会认为你具有开发能力,免费提供给你的自定义菜单以及其他功能将不能再使用(亲身经历的一个坑,开始使用公众号授权,结束后发现部分功能不能使用)。

这个地方就是公众号自己授权需要先向微信提供服务器地址,微信会把公众号的一些关注事件,推送的消息等。传递参数到这个地址,我们需要在5s内响应字符串:success给微信,否则微信认为该服务器有问题而不会推送参数过来。当然就是这个服务器地址启用后,会导致公众号本身提供的自定义菜单,消息回复功能等失效。

所以采用了第三方平台来完成公众号的授权,其实授权流程跟公众号授权差不多。首先需要跟公众号一样需要申请一个第三方平台账户(需要200块)。
在第三方平台创建审核通过后,微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送 component_verify_ticket,
接收 POST 请求后,只需直接返回字符串 success。
第三方平台需要填写 :
1.授权事件接收URL
2.公众号的appid
3.ip白名单
其他需要填写的具体看需要那些。

授权事件接收URL会接收到微信推送的xml字符串,需要将xml解析成json:

public static JSONObject xml2Json(String xmlStr) throws DocumentException {Document doc= DocumentHelper.parseText(xmlStr);JSONObject json=new JSONObject();dom4j2Json(doc.getRootElement(), json);return json;}public static void dom4j2Json(Element element, JSONObject json) {//如果是属性for (Object o : element.attributes()) {Attribute attr = (Attribute) o;if (StringUtils.isNotEmpty(attr.getValue())) {json.put("@" + attr.getName(), attr.getValue());}}List<Element> childrenElement = element.elements();if (CollectionUtils.isEmpty(childrenElement) && StringUtils.isNotEmpty(element.getText())) {//如果没有子元素,只有一个值json.put(element.getName(), element.getText());}for (Element e : childrenElement) {//有子元素if (CollectionUtils.isNotEmpty(e.elements())) {//子元素也有子元素JSONObject childJson = new JSONObject();dom4j2Json(e, childJson);Object o = json.get(e.getName());if (o != null) {JSONArray jsona = null;if (o instanceof JSONObject) {//如果此元素已存在,则转为jsonArrayJSONObject jsono = (JSONObject) o;json.remove(e.getName());jsona = new JSONArray();jsona.add(jsono);jsona.add(childJson);}if (o instanceof JSONArray) {jsona = (JSONArray) o;jsona.add(childJson);}json.put(e.getName(), jsona);} else {if (!childJson.isEmpty()) {json.put(e.getName(), childJson);}}} else {//子元素没有子元素for (Object o : element.attributes()) {Attribute attr = (Attribute) o;if (StringUtils.isNotEmpty(attr.getValue())) {json.put("@" + attr.getName(), attr.getValue());}}if (StringUtils.isNotEmpty(e.getText())) {json.put(e.getName(), e.getText());}}}}

从解析的json中拿到字符串 Encrypt ,timestamp,nonce,msg_signature:
使用AES解密:

public class GetMsessage{public void getThridMse(JSONObject getData) {String encrypt = json.getString("Encrypt");String timeStamp = json.getString("timestamp");String nonce = json.getString("nonce");String msgSignature = json.getString("msg_signature");String componentAppId = "第三方平台appid";String appSecret = "第三方平台Secret";String encodingAesKey = "第三方平台的AES密钥";String token = "第三方平台认证服务时填写的一个字符串";JSONObject  resJson= getCryptMsg(token,encodingAesKey,componentAppId,encrypt,msgSignature,timeStamp,nonce);String verifyTicket = resJson.getString("ComponentVerifyTicket");String eventKey = resJson.getString("EventKey");String event = resJson.getString("Event");String toUserName = resJson.getString("ToUserName");String fromUserName = resJson.getString("FromUserName");String ticket = resJson.getString("Ticket");}public JSONObject getCryptMsg(String token,String encodingAesKey,String appId,String encrypt,String msgSignature,String timeStamp,String nonce){BaseLog.getDailyLog().info("token[{}] encodingAesKey[{}] appId[{}] encrypt[{}] msgSignature[{}] timeStamp[{}] nonce[{}]",token, encodingAesKey, appId, encrypt, msgSignature, timeStamp, nonce);WXBizMsgCrypt wxBizMsgCrypt = null;try {wxBizMsgCrypt = new WXBizMsgCrypt(token,encodingAesKey,appId);} catch (Exception e) {e.printStackTrace();}JSONObject json = new JSONObject();try {String xml = wxBizMsgCrypt.decryptMsg(msgSignature,timeStamp,nonce,encrypt);try {json = xml2Json(xml);} catch (DocumentException e) {e.printStackTrace();}BaseLog.getDailyLog().error("解析xml为Json的内容为:"+json.toJSONString());return json;} catch (AesException e) {e.printStackTrace();BaseLog.getErrorLog().error(e.getMessage(), e);throw new ServiceException(OAuth2ErrorCodeEnum.FAILED_TO_PARSING_XML.getCode(), OAuth2ErrorCodeEnum.FAILED_TO_PARSING_XML.getMsg());}}
}

String verifyTicket = resJson.getString(“ComponentVerifyTicket”);
拿到票据后去拿第三方平台的令牌

 public JSONObject getComponentAccessToken(String appId,String appSecret,String componentVerifyTicket,String componentAccessTokenUrl){/*  https://api.weixin.qq.com/cgi-bin/component/api_component_token  */JSONObject object = new JSONObject();object.put("component_appid",appId);object.put("component_appsecret",appSecret);object.put("component_verify_ticket",componentVerifyTicket);String result = doPost(componentAccessTokenUrl, object.toString(), "utf-8");BaseLog.getDailyLog().error("获取第三方令牌结果;"+result);JSONObject resultJson=JSONObject.parseObject(result);return resultJson;}

component_appid是第三方平台的appid,component_appsecret是第三平台的secret。

上面post请求返回的结果里面有 component_access_token,第三方平台 access_token用来获取预授权码:

 public JSONObject getPreAuthCode(String preAuthCodeUrl,String componentToken,String appId){/*POST https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=COMPONENT_ACCESS_TOKEN*/StringBuilder sb = new StringBuilder(preAuthCodeUrl);String url = sb.append("?").append("component_access_token=").append(componentToken).toString();JSONObject object = new JSONObject();object.put("component_appid",appId);String result = doPost(url, object.toString(), "utf-8");BaseLog.getDailyLog().error("获取第三方预授码结果;"+result);JSONObject resultJson=JSONObject.parseObject(result);return resultJson;}

从上面拿到的预授权码 pre_auth_code 后:

组装一个授权的链接,访问这个链接会生成一个二维码,用公众号拥有者扫描去给第三方平台授权。
然后登录公众号里面在这个地方给第三方平台需要用到的权限。

到此,是把公众号跟第三方平台绑定成功,给第三方平台授权完成(并不是真正的公众号授权拿到用户信息)。
从上面可以看出,整个代码过程没有用到公众号的信息,所以第三方平台可以给跟个公众号绑定,完成授权。
再后面就是授权了,按公众号授权一样了,先拿到code,再拿token,就有openid然后就可以拿用户信息了。

微信公众号通过第三方平台完成授权相关推荐

  1. java微信公众平台接口封装源码_微信公众号对接第三方平台(全网发布 java)源码 含 jar...

    [实例简介] 微信公众号对接第三方平台(全网发布 java)源码+jar 里面有完成全网发布的源码直接tomcat部署运行和所需的jar 具体对接流程,关注我们的博客 http://blog.csdn ...

  2. 微信公众号接入第三方平台

    第一步 授权事件接收URL http://www.falago.cn/weiweb/wei/wei_inceptmsg 在第三方的授权事件填写自己服务器的url,微信服务器会向其"授权事件接 ...

  3. 微信公众号官网平台与微信公众号第三方平台的区别

    微信公众号官网平台 普通的微信公众账号只能开启编辑模式,编辑模式缺点: 1)功能有限,无法开发API丶地理位置回复等信息: 2) 文字回复有300字限制,关键字回复上限为200条; 3)关键字回复较多 ...

  4. 注册一个微信公众号的测试平台

    一.准备工作 1. 注册一个微信公众号的测试平台 具体链接:微信公众号 进入后如下图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWpYYAqH-16644307 ...

  5. 网上买的几百元的最新微信公众号H5游戏平台完整源码下载

    网上买的几百元的最新微信公众号H5游戏平台完整源码下载 微信Html5游戏平台源码,大家可以直接打开浏览器本地测试,到时候修改下关注链接就行,简单易学 游戏太多了,不上图了,大家自己下去研究吧! 下载 ...

  6. wechat-0051,微信公众号,第三方登录—扫码绑定

    声明:这边所谓的第三方登录,不是通过网页授权的方式,而是利用生成带参数的二维码,将微信号和平台账号绑定实现.如果你要做的是授权登录,请查看 https://blog.csdn.net/wrongyao ...

  7. 微信公众号开发002-微信网页授权

    1.首先在开发前阅读微信提供的API文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842) 阅读完的我们就知 ...

  8. 前端对接微信公众号网页开发流程,授权对接

    前面讲到 前端对接微信公众号网页开发流程,前期配置,本篇文章主要详细介绍关于公众号的授权对接. 一.引入微信js-sdk 在需要调用 JS 接口的页面引入如下 JS 文件 http://res.wx. ...

  9. 微信公众号获取OpenId(未授权)(需要关注公众号)

    文章的一开始,我先解释下微信公众号的openId. openId是微信对于用户的唯一辨识,只要有用户关注你的公众号,微信会通过公众号和用户微信号通过一种算法生成一种唯一标识码,也就是openId,用数 ...

最新文章

  1. 基于Redis实现一个分布式锁
  2. [转] 用Firebug调试JavaScript
  3. Ruby 三元一次线性方程组
  4. 一道面试题引发的关于程序设计的想法
  5. Django的外键创建
  6. 关于Remoting信道的通信的问题
  7. yii 使用 有赞sdk_有赞ABTest系统:数据驱动增长实践
  8. MyBatis-Plus入门Demo详解
  9. P1720 月落乌啼算钱(斐波那契数列)--python3实现
  10. scala解析csv文件写入mysql_scala实战之spark源码修改(能够将DataFrame按字段增量写入mysql数据表)...
  11. 高效率实现web自动完成功能-三叉搜索树
  12. Node.js中使用pipe拷贝大文件不能完全拷贝的解决办法
  13. CAN协议 J1939
  14. 子龙山人:我从Cocos2d-x团队里学到的
  15. 【数学】扩展欧几里得算法
  16. ps如何设置裁剪后的背景颜色
  17. 利用 MATLAB 编程实现 Newton 法与阻尼 Newton 法
  18. topgate镜像_[百度云盘]1678个PS1美版镜像(redump20110912)
  19. 沟通的艺术:看入人里,看出人外
  20. 修改mysql字段为主键且自增

热门文章

  1. 前端基于excljs导出xlsx时图片资源的处理及踩坑实录
  2. 内网安全-域横向PTHPTKPTT哈希票据传递
  3. go语言对gif的抽帧压缩
  4. linux物料管理,SAP-PM 工具管理篇之出入库
  5. keil调试中黄色三角形代表什么意思
  6. Spark On Yarn --jars/spark.yarn.jars 踩坑 与 提升spark submit速度
  7. sqldbx怎么连接远程服务器,SqlDbx连接远程DB2数据库
  8. 怎么设置CAD多段线线宽?CAD多段线线宽设置技巧
  9. AutoSAR系列讲解(深入篇)13.1-闪烁一颗LED灯 1
  10. C# 使用正则表达式提取文字