ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

.Net6+Fruion+Sqlsugar+SenparcSdk开发微信公众号系列之三:接入公众号

2022-05-25 09:03:20  阅读:205  来源: 互联网

标签:Weixin SenparcSdk 微信 global Senparc 公众 echostr using


一、接入概述

接入微信公众平台开发,开发者需要按照如下步骤完成:

1、填写服务器配置

2、验证服务器地址的有效性

3、依据接口文档实现业务逻辑

二、填写服务器配置

微信公众号填写自己的服务器配置

 三、编写API

 删除脚手架中的测试服务

新建Global.cs用于全局引用

 Global.cs中全局引用胜派sdk这样就不用每个类都引用了,这是.NET6新增功能

global using Senparc.NeuChar.Entities;
global using Senparc.Weixin;
global using Senparc.Weixin.MP;
global using Senparc.Weixin.MP.Entities;
global using Senparc.Weixin.MP.Entities.Request;
global using Senparc.Weixin.MP.MessageContexts;
global using Senparc.Weixin.MP.MessageHandlers;
global using Furion.DynamicApiController;
global using Microsoft.AspNetCore.Mvc;
global using System;
global using System.IO;
global using System.Threading.Tasks;
global using Microsoft.AspNetCore.Http;
global using System.Threading;
global using WeiXinApi.Application.Handler;
global using WeiXinApi.Application.Services;
namespace WeiXinApi.Application
{
    internal class Global
    {

    }
}
View Code

新建文件夹和文件如图所述

引入Nuget包Senparc.Weixin.MP和Senparc.Weixin.AspNet

新建一个Api,路由地址就是我们服务器配置上填的域名后面跟着的地址,我的是wx。我这里用的是动态api所以不是继承的controller

using Furion.DynamicApiController;
using Microsoft.AspNetCore.Mvc;
using Senparc.Weixin.MP.Entities.Request;

namespace WeiXinApi.Application.Services
{
    public class WeiXinService : IDynamicApiController
    {
        [HttpGet("/wx")]
        public string Index([FromQuery] PostModel postModel, string echostr)
        {
            System.Console.WriteLine(echostr);
            return echostr;
        }
    }
}

测试一下接口,没毛病

 四、发布到云服务器并通过附加到进程调试

因为在服务器配置中,只能填域名,所以我们要把项目发布到云服务器中,我是通过ftp的方式上传。通过附加进程的方式调试,也可用通过内外穿透的方式调试程序,我这里直接附加进程调试。 

 WeiXinApi.Web.Entry中加入可以发布文件夹的数量

<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>

直接服务器启动项目

 附加到进程

选择托管

 公众号页面测试请求

 

成功命中断点

 五、使用胜派SDK验证请求

上面的代码是直接返回了echostr,实际情况我们需要验证一下,判断是否合法,这里可以直接把胜派Demo里的拿过来,首先先在配置文件里按胜派demo里的要求配置,我放在了applicationsettings.json

   //CO2NET 设置
  "SenparcSetting": {
    //以下为 CO2NET 的 SenparcSetting 全局配置,请勿修改 key,勿删除任何项

    "IsDebug": true,
    "DefaultCacheNamespace": "DefaultCache",

    //分布式缓存
    "Cache_Redis_Configuration": "#{Cache_Redis_Configuration}#", //Redis配置
    //"Cache_Redis_Configuration": "localhost:6379",//不包含密码
    //"Cache_Redis_Configuration": "localhost:6379,password=senparc,connectTimeout=1000,connectRetry=2,syncTimeout=10000,defaultDatabase=3",//密码及其他配置
    "Cache_Memcached_Configuration": "#{Cache_Memcached_Configuration}#", //Memcached配置
    "SenparcUnionAgentKey": "#{SenparcUnionAgentKey}#" //SenparcUnionAgentKey
  },
  //Senparc.Weixin SDK 设置
  "SenparcWeixinSetting": {
    //以下为 Senparc.Weixin 的 SenparcWeixinSetting 微信配置
    //注意:所有的字符串值都可能被用于字典索引,因此请勿留空字符串(但可以根据需要,删除对应的整条设置)!

    //微信全局
    "IsDebug": true,

    //以下不使用的参数可以删除,key 修改后将会失效

    //公众号
    "Token": "jinwandalaohu", //说明:字符串内两侧#和{}符号为 Azure DevOps 默认的占位符格式,如果您有明文信息,请删除同占位符,修改整体字符串,不保留#和{},如:{"Token": "MyFullToken"}
    "EncodingAESKey": "xxx",
    "WeixinAppId": "xxx",
    "WeixinAppSecret": "xxx",
    //扩展及代理参数
    "AgentUrl": "AgentUrl",
    "AgentToken": "AgentToken",
    "SenparcWechatAgentKey": "SenparcWechatAgentKey"
  }

