您的位置:首页 > 移动开发 > 微信开发

微信第三方平台授权流程- java

2017-06-26 14:17 260 查看
1. 微信第三方平台的开发,第一步就是公众号的授权,授权成功后第三方凭条才能利用公众号的appid和token获得公众账号额信息,并代替公众账号完成一些功能。

 2. 授权的流程,理论图

代码流程,

1》 首先在微信开放平台的官网进行微信第三方平台的开发认证

2》认证通过后,在微信开放平台创建第三方平台的实体,创建完成后才能有对应的appid和secret,用于开发

3》微信服务项第三方平台会推送信息,例如:进行授权、取消授权、更新授权后,但是这些信息都是加密的,所以要下载微信的解密工具,随后会上传至我的账号

4》在创建微信第三方平台时,需要填写加密的key,长度为43个字符,但是在jdk(我用的是jdk1.7)编译时,因为长度过长,会报异常,是因为jdk自己的安全机制对key的长度有限制,需要将限制取消,方法就是下载UnlimitedJCEPolicyJDK7.zip利用里面的jar包代替jdk安装目录下,我的是:C:\Java\jdk1.7.0_80\jre\lib\security里的两个jar包即可,压缩包会上传至我的账号

5》微信服务器的推送信息,是通过域名进行推送的并且不能指定端口号,所以要将微信第三方平台创建时填写的域名映射到开发的电脑上,端口为80.

6》编写微信第三方平台注册时填写的“授权事件接收URL”的方法,第三方平台注册成功后,微信服务器会每十分钟向该url推送一次


component_verify_ticket ,通过aes进行解密,获得ticket,我得获得ticket的方法

public void processAuthorizeEvent(HttpServletRequest request) {
System.out.println("开始获取微信推送信息----------------------------");
// 获得微信推送的参数
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
String signature = request.getParameter("signature");
String msgSignature = request.getParameter("msg_signature");
try {
if (!StringUtils.isNotBlank(msgSignature)) {
return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息
}
String component_token = prop.getProperty("component_token");
boolean isValid = checkSignature(component_token, signature, timestamp, nonce);
if (isValid) {
StringBuilder sb = new StringBuilder();
BufferedReader in = request.getReader();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
// 微信推送的加密为信息
String xml = sb.toString();
// 参数
String component_encodingaeskey = prop.getProperty("component_encodingaeskey");
String component_appid = prop.getProperty("weixinThirdPart_appid");
// 加密信息的解密工具类
WXBizMsgCrypt pc = new WXBizMsgCrypt(component_token, component_encodingaeskey, component_appid);
// 微信推送的加密信息,解密后的xml
xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml);
Document doc = DocumentHelper.parseText(xml);
Element rootElt = doc.getRootElement();
String type = rootElt.elementText("InfoType");
if ("component_verify_ticket".equals(type)) {
processAuthorizationEvent(rootElt);
} else if ("unauthorized".equals(type)) {
handleUnauthorized(rootElt);
}
System.out.println("type}}}}}}}}}}}}}}}" + type);
}
} catch (Exception e) {
e.printStackTrace();
}
}
解密的方法
public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {

boolean flag = false;
if (signature != null && !signature.equals("") && timestamp != null && !timestamp.equals("") && nonce != null
&& !nonce.equals("")) {
String sha1 = "";
String[] ss = new String[]{token, timestamp, nonce};
Arrays.sort(ss);
for (String s : ss) {
sha1 += s;
}
sha1 = AddSHA1.SHA1(sha1);
if (sha1.equals(signature)) {
flag = true;
}
}
return flag;
}
 
7》获得ticket后,通过ticket获得微信第三方平台开发的token,其余的步骤按照微信开放平台尽心即可,注意的是,调用微信的接口时
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息