共计 4186 个字符,预计需要花费 11 分钟才能阅读完成。
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction
因为集体精力工夫无限,不会再对现有代码进行更新保护,不过微信接口比较稳定,经测试至今没有变动,性能仍然全副可用,你能够在此基础上,二次开发,实现你的业务性能,也能够抽取本平台中的代码复用在你的我的项目中,请遵循 MIT 开源协定保留我的版权申明和网站链接即可。
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction.WeixinContract
微信协定包装的我的项目还有一个独自的工程,这个工程的版本稍新,我会进行肯定的更新保护,如最近减少了几个小程序开发须要应用到的接口。然而留神因为代码构造通过优化调整,间接援用到升讯威微信平台中,须要批改一些类的援用和名称。
升讯威微信营销零碎开发实际系列
升讯威微信营销零碎开发实际:(1)性能概要与架构设计
升讯威微信营销零碎开发实际:(2)中控服务器的具体设计
升讯威微信营销零碎开发实际:(3)性能介绍与此我的项目推广过程的一些领会
升讯威微信营销零碎开发实际:(4)源代码构造阐明
升讯威微信营销零碎开发实际:(5)装置部署阐明
在本文中我将分为两个局部,第一局部具体介绍代码层面的次要构造,第二局部具体介绍装置部署的办法。
一)代码构造
从 Github 上获取代码后,源代码目录构造如图所示:
解决方案阐明:
- Sheng.WeixinConstruction.Admin.sln
超级管理员、零碎运维人员应用的超级治理后盾。
此局部性能开发并未实现,目前只有根本框架和微主页模版的简略治理性能。
- Sheng.WeixinConstruction.Container.sln
鉴权中控服务服务。
负责管理和保护第三方平台本人的 AccessToken 和对接过去的所有公众号的 AccessToken。
- Sheng.WeixinConstruction.FileService.sln
文件服务器。
提供独立文件存储服务,并提供了局部与微信公众号素材治理的性能。
能够部署多个不同的文件服务器实例,能够部署 CDN 内容散发。
- Sheng.WeixinConstruction.sln
治理后盾和微信端。
治理后盾用于向升讯威微信管理系统的个别用户提供服务,在此注册账户,对接本人的公众号,并应用升讯威微信营销零碎的一系列性能。
微信端用于向所对接的公众号提供服务,在微信公众号上拜访的站点。
- Sheng.WeixinConstruction.WindowsService.sln
Windows 服务
次要用来执行一些定时服务。
上面次要对解决方案 Sheng.WeixinConstruction.sln 和 Sheng.WeixinConstruction.Container.sln 进行阐明,其它几个解决方案都比较简单,不作赘述。
关上 Sheng.WeixinConstruction.sln 之后,构造如图:
- Sheng.WeixinConstruction.Management.Shell
后盾站点
- Sheng.WeixinConstruction.Client.Shell
微信端站点
1)Sheng.WeixinConstruction.Management.Shell
对于治理后盾,一个重要的性能是在用户注册账号后,实现与微信公众号的对接。
关上 Controllers 目录下的 SettingsController.cs,并开展“对接”region。
Docking 与 DockingDemo 对应着用户对接公众号的页面。DockingDemo 是发动受权页的体验 URL:用于腾讯审核人员返回受权页体验,确认流程可用性。此为腾讯要求。
AuthorizerEntity 示意受权公众号的信息,代码中有具体的正文,可自行查阅:
在用户对接公众号时,须要先获取一个预受权码,关上 Areas /Api/ Controllers 目录下的 SettingsController.cs,找到 GetPreAuthCode 办法,此办法用于获取预受权码:
在 Docking.cshtml 这个画面调用此接口,当胜利获取预受权码之后,将页面转到腾讯要求的受权页面,并给出一个用于实现受权的回调页面,当公众号所有者通过受权时,腾讯将把页面转到此回调页面,并传回受权码:
关上 Controllers 目录下的 SettingsController.cs,找到 AuthorizationCallback 这个受权回调办法,在此实现公众号的受权对接:
这里注意一个细节:
在零碎中创立公众号受权信息,并开始保护它的 AccessToken,并不是在后盾中实现,而是调用鉴权中控服务器的接口,告诉鉴权中控服务器来实现的:
_createAuthorizerUrl 是鉴权中控服务器的地址:
2)Sheng.WeixinConstruction.Client.Shell
微信端除了向所对接的公众号提供服务外,还负责与微信官网后盾前进音讯通信,微信官网下发的音讯,是发到 Sheng.WeixinConstruction.Client.Shell,而不是 Sheng.WeixinConstruction.Management.Shell。
所以最重要的是首先要解决好微信推送过去的音讯,关上 Controllers 目录下的 ThirdPartyWeixinApiController.cs:
Handler 接口用于接管公众号音讯与事件推送。
当一般微信用户向公众账号发消息时,微信服务器将 POST 音讯的 XML 数据包到此接口。
在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的模式告诉,在开发者核心处设置的服务器地址,从而开发者能够获取到该信息。其中,某些事件推送在产生后,是容许开发者回复用户的,某些则不容许。作为第三方平台经营时,AppId 会作为 URL 的一部分带过去,如:
http://wxc.shengxunwei.com/Th…$APPID$
其中 $APPID$ 在理论推送时会替换成所属的已受权公众号的 appid。
推送音讯过去时,URL 如下格局:
http://wxc.shengxunwei.com/We…
?signature=84001ea92e2f369642e861d557b9f4c6781db1ca
×tamp=1446393828
&nonce=1291578710
&encrypt_type=aes
&msg_signature=3ed4a96dbc50d491664ec3f425eb7fc1f088ac9b
在接管到 POST 过去的音讯后,第一步须要先解密,而后找到这条音讯应该归属哪个微信公众号,找到它对应的公众号上下文,把解密后的音讯交给它解决。
ClientDomainContext 是微信端应用的公众号上下文,无关公众号上下文的具体阐明,请参阅:
升讯威微信营销零碎开发实际:(2)中控服务器的设计
http://blog.shengxunwei.com/H…
在 ClientDomainContext 中,援用了一个 XMLMessageReceiverFactory 的工厂类用于解决微信推送过去的 XML 音讯:
在这个工厂类中,_receiverList 保留了解决不同音讯所须要的具体实现,这些音讯接收器的实现,定义在 Sheng.WeixinConstruction.Client.Core:
那么当收到微信推送的音讯时,只需找到对应公众号的上下文对象,调用它的 Handle 办法,依据音讯的类型,找到对应的处理器类,交给它解决,就能够了,这就是音讯解决的过程。
在微信端,还有一件十分重要的工作,就是对公众号关注者的身份获取,OpenId 和用户信息,例如:
当公众号的关注者(粉丝)拜访微信端的页面时,须要获取关注者的个人身份信息,OpenId 和其它信息,在此基础之上,与咱们本人后盾的信息关联。
关上 Controllers 目录下的 ClientBasalController,微信端视图控制器类都继承此基类:
当公众号的关注者拜访微信端的页面时,首先控制器基类会获取该关注者的会员信息上下文和对应的公众号上下文:
在 OnActionExecuting 办法中,按微信的协定要求实现对关注者身份的网页受权。
这里要先理解所服务公众号的域名解析细节,假如咱们将微信端的域名配置为 wxc.shengxunwei.com,实践上咱们让所有的公众号间接应用此页面,在 URL 后跟上公众号的 ID 即可,然而这样有一个重要的缺点,如果平台所服务的公众号,有一个公众号存在违规行为,被微信查封,会导致咱们整个平台被封,微信会间接把 wxc.shengxunwei.com 这个域名查封。所以咱们必须泛解析的形式,让所服务的公众号应用 appid.wxc.shengxunwei.com 这样的域名来防止这种状况。如何在装置部署升讯威微信营销零碎时配置泛解析域名,请参阅装置部署相干的具体阐明。
网页受权的过程在 OnActionExecuting 办法中有具体的正文阐明,可对照着代码来看:
留神对关注者身份的网页受权是跳转到微信官网受权页面进行的,实现受权后,会跳转回指定的回调页面,在 Areas/Api/Controllers 目录下的 ThirdPartyWeixinApi/OAuthCallback,代码中有具体的正文,请自行查阅:
至此,对关注者身份的网页受权实现。
还有一个前端页面 JS 受权的形式,在微信领取时会波及到,你能够找到 ClientDomainContext 下的 GetJsApiConfig 办法来查阅:
此外,微信端也实现了微信领取性能,用于会员充值或积分商品购买商品:
微信领取的流程简而言之,须要先调用微信提供的对立下单接口,在微信领取端实现一个下单操作,这个下单和咱们零碎本身的下单是两个概念,实现对立下单后,生成相干信息给前端页面,前端页面调用微信提供的 js sdk 实现领取,领取胜利后,微信服务器会向咱们指定的回调 url 地址收回领取后果的告诉。具体的流程,请查阅微信官网的开发文档。
我在 Areas/Api/Controllers/PayController.cs 中实现了相干性能: