欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微信公众号对接第三方平台开发

程序员文章站 2022-04-28 13:09:21
前言 微信公众号对接第三方开发的前提就是授权。首先是开通开放平台。开通时填写资料包括公司信息,还需要300大洋。开放平台包括移动应用、网站应用、公众号账号、小程序、第三方平台。这里我们开通第三方平台。 开通第三方平台时填写基本信息,比如平台名称、平台介绍、平台图片。下一步是选择权限集、开发资料。权限 ......

前言

        微信公众号对接第三方开发的前提就是授权。首先是开通开放平台。开通时填写资料包括公司信息,还需要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。

 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;
		
	}

}

  第二步获取componet_access_token

private static responsecomponenttoken getcomponenttoken(string appid,string appsecret,string verifyticket)
    {
        
        var urlformat = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
        object data = null;
        data = new
        {
            component_appid = appid,
            component_appsecret = appsecret,
            component_verify_ticket = verifyticket
        };


        return commonjsonsend.send<responsecomponenttoken>("", urlformat, data);
    }

  ok。这里pre_auth_code就不罗列了,可以用程序调,也可以用postman调用。

       到这里,拿到pre_auth_code就可以点击上面的授权地址生成二维码,扫码。授权结束。有点费劲!!!

 

代公众号网页授权

     对接第三方平台后,网页授权还是分为两种方式,静默方式只能拿到openid、需要用户授权的可以拿到更多的用户信息。实现方式相比公众号略有不同:

微信公众号对接第三方平台开发

微信公众号对接第三方平台开发

微信公众号对接第三方平台开发

 

  这里做开发时我用senparc sdk, 参数包括公众号appid、第三方平台appid、第三方平台accesstoken。

oauthaccesstokenresult result = oauthapi.getaccesstoken(appid, compappid, compaccesstoken, code);

  

代公众号处理消息和事件

       创建第三方平台时填写了消息和事件接收url。第三方平台会把用户和微信互动的消息和事件转发到次url。也就是在这里你可以处理具体的消息和事件,比如关注、取消关注、发送文本消息、图片消息。 这里和公众号处理消息不同的地方在于回复用户的消息全部要加密。加密方式同verify_ticket获取。  

        这里不需要再自己封装互动的消息和事件。直接用senparcsdk的customermessagehandler处理即可。 最后回复用户消息时需要用到加密消息:finalresponsedocument。可以参考senparcsdk demo。

 

 if (request.httpmethod.tolower() == "post")
        {

            var postmodel = new postmodel()
            {
                signature = request.querystring["signature"],
                msg_signature = request.querystring["msg_signature"],
                timestamp = request.querystring["timestamp"],
                nonce = request.querystring["nonce"],
                encodingaeskey = sencodingaeskey,
                token = stoken,
                appid = sappid
            };


            var maxrecordcount = 10;
            var messagehandler = new custommessagehandler(request.inputstream, postmodel, maxrecordcount);

            try
            {
                
                //messagehandler.requestdocument.save(
                //    server.mappath("~/app_data/" + datetime.now.ticks + "_request_" +
                //                   messagehandler.requestmessage.fromusername + ".txt"));

                messagehandler.execute();//执行微信处理过程(关键)

                
                //messagehandler.responsedocument.save(
                //    server.mappath("~/app_data/" + datetime.now.ticks + "_response_" +
                //                   messagehandler.responsemessage.tousername + ".txt"));

                response.output.write(messagehandler.finalresponsedocument.tostring());
                //response.write("success");
                return;
            }
            catch (exception ex)
            {
                loghelper.error(ex.message,ex);
            }
            finally
            {
                response.end();
            }

        }

 

  

 

     

参考资料

http://www.cnblogs.com/icoffee/p/4815746.html