这一段时间集成了微信第三方平台,坑还是蛮多的,记录一下集成过程和遇到的坑

授权流程

iOS 集成微信 SDK 微信集成平台_微信第三方平台集成


首先说一下过程,这个过程再微信开放平台上有。开放平台链接戳这

授权给第三方平台首先要获取预授权码,然后用预授权码引导用户授权,最后成功授权返回授权码。

这地方分三部分:

第一部分,如何获取预授权码。

第二部分,通过预授权码引导用户授权。

第三部分,返回授权码获取公众号信息。

一、如何获取预授权码

1、在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。

首先需要了解一个加解密,微信平台会有一个官方demo。接下来就是我遇到的第一个坑了。传过来的xml解析失败。

官网上解析的结果是这样的:

iOS 集成微信 SDK 微信集成平台_微信第三方平台集成_02


想要解析,你得获取微信服务器传过来的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<String,Object> 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><![CDATA[xxxxxxxxxxxxxx]]></AppId>
    <Encrypt><![CDATA[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]]></Encrypt>
</xml>

解析出来之后:

<xml><AppId><![CDATA[xxxxxxxxxxxxxx]]></AppId>
<CreateTime>1537153589</CreateTime>
<InfoType><![CDATA[component_verify_ticket]]></InfoType>
<ComponentVerifyTicket><![CDATA[xxxxxxxxxxxxxxxxxxxxxxxxxxx]]></ComponentVerifyTicket>
</xml>

然后一直报一个空指针的错误,我发现下面的代码解析失败,因为XMLParse那个类找不到ToUserName的标签。

iOS 集成微信 SDK 微信集成平台_xml_03


iOS 集成微信 SDK 微信集成平台_iOS 集成微信 SDK_04

就没有<ToUserName>这个页签,所以最后我改成了<AppId>

2、第三方平台component_access_token是第三方平台的下文中接口的调用凭据,也叫做令牌(component_access_token)。每个令牌是存在有效期(2小时)的,且令牌的调用不是无限制的,请第三方平台做好令牌的管理,在令牌快过期时(比如1小时50分)再进行刷新。

这里没啥说的,就是需要做的就是维护好令牌(持久化,启动加载等)。到这就可以获取到预授权码(pre_auth_code)。

二、引导用户授权

iOS 集成微信 SDK 微信集成平台_wechat_05


走到这,你会忽然发现,你跳转的页面完全不能授权,一直提示你的域名不对。因为这就是我遇见的第二个坑。

这边的操作应该是这样的:你需要写一个页面来授权,让用户去点击那个授权按钮,按钮的链接就是你拼接的那个url,废话不多说,代码伺候:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<div>
    <input id="tolink" type="button" name="" value="授权跳转" /></div>
<script>
    var btn=document.getElementById("tolink");
    btn.onclick=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的

iOS 集成微信 SDK 微信集成平台_微信第三方平台集成_06


方式二:点击移动端链接快速授权

第三方平台方可以生成授权链接,将链接通过移动端直接发给授权管理员,管理员确认后即授权成功。

iOS 集成微信 SDK 微信集成平台_wechat_07


然后点击页面的授权按钮,就可以正常进行授权了,授权的必须是公众的管理员(绑定公众号的那个),然后就可以授权了。

三、授权码获取公众号信息

该API用于获取授权方的基本信息,包括头像、昵称、帐号类型、认证类型、微信号、原始ID和二维码图片URL。

需要特别记录授权方的帐号类型,在消息及事件推送时,对于不具备客服接口的公众号,需要在5秒内立即响应;而若有客服接口,则可以选择暂时不响应,而选择后续通过客服接口来发送消息触达粉丝。

iOS 集成微信 SDK 微信集成平台_wechat_08


iOS 集成微信 SDK 微信集成平台_wechat_09


iOS 集成微信 SDK 微信集成平台_微信第三方平台授权_10