企業(yè)微信接口文檔
2.回調(diào)獲取到 Code 通過code+access_token去 請求用戶信息
調(diào)試準備工作 -->內(nèi)網(wǎng)穿透+域名 推薦向日葵有免費的,免費的開發(fā)測試夠用了
域名的配置成可信用
上代碼 Demo下載
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
|
[ApiController] [Route( "api/[controller]" )] public class Auth2Controller : ControllerBase { private readonly string _agentId = "1000002" ; private readonly string _secret = "Y3f8ESBIBJoC8M_FPHOlpvmghS_Nn2ceFePRVZjw9_E" ; private readonly string _corpId = "wwbf72a7a059eac0f8" ; /// <summary> /// 授權地址 /// </summary> private readonly string _auth2url = "https://open.weixin.qq.com/connect/oauth2/authorize" ; /// <summary> /// 授權回調(diào)地址 /// </summary> private readonly string _callbackurl = "http://******.zicp.vip/auth2callback/api/Auth2/Callback" ; /// <summary> /// 獲取access_token地址 /// </summary> private readonly string _gettokenurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken" ; /// <summary> /// 獲取訪問用戶身份地址 /// </summary> private readonly string _getuserurl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo" ; private readonly ILogger<Auth2Controller> _logger; private readonly IHttpClientFactory _clientFactory; private readonly IMemoryCache _memoryCache; public Auth2Controller(ILogger<Auth2Controller> logger, IHttpClientFactory clientFactory, IMemoryCache memoryCache) { _logger = logger; _clientFactory = clientFactory; _memoryCache = memoryCache; } [HttpGet] public IActionResult Auth2( string redirecturi) { string strurl = $ "{_auth2url}?" + $ "&appid={_corpId}" + $ "&redirect_uri={System.Web.HttpUtility.UrlEncode(_callbackurl)}" + $ "&response_type=code" + $ "&scope={_secret}" + $ "&agentid={_agentId}" + $ "&state={System.Web.HttpUtility.UrlEncode(redirecturi)}#wechat_redirect" ; return Redirect(strurl); } [HttpGet( "Callback" )] public async Task<IActionResult> Callback( string code, string state) { /** 1)code只能消費一次,不能重復消費。比如說,是否存在多個服務器同時消費同一code情況。 2)code需要在有效期間消費(5分鐘),過期會自動失效。 */ string access_token = await GetAccessToken(); string url = $ "{_getuserurl}?access_token={access_token}&code=[code]" ; HttpResponseMessage response = await _clientFactory.CreateClient().GetAsync(url); if (response.StatusCode == System.Net.HttpStatusCode.OK) { using (var responseStream = await response.Content.ReadAsStreamAsync()) { var userinfo = JsonConvert.DeserializeObject<dynamic>( new StreamReader(responseStream).ReadToEnd()); int errcode = userinfo.errcode; if (errcode == 0) { //企業(yè)成員 string UserId = userinfo.UserId; //外部成員 string OpenId = userinfo.OpenId; /** userid是系統(tǒng)生成的可以修改一次; 所以后面的業(yè)務邏輯如果遇到錯誤就要重新授權一下; */ if (UserId== null ) { _memoryCache.Set< string >( "UserId" , OpenId); } else { _memoryCache.Set< string >( "UserId" , UserId); } } else { _logger.LogError($ "getuserinfo請求錯誤:{userinfo.errmsg}" ); return Ok(); } } } return Redirect($ "{System.Web.HttpUtility.UrlDecode(state)}?UserId={_memoryCache.Get<string>(" UserId ")}" ); } public async Task< string > GetAccessToken() { if (_memoryCache.Get< string >( "AccessToken" ) == null ) { string url = $ "{_gettokenurl}?corpid={_corpId}&corpsecret={_secret}" ; HttpResponseMessage response = await _clientFactory.CreateClient().GetAsync(url); if (response.StatusCode == System.Net.HttpStatusCode.OK) { using (var responseStream = await response.Content.ReadAsStreamAsync()) { var access_token_result = JsonConvert.DeserializeObject<dynamic>( new StreamReader(responseStream).ReadToEnd()); int errcode = access_token_result.errcode; if (errcode == 0) { string access_token = access_token_result.access_token; int expires_in = access_token_result.expires_in; _memoryCache.Set< string >( "AccessToken" , access_token, DateTimeOffset.Now.AddSeconds(expires_in - 10)); } else { _logger.LogError($ "access_token請求錯誤:{access_token_result.errmsg }" ); } } } } return _memoryCache.Get< string >( "AccessToken" ); } } |
到此這篇關于Asp.Net Core 企業(yè)微信靜默授權的實現(xiàn)的文章就介紹到這了,更多相關Asp.Net Core 靜默授權內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/SuperDust/p/13769975.html