这一段时间集成了微信第三方平台,坑还是蛮多的,记录一下集成过程和遇到的坑
首先说一下过程,这个过程再微信开放平台上有。开放平台链接戳这
授权给第三方平台首先要获取预授权码,然后用预授权码引导用户授权,最后成功授权返回授权码。
这地方分三部分:
第一部分,如何获取预授权码。
第二部分,通过预授权码引导用户授权。
第三部分,返回授权码获取公众号信息。
1、在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。
首先需要了解一个加解密,微信平台会有一个官方demo。接下来就是我遇到的第一个坑了。传过来的xml解析失败。
官网上解析的结果是这样的:
想要解析,你得获取微信服务器传过来的xml(传来的timestamp,nonce,encrypt_type,msg_signature可以直接用request.getParameter获取,但是xml需要读取request的body部分)。然后按照demo上那样解析。下面是我的方法:
/**
* 微信第三方解码
* @param msgMap
* @param token
* @param encodingAesKey
* @param appId
* @param timestamp
* @param nonce
* @return
*/
public static String DecryptMsg(Map msgMap, String token, String encodingAesKey, String appId, String timestamp, String nonce){
String result = null;
try{
WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
String msgSignature = (String)msgMap.get("msg_signature");
String encrypt = (String)msgMap.get("encrypt_type");
String postXml = (String)msgMap.get("post_xml");
String format = postXml;
String fromXML = String.format(format, encrypt);
result = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);
}catch (Exception e){
e.printStackTrace();
}
return result;
}
接收到的xml:
<xml>
<AppId>AppId>
<Encrypt>Encrypt>
xml>
解析出来之后:
<xml><AppId>AppId>
<CreateTime>1537153589CreateTime>
<InfoType>InfoType>
<ComponentVerifyTicket>ComponentVerifyTicket>
xml>
然后一直报一个空指针的错误,我发现下面的代码解析失败,因为XMLParse那个类找不到ToUserName的标签。
就没有
这个页签,所以最后我改成了
。
2、第三方平台component_access_token是第三方平台的下文中接口的调用凭据,也叫做令牌(component_access_token)。每个令牌是存在有效期(2小时)的,且令牌的调用不是无限制的,请第三方平台做好令牌的管理,在令牌快过期时(比如1小时50分)再进行刷新。
这里没啥说的,就是需要做的就是维护好令牌(持久化,启动加载等)。到这就可以获取到预授权码(pre_auth_code)。
走到这,你会忽然发现,你跳转的页面完全不能授权,一直提示你的域名不对。因为这就是我遇见的第二个坑。
这边的操作应该是这样的:你需要写一个页面来授权,让用户去点击那个授权按钮,按钮的链接就是你拼接的那个url,废话不多说,代码伺候:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
<div>
<input id="tolink" type="button" name="" value="授权跳转" />div>
<script>
var btn=document.getElementById("tolink");
btn.οnclick=function(){
var ajax = new XMLHttpRequest();
ajax.open('get','http://abcd.com/authorizedurl');
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.status==200) {
window.location.href=ajax.responseText
}
}
}
script>
body>
html>
这个url:http://abcd.com/authorizedurl
是用来获取拼接后的url的
方式二:点击移动端链接快速授权
第三方平台方可以生成授权链接,将链接通过移动端直接发给授权管理员,管理员确认后即授权成功。
然后点击页面的授权按钮,就可以正常进行授权了,授权的必须是公众的管理员(绑定公众号的那个),然后就可以授权了。
该API用于获取授权方的基本信息,包括头像、昵称、帐号类型、认证类型、微信号、原始ID和二维码图片URL。
需要特别记录授权方的帐号类型,在消息及事件推送时,对于不具备客服接口的公众号,需要在5秒内立即响应;而若有客服接口,则可以选择暂时不响应,而选择后续通过客服接口来发送消息触达粉丝。