forked from JeffreySu/WeiXinMPSDK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGlobal.asax.cs
576 lines (469 loc) · 25.4 KB
/
Global.asax.cs
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
#define 使用RegisterServices方式注册
/*
* 调试方式:当前模式为“使用RegisterServices方式注册”(推荐),
* 如需使用原始(底层)注册方式,修改下方 #if 后的条件文字(如加上一个"0"),使之不成立即可。
*/
#if 使用RegisterServices方式注册
using Senparc.CO2NET;
using Senparc.CO2NET.Cache;
using Senparc.CO2NET.Cache.Memcached;
using Senparc.CO2NET.RegisterServices;
using Senparc.CO2NET.Utilities;
using Senparc.Weixin.Entities;
using Senparc.Weixin.Exceptions;
using Senparc.Weixin.MP.Sample.CommonService;
//DPBMARK WebSocket
using Senparc.Weixin.MP.Sample.CommonService.MessageHandlers.WebSocket;//DPBMARK_END
//DPBMARK Open
using Senparc.Weixin.Open;
using Senparc.Weixin.Open.ComponentAPIs;//DPBMARK_END
//DPBMARK TenPay
using Senparc.Weixin.TenPay;//DPBMARK_END
//DPBMARK Work
using Senparc.Weixin.Work;//DPBMARK_END
//DPBMARK MiniProgram
using Senparc.Weixin.WxOpen;//DPBMARK_END
using System.IO;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace Senparc.Weixin.MP.Sample
{
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//DPBMARK WebSocket
RegisterWebSocket();//微信注册WebSocket模块(按需,必须执行在RouteConfig.RegisterRoutes()之前)
//DPBMARK_END
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
/*
* CO2NET 全局注册开始
* 建议按照以下顺序进行注册
*/
/*
* CO2NET 是从 Senparc.Weixin 分离的底层公共基础模块,经过了长达 6 年的迭代优化。
* 关于 CO2NET 在所有项目中的通用设置可参考 CO2NET 的 Sample:
* https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs
*/
//设置全局 Debug 状态
var isGLobalDebug = true;
//全局设置参数,将被储存到 Senparc.CO2NET.Config.SenparcSetting
var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug);
//也可以通过这种方法在程序任意位置设置全局 Debug 状态:
//Senparc.CO2NET.Config.IsDebug = isGLobalDebug;
//CO2NET 全局注册,必须!!
IRegisterService register = RegisterService.Start(senparcSetting).UseSenparcGlobal();
#region 全局缓存配置(按需)
//当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须)
register.ChangeDefaultCacheNamespace("DefaultCO2NETCache");
#region 配置和使用 Redis -- DPBMARK Redis
//配置全局使用Redis缓存(按需,独立)
var redisConfigurationStr = senparcSetting.Cache_Redis_Configuration;
var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置";
if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略
{
/* 说明:
* 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略
/* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用)
*/
Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr);
//以下会立即将全局缓存设置为 Redis
Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐)
//Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略
//也可以通过以下方式自定义当前需要启用的缓存策略
//CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对
//CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet
}
//如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存
#endregion // DPBMARK_END
#region 配置和使用 Memcached -- DPBMARK Memcached
//配置Memcached缓存(按需,独立)
var memcachedConfigurationStr = senparcSetting.Cache_Memcached_Configuration;
var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "Memcached配置";
if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略
{
/* 说明:
* 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略
/* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用)
*/
Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(memcachedConfigurationStr);
//以下会立即将全局缓存设置为 Memcached
Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow();
//也可以通过以下方式自定义当前需要启用的缓存策略
CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance);
}
#endregion // DPBMARK_END
#endregion
#region 注册日志(按需,建议)
register.RegisterTraceLog(ConfigWeixinTraceLog);//配置TraceLog
#endregion
/* 微信配置开始
* 建议按照以下顺序进行注册
*/
//设置微信 Debug 状态
var isWeixinDebug = true;
//全局设置参数,将被储存到 Senparc.Weixin.Config.SenparcWeixinSetting
var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug);
//也可以通过这种方法在程序任意位置设置微信的 Debug 状态:
//Senparc.Weixin.Config.IsDebug = isWeixinDebug;
//微信全局注册,必须!!
register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting)
#region 注册公众号或小程序(按需)
//注册公众号(可注册多个) -- DPBMARK MP
.RegisterMpAccount(senparcWeixinSetting, "【盛派网络小助手】公众号")// DPBMARK_END
//注册多个公众号或小程序(可注册多个) -- DPBMARK MiniProgram
.RegisterWxOpenAccount(senparcWeixinSetting, "【盛派网络小助手】小程序")// DPBMARK_END
//除此以外,仍然可以在程序任意地方注册公众号或小程序:
//AccessTokenContainer.Register(appId, appSecret, name);//命名空间:Senparc.Weixin.MP.Containers
#endregion
#region 注册企业号(按需) -- DPBMARK Work
//注册企业微信(可注册多个)
.RegisterWorkAccount(senparcWeixinSetting, "【盛派网络】企业微信")
//除此以外,仍然可以在程序任意地方注册企业微信:
//AccessTokenContainer.Register(corpId, corpSecret, name);//命名空间:Senparc.Weixin.Work.Containers
#endregion // DPBMARK_END
#region 注册微信支付(按需) -- DPBMARK TenPay
//注册旧微信支付版本(V2)(可注册多个)
.RegisterTenpayOld(senparcWeixinSetting, "【盛派网络小助手】公众号")//这里的 name 和第一个 RegisterMpAccount() 中的一致,会被记录到同一个 SenparcWeixinSettingItem 对象中
//注册最新微信支付版本(V3)(可注册多个)
.RegisterTenpayV3(senparcWeixinSetting, "【盛派网络小助手】公众号")//记录到同一个 SenparcWeixinSettingItem 对象中
#endregion // DPBMARK_END
#region 注册微信第三方平台(按需) -- DPBMARK Open
//注册第三方平台(可注册多个)
.RegisterOpenComponent(senparcWeixinSetting,
//getComponentVerifyTicketFunc
async componentAppId =>
{
var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/OpenTicket"));
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId));
using (var fs = new FileStream(file, FileMode.Open))
{
using (var sr = new StreamReader(fs))
{
var ticket = await sr.ReadToEndAsync();
return ticket;
}
}
},
//getAuthorizerRefreshTokenFunc
async (componentAppId, auhtorizerId) =>
{
var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId));
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId));
if (!File.Exists(file))
{
return null;
}
using (Stream fs = new FileStream(file, FileMode.Open))
{
var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs);
return result.authorizer_refresh_token;
}
},
//authorizerTokenRefreshedFunc
async (componentAppId, auhtorizerId, refreshResult) =>
{
var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId));
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId));
using (Stream fs = new FileStream(file, FileMode.Create))
{
//这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken
var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
binFormat.Serialize(fs, refreshResult);
fs.Flush();
}
}, "【盛派网络】开放平台")
//除此以外,仍然可以在程序任意地方注册开放平台:
//ComponentContainer.Register();//命名空间:Senparc.Weixin.Open.Containers
#endregion // DPBMARK_END
;
/* 微信配置结束 */
}
//DPBMARK WebSocket
/// <summary>
/// 注册WebSocket模块(可用于小程序或独立WebSocket应用)
/// </summary>
private void RegisterWebSocket()
{
Senparc.WebSocket.WebSocketConfig.RegisterRoutes(RouteTable.Routes);
Senparc.WebSocket.WebSocketConfig.RegisterMessageHandler<CustomNet45WebSocketMessageHandler>();
}
//DPBMARK_END
/// <summary>
/// 配置微信跟踪日志
/// </summary>
private void ConfigWeixinTraceLog()
{
//Senparc.CO2NET.Config.IsDebug = false;
//这里设为Debug状态时,/App_Data/WeixinTraceLog/目录下会生成日志文件记录所有的API请求日志,正式发布版本建议关闭
Senparc.Weixin.WeixinTrace.SendCustomLog("系统日志", "系统启动");//只在Senparc.Weixin.Config.IsDebug = true的情况下生效
//自定义日志记录回调
Senparc.Weixin.WeixinTrace.OnLogFunc = () =>
{
//加入每次触发Log后需要执行的代码
};
//当发生基于WeixinException的异常时触发
Senparc.Weixin.WeixinTrace.OnWeixinExceptionFunc = async ex =>
{
//加入每次触发WeixinExceptionLog后需要执行的代码
//发送模板消息给管理员
var eventService = new EventService();
await eventService.ConfigOnWeixinExceptionFunc(ex);
};
}
}
}
#else
#region 使用原始(底层)注册方式
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Senparc.Weixin.Cache;
using Senparc.Weixin.Cache.Memcached;
using Senparc.Weixin.Cache.Redis;
using Senparc.Weixin.MP.Containers;
using Senparc.Weixin.MP.Sample.CommonService;
using Senparc.Weixin.MP.Sample.CommonService.MessageHandlers.WebSocket;
using Senparc.Weixin.Open.ComponentAPIs;
using Senparc.Weixin.Open.Containers;
using Senparc.Weixin.Threads;
using Senparc.Weixin.TenPay;
namespace Senparc.Weixin.MP.Sample
{
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterWebSocket(); //微信注册WebSocket模块(按需,必须执行在RouteConfig.RegisterRoutes()之前)
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
/* 微信配置开始
*
* 建议按照以下顺序进行注册,尤其须将缓存放在第一位!
*/
RegisterWeixinCache(); //注册分布式缓存(按需,如果需要,必须放在第一个)
ConfigWeixinTraceLog(); //配置微信跟踪日志(按需)
RegisterWeixinThreads(); //激活微信缓存及队列线程(必须)
RegisterSenparcWeixin(); //注册Demo所用微信公众号的账号信息(按需)
//RegisterSenparcQyWeixin(); //注册Demo所用微信企业号的账号信息(已经移植到Work)
RegisterSenparcWorkWeixin(); //注册Demo所用企业微信的账号信息(按需)
RegisterWeixinPay(); //注册微信支付(按需)
RegisterWeixinThirdParty(); //注册微信第三方平台(按需)
/* 微信配置结束 */
}
/// <summary>
/// 自定义缓存策略
/// </summary>
private void RegisterWeixinCache()
{
// 当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须)
Weixin.Config.DefaultCacheNamespace = "DefaultWeixinCache";
#region Redis配置
//如果留空,默认为localhost(默认端口)
var redisConfiguration = System.Configuration.ConfigurationManager.AppSettings["Cache_Redis_Configuration"];
RedisManager.ConfigurationOption = redisConfiguration;
//如果不执行下面的注册过程,则默认使用本地缓存
if (!string.IsNullOrEmpty(redisConfiguration) && redisConfiguration != "Redis配置")
{
CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//Redis
}
#endregion
#region Memcached 配置
var memcachedConfig = new Dictionary<string, int>()
{
{ "localhost",9101 }
};
MemcachedObjectCacheStrategy.RegisterServerList(memcachedConfig);
#endregion
//CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedContainerStrategy.Instance);//Memcached
}
/// <summary>
/// 注册WebSocket模块(可用于小程序或独立WebSocket应用)
/// </summary>
private void RegisterWebSocket()
{
Senparc.WebSocket.WebSocketConfig.RegisterRoutes(RouteTable.Routes);
Senparc.WebSocket.WebSocketConfig.RegisterMessageHandler<CustomWebSocketMessageHandler>();
}
/// <summary>
/// 激活微信缓存
/// </summary>
private void RegisterWeixinThreads()
{
ThreadUtility.Register();//如果不注册此线程,则AccessToken、JsTicket等都无法使用SDK自动储存和管理。
}
/// <summary>
/// 注册Demo所用微信公众号的账号信息
/// </summary>
private void RegisterSenparcWeixin()
{
//注册公众号
AccessTokenContainer.Register(
System.Configuration.Config.SenparcWeixinSetting.WeixinAppId,
System.Configuration.Config.SenparcWeixinSetting.WeixinAppSecret,
"【盛派网络小助手】公众号");
//注册小程序(完美兼容)
AccessTokenContainer.Register(
System.Configuration.Config.SenparcWeixinSetting.WxOpenAppId,
System.Configuration.Config.SenparcWeixinSetting.WxOpenAppSecret,
"【盛派互动】小程序");
}
/// <summary>
/// 注册Demo所用企业微信的账号信息
/// </summary>
private void RegisterSenparcWorkWeixin()
{
Senparc.Weixin.Work.Containers.ProviderTokenContainer.Register(
System.Configuration.Config.SenparcWeixinSetting.WeixinCorpId,
System.Configuration.Config.SenparcWeixinSetting.WeixinCorpSecret,
"【盛派网络】企业微信"
);
}
/// <summary>
/// 注册微信支付
/// </summary>
private void RegisterWeixinPay()
{
//提供微信支付信息
var weixinPay_PartnerId = System.Configuration.ConfigurationManager.AppSettings["WeixinPay_PartnerId"];
var weixinPay_Key = System.Configuration.ConfigurationManager.AppSettings["WeixinPay_Key"];
var weixinPay_AppId = System.Configuration.ConfigurationManager.AppSettings["WeixinPay_AppId"];
var weixinPay_AppKey = System.Configuration.ConfigurationManager.AppSettings["WeixinPay_AppKey"];
var weixinPay_TenpayNotify = System.Configuration.ConfigurationManager.AppSettings["WeixinPay_TenpayNotify"];
var tenPayV3_MchId = Config.SenparcWeixinSetting.TenPayV3_MchId;
var tenPayV3_Key = System.Configuration.ConfigurationManager.AppSettings["TenPayV3_Key"];
var tenPayV3_AppId = Config.SenparcWeixinSetting.TenPayV3_MchId;
var tenPayV3_AppSecret = System.Configuration.ConfigurationManager.AppSettings["TenPayV3_AppSecret"];
var tenPayV3_TenpayNotify = System.Configuration.ConfigurationManager.AppSettings["TenPayV3_TenpayNotify"];
var weixinPayInfo = new TenPayInfo(weixinPay_PartnerId, weixinPay_Key, weixinPay_AppId, weixinPay_AppKey, weixinPay_TenpayNotify);
TenPayInfoCollection.Register(weixinPayInfo);
var tenPayV3Info = new TenPayV3Info(tenPayV3_AppId, tenPayV3_AppSecret, tenPayV3_MchId, tenPayV3_Key,
tenPayV3_TenpayNotify);
TenPayV3InfoCollection.Register(tenPayV3Info);
}
/// <summary>
/// 注册微信第三方平台
/// </summary>
private void RegisterWeixinThirdParty()
{
Func<string, string> getComponentVerifyTicketFunc = componentAppId =>
{
var dir = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data\\OpenTicket");
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId));
using (var fs = new FileStream(file, FileMode.Open))
{
using (var sr = new StreamReader(fs))
{
var ticket = sr.ReadToEnd();
return ticket;
}
}
};
Func<string, string, string> getAuthorizerRefreshTokenFunc = (componentAppId, auhtorizerId) =>
{
var dir = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data\\AuthorizerInfo\\" + componentAppId);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId));
if (!File.Exists(file))
{
return null;
}
using (Stream fs = new FileStream(file, FileMode.Open))
{
BinaryFormatter binFormat = new BinaryFormatter();
var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs);
return result.authorizer_refresh_token;
}
};
Action<string, string, RefreshAuthorizerTokenResult> authorizerTokenRefreshedFunc = (componentAppId, auhtorizerId, refreshResult) =>
{
var dir = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data\\AuthorizerInfo\\" + componentAppId);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId));
using (Stream fs = new FileStream(file, FileMode.Create))
{
//这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken
BinaryFormatter binFormat = new BinaryFormatter();
binFormat.Serialize(fs, refreshResult);
fs.Flush();
}
};
//执行注册
ComponentContainer.Register(
ConfigurationManager.AppSettings["Component_Appid"],
ConfigurationManager.AppSettings["Component_Secret"],
getComponentVerifyTicketFunc,
getAuthorizerRefreshTokenFunc,
authorizerTokenRefreshedFunc,
"【盛派网络】开放平台");
}
/// <summary>
/// 配置微信跟踪日志
/// </summary>
private void ConfigWeixinTraceLog()
{
//这里设为Debug状态时,/App_Data/WeixinTraceLog/目录下会生成日志文件记录所有的API请求日志,正式发布版本建议关闭
Senparc.Weixin.Config.IsDebug = true;
Senparc.Weixin.WeixinTrace.SendCustomLog("系统日志", "系统启动");//只在Senparc.Weixin.Config.IsDebug = true的情况下生效
//自定义日志记录回调
Senparc.Weixin.WeixinTrace.OnLogFunc = () =>
{
//加入每次触发Log后需要执行的代码
};
//当发生基于WeixinException的异常时触发
Senparc.Weixin.WeixinTrace.OnWeixinExceptionFunc = ex =>
{
//加入每次触发WeixinExceptionLog后需要执行的代码
//发送模板消息给管理员
var eventService = new EventService();
eventService.ConfigOnWeixinExceptionFunc(ex);
};
}
}
}
#endregion
#endif