Exemplo n.º 1
0
        public async Task <string> CreateJsApiConfigScriptAsync(WeChatGeneralAccessToken accessToken, bool withScriptTag = true, string enableJsApiNames = _defaultEnabledJsApiNames, string enableOpenTags = _defaultEnabledOpenTags)
        {
            var cfg = await CreateJsApiConfigAsync(accessToken);

            var script = @"
					function configWeChatJsApi() {
						if (typeof(wx) == undefined) {
							setTimeout(configWeChatJsApi, 50);
						}
						else {
							wx.config({
								debug: false,
								appId: '"                                 + cfg.AppId + @"',
								timestamp: "                                 + cfg.Timestamp + @",
								nonceStr: '"                                 + cfg.NonceStr + @"',
								signature: '"                                 + cfg.Signature + @"',
								jsApiList: ["                                 + string.Join(',', enableJsApiNames.Split(',', '|').Select(x => $"'{x.Trim()}'")) + @"],
								openTagList: ["                                 + string.Join(',', enableOpenTags.Split(',', '|').Select(x => $"'{x.Trim()}'")) + @"]
							});
						}
					}
					setTimeout(configWeChatJsApi, 50);"                    ;

            if (!withScriptTag)
            {
                return(script);
            }
            return($"<script type='text/javascript'>\r\n{script}\r\n</script>");
        }
Exemplo n.º 2
0
        public async Task <Result> SendSubscribedMessageAsync <T>(WeChatGeneralAccessToken accessToken, string openId, T data, string?url) where T : IWeChatTemplateMessage
        {
            var api = "https://" + $"api.weixin.qq.com/cgi-bin/message/subscribe/bizsend?access_token={accessToken.AccessToken}";

            var message = new {
                touser      = openId,
                template_id = data.TemplateId,
                page        = url,
                data        = data
            };
            var serialized = System.Text.Json.JsonSerializer.Serialize((object)message, new JsonSerializerOptions(JsonSerializerDefaults.Web));

            var response = await DefaultHttpClient.Instance.PostAsync(api, new StringContent(serialized));

            var json = await response.Content.ReadAsStringAsync();

            var d = JsonConvert.DeserializeObject <dynamic>(json);

            var ok = d.errcode == null || (int)d.errcode == 0;

            if (!ok)
            {
                return(new Failure((int)d.errcode + ": " + d.errmsg));
            }
            return(new Success());
        }
Exemplo n.º 3
0
        public async Task <WeChatJsApiConfig> CreateJsApiConfigAsync(WeChatGeneralAccessToken accessToken)
        {
            if (_httpContextAccessor.HttpContext == null)
            {
                throw new InvalidProgramException("Can not call this method when IHttpContextAccessor.HttpContext is null.");
            }

            _options.RequireMobilePlatformSettings();

            var config = new WeChatJsApiConfig {
                AppId     = _options.MobilePlatformAppId !,
                NonceStr  = Crypto.RandomString(16),
                Timestamp = DateTime.Now.Timestamp(),
                Ticket    = await GetJsApiTicketAsync(accessToken),
            };

            var sb = new StringBuilder();

            sb.Append("jsapi_ticket=" + config.Ticket);
            sb.Append("&noncestr=" + config.NonceStr);
            sb.Append("&timestamp=" + config.Timestamp.ToString());
            sb.Append("&url=" + _httpContextAccessor.HttpContext.Request.FullUrl().Split('#').First());

            config.RawString = sb.ToString();
            config.Signature = Crypto.SHA1(config.RawString);
            return(config);
        }
Exemplo n.º 4
0
        public async Task <string> GetJsApiTicketAsync(WeChatGeneralAccessToken accessToken)
        {
            return(await _cache.GetOrCreate(accessToken.AccessToken + nameof(GetJsApiTicketAsync), async entry => {
                var url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket" + $"?access_token={accessToken.AccessToken}&type=jsapi";
                try {
                    var json = await DefaultHttpClient.Instance.GetStringAsync(url);
                    var d = JsonConvert.DeserializeObject <dynamic>(json);

                    var ok = d.errcode == null || (int)d.errcode == 0;
                    entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(ok ? (int)d.expires_in : 1));

                    return d.ticket ?? ((int)d.errcode + ": " + d.errmsg);
                }
                catch (Exception e) {
                    return e.Message;
                }
            }));
        }