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

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,其余的步骤按照微信开放平台尽心即可,注意的是,调用微信的接口时


猜你喜欢

转载自blog.csdn.net/dc_123456/article/details/73739609