示例#1
0
        /// <summary>
        /// 对于已经提交微信后台的图文素材,只能按篇更新现有文章
        /// </summary>
        /// <param name="domainContext"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public string UpdateArticleMaterialItem(DomainContext domainContext, ArticleMaterialEntity args)
        {
            //受限于微信接口,更新图文素材只能删除原素材重新添加
            //因为重新添加会导致media_id发生变化,所以本地在使用时,要用自己的ID并维护不变
            //但是!如果把微信素材库的素材删除,会导致已经发送给关注者的连接失效,打不开
            //所以这里只删除本地的,微信后台的保持不删除
            //但是这种方式还有一个问题,就是修改是假修改,已经发给用户的素材事实上不会变化
            //而在微信后台修改图文内容是可以实现真修改的。
            //目前只能把本地保存和发布微信后台分开,一旦发布了微信后台,就不再允许添加删除文章

            if (args == null || args.ArticleList == null)
            {
                return("参数错误");
            }

            for (int i = 0; i < args.ArticleList.Count; i++)
            {
                ArticleMaterialItemEntity article = args.ArticleList[i];
                article.Index = i;
                if (article.ImgMappingList != null)
                {
                    article.ImgMapping = JsonHelper.Serializer(article.ImgMappingList);
                }
                _dataBase.Update(article);
            }

            //发布微信后台
            for (int i = 0; i < args.ArticleList.Count; i++)
            {
                ArticleMaterialItemEntity article = args.ArticleList[i];

                //替换其中的图片地址为上传到微信服务器的地址
                if (article.ImgMappingList != null)
                {
                    foreach (var imgMappingItem in article.ImgMappingList)
                    {
                        if (String.IsNullOrEmpty(imgMappingItem.FileUrl) || String.IsNullOrEmpty(imgMappingItem.WeixinUrl))
                        {
                            continue;
                        }

                        article.Content =
                            article.Content.Replace(imgMappingItem.FileUrl, imgMappingItem.WeixinUrl);
                    }
                }

                WeixinUpdateArticleMaterialArgs weixinArgs = new WeixinUpdateArticleMaterialArgs();
                weixinArgs.MediaId = args.MediaId;
                weixinArgs.Index   = i;
                weixinArgs.Article = article;

                RequestApiResult updateArticleMaterialResult =
                    MaterialApiWrapper.UpdateArticleMaterial(domainContext, weixinArgs);

                if (updateArticleMaterialResult.Success == false)
                {
                    return(updateArticleMaterialResult.Message);
                }
            }

            return(null);
        }
        public static RequestApiResult UpdateArticleMaterial(DomainContext domainContext, WeixinUpdateArticleMaterialArgs args)
        {
            string           accessToken = domainContext.AccessToken;
            RequestApiResult result      = MaterialApi.UpdateArticleMaterial(accessToken, args);

            if (result.Success == false)
            {
                if (result.Retry)
                {
                    if (result.ApiError.ErrorCode == 40001)
                    {
                        accessToken = AccessTokenGetter.Refresh(domainContext.AppId, accessToken);
                    }

                    result = MaterialApi.UpdateArticleMaterial(accessToken, args);
                    if (result.Success == false)
                    {
                        _log.Write("MaterialApi.UpdateArticleMaterial 失败",
                                   result.GetDetail(), TraceEventType.Warning);
                    }
                }
                else
                {
                    _log.Write("MaterialApi.UpdateArticleMaterial 失败",
                               result.GetDetail(), TraceEventType.Warning);
                }
            }

            return(result);
        }