1、微信小程序获取Access_token

access_token具体时效看官方文档。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Web;
  6. using TT.Utilities;
  7.  
  8. namespace DjwzApi.Com
  9. {
  10. public class WeChatApi
  11. {
  12. public static string AppID = TT.Utilities.Config.ConfigureAppConfig.GetAppSettingsKeyValue("AppID");
  13. public static string AppSecret = TT.Utilities.Config.ConfigureAppConfig.GetAppSettingsKeyValue("AppSecret");
  14.  
  15. private static string Access_token = "";
  16. private static DateTime Expires_in_time = DateTime.Now;
  17.  
  18. static object lockObj = new object();
  19. /// <summary>
  20. /// 获取Access_token
  21. /// </summary>
  22. /// <param name="AppID"></param>
  23. /// <param name="AppSecret"></param>
  24. /// <returns></returns>
  25. public static string GetAccess_token(string AppID = null, string AppSecret = null)
  26. {
  27. lock (lockObj)
  28. {
  29. if (string.IsNullOrEmpty(Access_token) || ((DateTime.Now - Expires_in_time).TotalSeconds >= -))
  30. {
  31. lock (lockObj)
  32. {
  33. Access_token = "";
  34. Expires_in_time = DateTime.Now;
  35. AppID = AppID ?? WeChatApi.AppID;
  36. AppSecret = AppSecret ?? WeChatApi.AppSecret;
  37.  
  38. string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
  39. url = string.Format(url, AppID, AppSecret);
  40.  
  41. var json = "";
  42. try
  43. {
  44. json = TT.Utilities.Web.HttpClientUti.DoGet(url);
  45. }
  46. catch (Exception ex)
  47. {
  48. System.Threading.Tasks.Task.Factory.StartNew(() => utils.LogHelper.WriteLog(ex.Message));
  49. throw new Exception("获取微信端access_token失败," + ex.Message);
  50. }
  51.  
  52. //{"access_token":"12_TrAgGuiF64W8XPRXyFRFUK7SjzZptoa3ogS4mGKp-W-ni6dG_OoMNMbm_7q9lhYcx85xh-SNe3BUC_6Lg1H6FDMU7fUsKoG4NwN5EA-NVOCVUZg0OIdTvOmgHMgCxJQ1vWP__VvId4AJ2Bm_QYPdABAFNE","expires_in":7200}
  53. dynamic obj = new { access_token = "", expires_in = , errcode = , errmsg = "" };
  54. obj = TT.Utilities.Json.JsonHelper.DeserializeAnonymousType(json, obj);
  55. if (obj.errcode == )
  56. {
  57. Expires_in_time = DateTime.Now.AddSeconds(obj.expires_in);
  58. Access_token = obj.access_token;
  59. }
  60. return Access_token;
  61. }
  62. }
  63. else
  64. {
  65. return Access_token;
  66. }
  67. }
  68. }
  69. }
  70. }

2、获取二维码

 这里实现了官网文档中提到的 接口A和接口C

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using System.Web;
  8.  
  9. namespace DjwzApi.Com
  10. {
  11. public class WxQrcode
  12. {
  13. private const string line_color = "{\"r\":\"0\",\"g\":\"0\",\"b\":\"0\"}";
  14. /// <summary>
  15. /// 接口A: 生成小程序码, 适用于需要的码数量较少的业务场景
  16. /// </summary>
  17. /// <returns></returns>
  18. public static string QrcodeA(string path, int width = , bool auto_color = false, string line_color = line_color, bool is_hyaline = false)
  19. {
  20. string url = "https://api.weixin.qq.com/wxa/getwxacode?access_token={0}";
  21. var ACCESS_TOKEN = WeChatApi.GetAccess_token();
  22. url = string.Format(url, ACCESS_TOKEN);
  23. var arg = new Dictionary<string, string> {
  24. {"path",path},
  25. {"width",width.ToString()},
  26. //{"auto_color","false"},
  27. //{"line_color",line_color},
  28. //{"is_hyaline",is_hyaline.ToString()},
  29. };
  30. var response = TT.Utilities.Web.HttpRequest.DoPost_WebResponse(url, arg, null, , TT.Utilities.Web.HttpContentTypes.HttpContentTypeEnum.JSON);
  31.  
  32. return SaveImg(response);
  33. }
  34.  
  35. /// <summary>
  36. /// 接口C: 生成二维码, 适用于需要的码数量较少的业务场景
  37. /// </summary>
  38. /// <returns></returns>
  39. public static string QrcodeC(string path, int width = )
  40. {
  41. string url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token={0}";
  42. var ACCESS_TOKEN = WeChatApi.GetAccess_token();
  43. url = string.Format(url, ACCESS_TOKEN);
  44. var arg = new Dictionary<string, string> {
  45. {"path",path},
  46. {"width",width.ToString()}
  47. };
  48. var response = TT.Utilities.Web.HttpRequest.DoPost_WebResponse(url, arg, null, , TT.Utilities.Web.HttpContentTypes.HttpContentTypeEnum.JSON);
  49.  
  50. return SaveImg(response);
  51. }
  52.  
  53. static string SaveImg(HttpWebResponse response)
  54. {
  55. if (response.ContentType.ToLower() == "image/jpeg")
  56. {
  57. var re = TT.Utilities.Web.HttpResponse.HttpResponseStream(response);
  58. var bytes = TT.Utilities.StreamUti.ConveertHelper.StreamToBytes(re);
  59. string imgName = "ewm" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".jpg";
  60. //文件存储相对于当前应用目录的虚拟目录
  61. string basePath = "/image/";
  62. //获取相对于应用的基目录,创建目录
  63. string imgPath = System.AppDomain.CurrentDomain.BaseDirectory + basePath; //通过此对象获取文件名
  64. //StringHelper.CreateDirectory(imgPath);
  65. System.IO.File.WriteAllBytes(HttpContext.Current.Server.MapPath(basePath + imgName), bytes);//讲byte[]存储为图片
  66. return "/image/" + imgName;
  67. }
  68. else
  69. {
  70. //{"errcode":47001,"errmsg":"data format error hint: [Mz435a00280720]"}
  71. return TT.Utilities.Web.HttpResponse.HttpResponseString(response);
  72. }
  73. }
  74. }
  75. }

