查看: 711|回复: 0

[.NET开发] 记一次微信公众号的开发与后台搭建

发表于 2017-9-26 08:00:01
尚学堂AD

一.背景

  刚入新公司不久,就碰见一个同事要离职,就交接了这个项目给我。同事的离职比较仓促,所以交接的也不是很好,这也是后面问题偏多的一个客观原因。项目如题所示,前端采用vue.js+node.js开发,后台采用C#开发接口,还需要开发一个c#的网站来展示数据。上一份工作做的是erp,用的是powerbuilder,所以这个项目还是涉及到比较多的生疏知识。

二.遇到的问题

  1.微信测试环境搭建

    微信的测试环境搭建还是比较麻烦的(对于新手来说),但是我回过头去看的时候,也不知道该写些什么,还是网上找教程吧。

2.微信录音上传下载   微信录音如果想要下载的指定路径,需要先上传录音到微信服务器,再根据返回的serverId(即下载的MEDIA_ID)去微信提供的接口下载到你目标路径,微信测试环境没问题的话,按照这个基本上就没有问题,不过调试之类的比较麻烦,只能通过写日志的方式查看。微信也提供了一个供测试的界面,输入参数,可以获取报错信息。
  1. /// <SUMMARY>
  2. /// 下载保存多媒体文件,返回多媒体保存路径
  3. /// </SUMMARY>
  4. /// <PARAM name="ACCESS_TOKEN"></PARAM>
  5. /// <PARAM name="MEDIA_ID"></PARAM>
  6. /// <RETURNS></RETURNS>
  7. public string GetMultimedia(string ACCESS_TOKEN, string MEDIA_ID)
  8. {
  9. string file = string.Empty;
  10. string strpath = string.Empty;
  11. string stUrl = Common.TextHelper.WXUploadMediaUrl+"?access_token=" + ACCESS_TOKEN + "&media_id=" + MEDIA_ID;
  12. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(stUrl);
  13. req.Method = "GET";
  14. using (WebResponse wr = req.GetResponse())
  15. {
  16. HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
  17. strpath = myResponse.ResponseUri.ToString();
  18. WebClient mywebclient = new WebClient();
  19. string basePath = AppDomain.CurrentDomain.BaseDirectory + "Attachment";//附件临时存放路径
  20. string amrFile = DateTime.Now.ToString("yyyyMMddhhmmssms")+".amr";
  21. string mp3File= DateTime.Now.ToString("yyyyMMddhhmmssms")+".mp3";
  22. try
  23. {
  24. mywebclient.DownloadFile(strpath, Path.Combine(basePath, amrFile));
  25. ConvertToMp3(Path.Combine(basePath, amrFile), Path.Combine(basePath, mp3File));
  26. file = mp3File;
  27. //file = amrFile;
  28. }
  29. catch (Exception ex)
  30. {
  31. //savepath = ex.ToString();
  32. }
  33. }
  34. return file ;
  35. }
复制代码
View Code

参考文档:http://www.cnblogs.com/zhangs1986/p/3636234.html 3.微信录音格式转换   amr格式的文件,网页不能播放,所以需要转换成MP3格式,查看了许多都选择使用第三方工具ffmpeg。刚开始使用的时候,遇到了MP3可以转成wav格式,但是amr格式不能转成mp3的尴尬局面。折腾了许久,后面经过检查才发现用于测试的amr文件坏掉了。这个故事告诉我们一定要细心,还有遇到问题不用慌,深呼吸一口气,从头检查一遍,或许会有收获。
  1. public string ConvertToMp3(string pathBefore, string pathLater)
  2. {
  3. string c = System.Web.HttpContext.Current.Server.MapPath("/ffmpeg/") + @"ffmpeg.exe -i " + pathBefore + " " + pathLater;
  4. log.WriteLine(c);
  5. string str = RunCmd(c);
  6. return str;
  7. }
  8. /// <summary>
  9. /// 执行Cmd命令
  10. /// </summary>
  11. private string RunCmd(string c)
  12. {
  13. try
  14. {
  15. ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
  16. info.RedirectStandardOutput = false;
  17. info.UseShellExecute = false;
  18. Process p = Process.Start(info);
  19. p.StartInfo.UseShellExecute = false;
  20. p.StartInfo.RedirectStandardInput = true;
  21. p.StartInfo.RedirectStandardOutput = true;
  22. p.StartInfo.RedirectStandardError = true;
  23. p.Start();
  24. p.StandardInput.WriteLine(c);
  25. p.StandardInput.AutoFlush = true;
  26. Thread.Sleep(1000);
  27. p.StandardInput.WriteLine("exit");
  28. p.WaitForExit();
  29. string outStr = p.StandardOutput.ReadToEnd();
  30. p.Close();
  31. return outStr;
  32. }
  33. catch (Exception ex)
  34. {
  35. return "error" + ex.Message;
  36. }
  37. }
复制代码
View Code 参考文档:http://www.cnblogs.com/LittleBai/p/5924416.html 4.路径正确,却无法获取附件(iis mine类型配置)   公众号提交的信息包含图片、音频、视频,上传到服务器后都是放在同一个文件夹,但是网页显示的时候,图片可以访问,音频、视频却提示不能访问。问了老大才知道iis上mine类型需要加下配置。由于我之前做的不是网页开发,甚至不是c#开发,所以很多坑还没踩过,只能一个个踩过去,才会长记性。所谓经验,大概就是踩过的坑比较多吧! 5.图片旋转   这个倒是没什么好说的,图片旋转的简单实现而已  
  1. function rotate(row)
  2. {
  3. var deg = eval('get' + $("#" + row).css('transform'));//构造getmatrix函数,返回上次旋转度数
  4. var step = 90;//每次旋转多少度
  5. $("#" + row).css({ 'transform': 'rotate(' + (deg + step) % 360 + 'deg)' });
  6. }
  7. function getmatrix(a, b, c, d, e, f) {
  8. var aa = Math.round(180 * Math.asin(a) / Math.PI);
  9. var bb = Math.round(180 * Math.acos(b) / Math.PI);
  10. var cc = Math.round(180 * Math.asin(c) / Math.PI);
  11. var dd = Math.round(180 * Math.acos(d) / Math.PI);
  12. var deg = 0;
  13. if (aa == bb || -aa == bb) {
  14. deg = dd;
  15. } else if (-aa + bb == 180) {
  16. deg = 180 + cc;
  17. } else if (aa + bb == 180) {
  18. deg = 360 - cc || 360 - dd;
  19. }
  20. return deg >= 360 ? 0 : deg;
  21. //return (aa+','+bb+','+cc+','+dd);
  22. }
复制代码
View Code

 参考文档: http://m.blog.csdn.net/cengjingcanghai123/article/details/53537242

     

三.总结

  花了将近一个月的时间,虽然过程磕磕碰碰,但总体来说还是完成了任务。不足之处有很多,比如前端样式贼丑(虽然我不是前端,不过小公司只能前后端兼收并蓄了),比如效率略低(这个是因为我之前做的是pb,c#虽然有基础,但是实际的开发经验并不多)。大体来说,对自己的表现还算满意,毕竟涉及到的东西都不太熟悉,一个月的时候能够完成任务,打个60分吧!我的优点在于逻辑能力与数据库(上一份工作是做erp的,虐出来),缺点也很明显(基础不够好,所以还是需要狠补基础),希望再接再厉!如果写下的这篇文章能够解决某个猿的部分问题,可以让某些猿少踩一个坑,我就挺开心的!文笔不好,絮絮叨叨,求轻虐!



回复

使用道具 举报