startup.cs里注册SDK

 var config = App.Configuration;
 services.AddSenparcGlobalServices(config)//Senparc.CO2NET 全局注册
          .AddSenparcWeixinServices(config);//Senparc.Weixin 注册

configure里配置SDK

  var senparcSetting = App.GetOptions<SenparcSetting>();
  var senparcWeixinSetting = App.GetOptions<SenparcWeixinSetting>();

    // 启动 CO2NET 全局注册,必须!
   var registerService = app.UseSenparcGlobal(env, senparcSetting, globalRegister =>
       {
         globalRegister.RegisterTraceLog(ConfigTraceLog);//配置TraceLog

       }, true)
       .UseSenparcWeixin(senparcWeixinSetting, (weixinRegister, weixinSetting) =>
       {});
ConfigTraceLog是一个方法用来配置日志
    /// <summary>
    /// 配置微信跟踪日志(演示,按需)
    /// </summary>
    private void ConfigTraceLog()
    {
        //这里设为Debug状态时,/App_Data/WeixinTraceLog/目录下会生成日志文件记录所有的API请求日志,正式发布版本建议关闭

        //如果全局的IsDebug(Senparc.CO2NET.Config.IsDebug)为false,此处可以单独设置true,否则自动为true
        Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("系统日志", "系统启动");//只在Senparc.Weixin.Config.IsDebug = true的情况下生效

        //全局自定义日志记录回调
        Senparc.CO2NET.Trace.SenparcTrace.OnLogFunc = () =>
        {
            //加入每次触发Log后需要执行的代码
            System.Console.WriteLine("加入每次触发Log后需要执行的代码");
        };

        //当发生基于WeixinException的异常时触发
        WeixinTrace.OnWeixinExceptionFunc = async ex =>
        {
            //加入每次触发WeixinExceptionLog后需要执行的代码
            System.Console.WriteLine("加入每次触发WeixinExceptionLog后需要执行的代码");
        };
    }

在接口中通过sdk的方法获取token等信息,直接在WeiXinService中添加如下代码

        public static readonly string Token = Config.SenparcWeixinSetting.MpSetting.Token;//与微信公众账号后台的Token设置保持一致,区分大小写。
        public static readonly string EncodingAESKey = Config.SenparcWeixinSetting.MpSetting.EncodingAESKey;//与微信公众账号后台的EncodingAESKey设置保持一致,区分大小写。
        public static readonly string AppId = Config.SenparcWeixinSetting.MpSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。

修改Index方法的代码,可以用胜派demo中的代码

        [HttpGet("/wx")]
        public string Index([FromQuery] PostModel postModel, string echostr)
        {
            //System.Console.WriteLine(echostr);
            //return echostr;

            if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                Console.WriteLine("通过:" + echostr);
                return echostr; //返回随机字符串则表示验证通过
            }
            else
            {
                return ("failed:" + postModel.Signature + "," + Senparc.Weixin.MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
                    "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
            }
        }

发布到服务器测试一下,通过

 

再测一下不通过的,修改了一下token,提示验证失败

六、本章Gitee地址

 https://gitee.com/huguodong520/weixinapi/tree/%E6%8E%A5%E5%85%A5%E5%85%AC%E4%BC%97%E5%8F%B7/

标签:Weixin,SenparcSdk,微信,global,Senparc,公众,echostr,using
来源: https://www.cnblogs.com/huguodong/p/16288767.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有