网络请求相关:

  1. public static HttpWebRequest CreateHttpWebRequest(string url, int timeoutSecond = )
  2. {
  3. HttpWebRequest request;
  4. //如果是发送HTTPS请求
  5. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  6. {
  7. //ServicePointManager.DefaultConnectionLimit = 1000;
  8. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  9. request = WebRequest.Create(url) as HttpWebRequest;
  10. }
  11. else
  12. {
  13. request = WebRequest.Create(url) as HttpWebRequest;
  14. }
  15. request.Proxy = null;
  16. request.ProtocolVersion = HttpVersion.Version11;
  17. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
  18. request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
  19. request.Accept = "*/*";
  20. request.KeepAlive = false;
  21. request.Timeout = timeoutSecond * ;
  22. return request;
  23. }
  1. /// <summary>
  2. /// 获取到HttpWebResponse对象
  3. /// </summary>
  4. /// <param name="url">url</param>
  5. /// <param name="dic">参数</param>
  6. /// <param name="headerDic">请求头参数</param>
  7. /// <returns></returns>
  8. public static HttpWebResponse DoPost_WebResponse(string url, Dictionary<string, string> dic = null, Dictionary<string, string> headerDic = null, int timeoutSecond =
  9. , HttpContentTypes.HttpContentTypeEnum contentType = HttpContentTypes.HttpContentTypeEnum.JSON)
  10. {
  11. HttpWebRequest request = CreateHttpWebRequest(url, timeoutSecond);
  12. request.Method = "POST";
  13. request.ContentType = HttpContentTypes.GetContentType(contentType);
  14.  
  15. if (headerDic != null && headerDic.Count > )
  16. {
  17. foreach (var item in headerDic)
  18. {
  19. request.Headers.Add(item.Key, item.Value);
  20. }
  21. }
  22. if (dic != null && dic.Count > )
  23. {
  24. var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(dic);
  25. byte[] buffer = Encoding.UTF8.GetBytes(jsonStr);
  26. request.ContentLength = buffer.Length;
  27. try
  28. {
  29. request.GetRequestStream().Write(buffer, , buffer.Length);
  30. }
  31. catch (WebException ex)
  32. {
  33. throw ex;
  34. }
  35. }
  36. else
  37. {
  38. request.ContentLength = ;
  39. }
  40. return (HttpWebResponse)request.GetResponse();
  41. }
  1. public static Stream HttpResponseStream(HttpWebResponse response)
  2. {
  3. try
  4. {
  5. return response.GetResponseStream();
  6. }
  7. catch (Exception ex)
  8. {
  9. throw new Exception("获取HttpWebResponse.GetResponseStream异常,"+ex);
  10. }
  11. }

工具类:

  1. public class ConveertHelper
  2. {
  3. /// <summary>
  4. /// Stream 转 byte[]
  5. /// </summary>
  6. /// <param name="stream"></param>
  7. /// <returns></returns>
  8. public static byte[] StreamToBytes(Stream stream)
  9. {
  10. List<byte> bytes = new List<byte>();
  11. int temp = stream.ReadByte();
  12. while (temp != -)
  13. {
  14. bytes.Add((byte)temp);
  15. temp = stream.ReadByte();
  16. }
  17. return bytes.ToArray();
  18. }
  19. }

