VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之微信公众号对接第三方平台开发

前言

        微信公众号对接第三方开发的前提就是授权。首先是开通开放平台。开通时填写资料包括公司信息,还需要300大洋。开放平台包括移动应用、网站应用、公众号账号、小程序、第三方平台。这里我们开通第三方平台。

         开通第三方平台时填写基本信息,比如平台名称、平台介绍、平台图片。下一步是选择权限集、开发资料。权限集就是托管公众号的功能、比如回复消息、创建菜单、会话管理等等。  开发资料这里有3个地方需要注意,授权事件接收url、授权测试公众号列表、公众号消息于事件接收url。  授权测试公众号列表主要是在全网发布之前,在列表内的公众号才能进行授权。

 

一键授权给第三方平台

       先来看一下官方提供的流程图,有一个直观的认识。

       

      授权官方提供了两种方式,授权注册页面扫码授权、点击移动端链接快速授权。这里我用的是第一种,在自己的页面上放一个链接,点击后会生成一个二维码让公众号管理员扫码授权。 https://mp.weixin.qq.com/cgi-bin/componentloginpage?component\_appid=xxxx&pre\_auth\_code=xxxxx&redirect\_uri=xxxx&auth\_type=xxx。 

       这里看到了链接路径包括包括4个参数。前3个是必填。component_appid是第三方平台的appid、redirect_uri是你需要用来获取授权信息的url。同意授权后微信服务器会请求这给地址。 到这里绕了一圈还有一个参数pre_auth_code。 这个参数怎么获取?这里先看一下官方文档 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=&lang=zh_CN  。 这里就该使用创建第三方平台时填写的授权事件url了。微信服务器会每隔10分钟向改地址发起请求,接收到的消息是密文,需要自己解密,官方已经提供了demo,可以参考。pre_auth_code就要从这里的密文消息中获取。

        用下面这个示意图来消化一下。分3步来获取预授权码

 

获取component_verify_ticket

获取component_access_token

 

      这里注意一下,获取component_access_token参数是JSON字符串,在对接第三方平台开发时这两个参数至关重要。component_verify_ticket是公众平台和第三方平台沟通的桥梁。这两个参数可以根据自己的需要保存在数据库或者redis里。后续调用其他高级接口和网页授权时都需要用到。    

   获取预授权码(pre_auth_code)

 

 

     知道了具体获取的方法,那我们就看下具体的处理方法,第一步先获取verify_ticket。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
string sToken = "第三方平台token";
 string sAppID = "第三方平台appid";
 string sEncodingAESKey = "第三方平台aeskey";
 
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID);
 
        
if (Request.HttpMethod.ToLower() == "post")
{
    string sig = Request.QueryString["msg_signature"];
    string timestamp = Request.QueryString["timestamp"];
    string nonce = Request.QueryString["nonce"];
    StreamReader sr = new StreamReader(Request.InputStream, Encoding.UTF8);
    string respData = sr.ReadToEnd();
 
    string sMsg = "";  //解析之后的明文
    int ret = 0;
    ret = wxcpt.DecryptMsg(sig, timestamp, nonce, respData, ref sMsg);
 
    if (ret != 0)
    {
        return;
    }
 
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(sMsg);
 
    string infotype = doc.SelectSingleNode("xml").SelectSingleNode("InfoType").InnerText;
    string componentVerifyTicket = doc.SelectSingleNode("xml").SelectSingleNode("ComponentVerifyTicket").InnerText;
 
    switch (infotype)
    {
        case "component_verify_ticket":
 
            LogHelper.Info("ticket:" + componentVerifyTicket);//这里就拿到了component_verify_ticket
            
            Response.Write("success");
            Response.End();
            break;
        case "unauthorized"://用户取消授权
            Response.End();
            break;
        
    }
 
}