zoukankan      html  css  js  c++  java
  • .Net 调用微信公众号扫一扫

    1.绑定域名

      去微信公众号平台中设置js接口安全域名,要注意的是不填写http://, 只填写域名即可,如 www.baidu.com。

    一个月只能修改三次,要谨慎填写。

    2.引入JS文件

    在页面中引入微信js脚本文件。      <script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

    3.写入config文件配置

     1 wx.config({
     2       debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
     3       appId: '', // 必填,公众号的唯一标识
     4       timestamp:,// 必填,后台生成的时间戳
     5       nonceStr: '',//必填,后台生成的随机字符串
     6       signature: '',//必填,后台根据token,ticket,时间戳,和随机字符串生成签名
     7       jsApiList: [
     8         'checkJsApi',
     9         'onMenuShareTimeline',
    10         'onMenuShareAppMessage',
    11         'onMenuShareQQ',
    12         'onMenuShareWeibo',
    13         'onMenuShareQZone',
    14         'hideMenuItems',
    15         'showMenuItems',
    16         'hideAllNonBaseMenuItem',
    17         'showAllNonBaseMenuItem',
    18         'translateVoice',
    19         'startRecord',
    20         'stopRecord',
    21         'onVoiceRecordEnd',
    22         'playVoice',
    23         'onVoicePlayEnd',
    24         'pauseVoice',
    25         'stopVoice',
    26         'uploadVoice',
    27         'downloadVoice',
    28         'chooseImage',
    29         'previewImage',
    30         'uploadImage',
    31         'downloadImage',
    32         'getNetworkType',
    33         'openLocation',
    34         'getLocation',
    35         'hideOptionMenu',
    36         'showOptionMenu',
    37         'closeWindow',
    38         'scanQRCode',
    39         'chooseWXPay',
    40         'openProductSpecificView',
    41         'addCard',
    42         'chooseCard',
    43         'openCard'
    44       ]
    45   });
    config配置信息

    4.调用接口

    (1)首先要知道微信给你生成的AppID和AppSecret,

    (2)根据AppId和AppSecret到https://api.weixin.qq.com/cgi-bin/token获取AccessToken。

    access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token)

    (3)然后拿着Token到https://api.weixin.qq.com/cgi-bin/ticket/getticket获取ticket。

    用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket)

    (4)然后根据ticket和随机字符串和时间戳和当前页面的url生成Signature(签名)。

    签名算法:签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

    (a){对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。
    (b)对string1进行sha1签名,得到signature.
      1     public static class WeHelper
      2     {
      3         public static string appId
      4         {
      5             get
      6             {
      7                 return "";//微信开发者appId
      8             }
      9         }
     10         private static string secret
     11         {
     12             get
     13             {
     14                 return "";//微信开发者secret
     15             }
     16         }
     17 
     18         private static readonly string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
     19 
     20         private static readonly string ticket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
     21 
     22         /// <summary>
     23         /// 获取Token
     24         /// </summary>
     25         /// <returns></returns>
     26         public static string GetAccessToken()
     27         {
     28             if (HttpRuntime.Cache.Get("AccessToken") == null)
     29             {
     30                 StringBuilder sbUrl = new StringBuilder();
     31                 sbUrl.AppendFormat(tokenUrl);
     32                 sbUrl.AppendFormat("?grant_type=client_credential");
     33                 sbUrl.AppendFormat("&appid={0}", appId);
     34                 sbUrl.AppendFormat("&secret={0}", secret);
     35                 using (WebClient client = new WebClient())
     36                 {
     37                     client.Encoding = Encoding.UTF8;
     38                     string data = client.UploadString(sbUrl.ToString(), string.Empty);
     39                     var result = JObject.Parse(data);
     40                     if (result["access_token"] != null && result["access_token"].Value<string>() != string.Empty)
     41                     {
     42                         string token = result["access_token"].Value<string>();
     43                         HttpRuntime.Cache.Insert("AccessToken", token, null, DateTime.Now.AddSeconds(7200), System.Web.Caching.Cache.NoSlidingExpiration);
     44                         return token;
     45                     }
     46                     else
     47                         throw new Exception(data);
     48                 }
     49             }
     50             else
     51             {
     52                 return HttpRuntime.Cache.Get("AccessToken").ToString();
     53             }
     54         }
     55         /// <summary>
     56         /// 获取token
     57         /// </summary>
     58         /// <param name="accessToken"></param>
     59         /// <returns></returns>
     60         public static string GetTicket(string accessToken)
     61         {
     62             if (HttpRuntime.Cache.Get("Ticket") == null)
     63             {
     64                 StringBuilder sbUrl = new StringBuilder();
     65                 sbUrl.AppendFormat(ticket);
     66                 sbUrl.AppendFormat("?access_token={0}", accessToken);
     67                 sbUrl.AppendFormat("&type=jsapi");
     68                 using (WebClient client = new WebClient())
     69                 {
     70                     client.Encoding = Encoding.UTF8;
     71                     string data = client.UploadString(sbUrl.ToString(), string.Empty);
     72                     var result = JObject.Parse(data);
     73                     if (result["ticket"] != null && result["ticket"].Value<string>() != string.Empty)
     74                     {
     75                         string ticket = result["ticket"].Value<string>();
     76                         HttpRuntime.Cache.Insert("Ticket", ticket, null, DateTime.Now.AddSeconds(7200), System.Web.Caching.Cache.NoSlidingExpiration);
     77                         return ticket;
     78                     }
     79                     else
     80                         throw new Exception(data);
     81                 }
     82             }
     83             else
     84             {
     85                 return HttpRuntime.Cache.Get("Ticket").ToString();
     86             }
     87         }
     88         /// <summary>
     89         /// 获取签名
     90         /// </summary>
     91         /// <param name="timestamp"></param>
     92         /// <param name="noncestr"></param>
     93         /// <param name="url"></param>
     94         /// <returns></returns>
     95         public static string GetSignature(string timestamp,string noncestr,string url)
     96         {
     97             string string1 = "jsapi_ticket=" + GetTicket(GetAccessToken()) + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
     98             //使用sha1加密这个字符串
     99             return SHA1(string1);
    100         }
    101         #region 工具类
    102         /// <summary>
    103         /// 生成随机字符串
    104         /// </summary>
    105         /// <returns></returns>
    106         public static string CreateNonceStr()
    107         {
    108             int length = 16;
    109             string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    110             string str = "";
    111             var rad = new Random();
    112             for (int i = 0; i < length; i++)
    113             {
    114                 str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
    115             }
    116             return str;
    117         }
    118 
    119         /// <summary>
    120         /// 加密
    121         /// </summary>
    122         /// <param name="str"></param>
    123         /// <returns></returns>
    124         public static string SHA1(string str)
    125         {
    126             str = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1").ToString();
    127             return str.ToLower();
    128         }
    129 
    130         /// <summary>
    131         /// 生成时间戳
    132         /// </summary>
    133         /// <returns></returns>
    134         public static string CreateTimestamp()
    135         {
    136             TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
    137             string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
    138             return timestamp;
    139         } 
    140         #endregion
    141     }
    微信helper生成签名
     1         /// <summary>
     2         /// 获取微信信息
     3         /// </summary>
     4         /// <returns></returns>
     5         public ActionResult GetWeInfo()
     6         {
     7             string timpstamp = WeHelper.CreateTimestamp();
     8             string nonceStr = WeHelper.CreateNonceStr();
     9             string url = Request.Url.ToString();
    10             string sig = WeHelper.GetSignature(timpstamp, nonceStr, url);
    11 
    12             return Json(new
    13             {
    14                 appId= WeHelper.appId,
    15                 timpstamp = timpstamp,
    16                 noncestr = nonceStr,
    17                 signature = WeHelper.SHA1(sig)
    18             });
    19         }
    后台接口

    5前台页面

    首先要将微信的config信息写入。可以ajax调用。或者后台输出到前台。这里使用ajax调用。

     1     $(function () {
     2         $.ajax({
     3             type: "post",
     4             dataType: "json",
     5             url: "/Home/GetWeInfo",
     6             success: function (data) {
     7                 wx.config({
     8                     debug: false,
     9                     appId: data.appId,//微信开发者appId
    10                     timestamp: data.timestamp,//后台生成的时间戳
    11                     nonceStr: data.noncestr,//随机字符串
    12                     signature: data.signature,//后台生成的签名
    13                     jsApiList: ['checkJsApi', 'scanQRCode']//要调用的微信接口
    14                 });
    15             }
    16         });
    17     });
    微信config信息写入
     1    <a class="btn btn-default" onclick="scan()">点击扫一扫</a>
     2 
     3  function scan() {
     4         wx.scanQRCode({
     5             needResult: 1,
     6             scanType: ["qrCode"],
     7             desc: 'scanQRCode desc',
     8             success: function (res) {
     9                 alert(JSON.stringify(res));//这里可以获取到扫描得到的内容。
    10             }
    11         });
    12     }
    点击按钮扫一扫

    备注:

    要注意的是token与ticketd在微信端都有7200秒的缓存。并且第一步的URL和第四部的URL都要按照微信要求的格式填写,不要写成局域网的地址。

    在微信端调试非常费劲,因为每次都要发布到正式环境。

    建议后台多用日志,前台多用log输出或者alert输出,也可以使用微信开发者工具。

    如果一切都配置成功的话,返回结果如下:

  • 相关阅读:
    剑指offer-替换空格
    Python replace方法并不改变原字符串
    退出循环break,在while、for、do...while、循环中使用break语句退出当前循环,直接执行后面的代码。
    do{}while()
    while循环
    for循环
    switch用法
    Javascript获取select下拉框选中的的值
    js关于a++ 与++a
    onload属性使用方法
  • 原文地址:https://www.cnblogs.com/alua/p/7216664.html
Copyright © 2011-2022 走看看