吐槽一下:官方文档对这个接口的说明不够完善,很多需要注意点没有明确,群里也有小伙伴遇到各种问题,如:返回格式没说明,错误原因不明确。

图片样式:

接口C生成的二维码:                                                                  接口A生成的小程序码:

                                                               

微信小程序获取Access_token和页面URL生成小程序码或二维码的更多相关文章

  1. 关于.NET HttpClient方式获取微信小程序码(二维码)

    随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档文档,结合网上的例子,未看到 ...

  2. C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

    一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...

  3. Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】

    作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...

  4. 二维码及二维码接合短URL的应用

    二维码 1.什么是二维码? 二维条形码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0 ...

  5. 微信小程序开发——获取小程序带参二维码全流程

    前言: 想要获取微信小程序带参数二维码,如这种: 官方文档只说了获取小程序码和二维码的三种接口及调用(参考链接:https://developers.weixin.qq.com/miniprogram ...

  6. 微信小程序二维码识别

    目前市场上二维码识别的软件或者网站越来越多,可是真正方便,无广告的却少之很少. 于是,自己突发奇想做了一个微信二维码识别的小程序. 包含功能: 1.识别二维码 ①普通二维码 ②条形码 ③只是复制解析出 ...

  7. 微信小程序与内嵌webview之间来回跳转的几点总结,以及二维码的使用

    截止到发稿小程序支持的功能,后续如果小程序更新在完善文稿. 1. 小程序可以内嵌组件跳转到h5页面,前提是在小程序后台配置相应的业务域名.新打开的h5页面会替代小程序组件内的其它组件,即为h5不能与小 ...

  8. 微信小程序扫描普通二维码打开小程序的方法

    很久没有写博客了,之前换了一份工作,很久没有做Android开发了,现在转做前端开发了,记录一下遇到的问题及解决的方法. 最近做微信小程序开发,遇到一个需求,后台管理系统生成的问卷和投票会有一个二维码 ...

  9. .NET生成小程序码,并合自定义背景图生成推广小程序二维码

    前言: 对于小程序大家可能都非常熟悉了,随着小程序的不断普及越来越多的公司都开始推广使用起来了.今天接到一个需求就是生成小程序码,并且于运营给的推广图片合并在一起做成一张漂亮美观的推广二维码,扫码这种 ...

随机推荐

  1. [Umbraco] 项目结构

    主要包括以下几个部分 Umbraco.businesslogic(基础) Umbraco.cms (核心) Umbraco.controls(控件) Umbraco.datalayer(数据) Umb ...

  2. es-01-简介

    1, 基于lucene的实时搜索软件 分布式的restful风格的搜索和数据分析引擎, 2, 和kibana, logstash 构成 elk生态圈 es: 数据存储和查询 kibana: 可视化 l ...

  3. python学习: 如何循序渐进学习Python语言

    大家都知道Python语言是一种新兴的编程语言.1989年,Python就由Guido van Rossum发明.Python一直发展态势很好. 原因有几点:1.跨平台性好.Linux.Windows ...

  4. 第一次项目上Linux服务器(一:远程连接服务器)

    一.准备工作 1.Linux服务器一台,以及服务器ip.用户名.密码 2.安装xfttp和xshell软件,资源链接,百度云链接:https://pan.baidu.com/s/1vwnlbBpmjX ...

  5. Spring事务内方法调用自身事务 增强的三种方式

    ServiceA.java文件: 查看Spring Tx的相关日志:  可以看到只创建了一个事物ServiceA.service方法的事务,但是callSelf方法却没有被事务增强; 分析原因:Spr ...

  6. LR监测windows资源一般监测哪几个项?

    计数器        指标 1.        平均事务响应时间 Average Transation Response Time        优秀:<2s 良好:2-5s 及格:6-10s ...

  7. [JSOI 2007]字符加密Cipher

    Description 题库链接 给你一个长度为 \(n\) 的字符串,首尾相接依次断开每个断点可以得到 \(n\) 个长度为 \(n\) 的字符串,将其排序按序输出每个字符串的最后一个字母. \(1 ...

  8. .33-浅析webpack源码之doResolve事件流(5)

    file => FileExistsPlugin 这个事件流快接近尾声了,接下来是FileExistsPlugin,很奇怪的是在最后才来检验路径文件是否存在. 源码如下: FileExistsP ...

  9. Redis-其他命令

    1.排序 SORT :  SORT  sourcekey [BY pattern] [LIMIT offset count] [GET  pattern [GET  pattern  ...]] [A ...

  10. net 异步与同步

    一.摘论 为什么不是摘要呢?其实这个是我个人的想法,其实很多人在谈论异步与同步的时候都忽略了,同步异步不是软件的原理,其本身是计算机的原理及概念,这里就不过多的阐述计算机原理了.在学习同步与异步之前, ...