Every day is wonderful

分享与创新 并大胆的去尝试新鲜事物。。。。

ASP.NET下的微信JSSDK配置与ticket加密算法

在做本配置之前需要去微信配置后台增加jssdk域名的授权!
步骤1.在body结束处引用官方的JS文件!
  <script src=”http://res.wx.qq.com/open/js/jweixin-1.0.0.js“></script>
步骤2.在JS文件引用后面配置wx.config及 方法调用!我本项目只引用了微信内置的扫描二维码与经纬度坐标调用!
如:
 <script>

         */
        wx.config({
            debug: false,
            appId: ‘<%=appid %>’,
            timestamp: ‘<%=timestamp %>’,
            nonceStr: ‘<%=nonceStr %>’,
            signature: ‘<%=signature %>’,
            jsApiList: [
              ‘getLocation’,
              ‘scanQRCode’,
            ]
        });
        // 获取当前地理位置
        document.querySelector(‘#getLocation’).onclick = function () {
            wx.getLocation({
                success: function (res) {
                    alert(JSON.stringify(res));
                },
                cancel: function (res) {
                    alert(‘用户拒绝授权获取地理位置’);
                }
            });
        };
        //扫描二维码并返回结果
        document.querySelector(‘#scanQRCode0’).onclick = function () {
            wx.scanQRCode();
        };
        wx.error(function (res) {
            alert(res.errMsg);
        });
</script>
其中config中需要注意的:timestamp,nonceStr,signature,jsApiList
timestamp为十位的时间标签精确到秒:DateTime.Now.ToString(“MMddhhmmss”)
nonceStr为十位的随机数:我调用的自己写的方法使用System.Guid.NewGuid()生成的!business.LMFile.LMCreatRandom(10);
 jsApiList:为调用的模块例如我至调用了微信扫一扫与GPS定位,请参考官方说明!
 signature:这个也是最复杂的一个东西需要使用jsapi_ticket+noncestr+timestamp+当前URL生成SHA1加密格式的密钥,并且是key+value的格式,我是这么写的!
key = “jsapi_ticket=” + jsapi_ticket + “&noncestr=” + nonceStr + “&timestamp=” + timestamp + “&url=” + thisurl;
signature = FormsAuthentication.HashPasswordForStoringInConfigFile(key, “SHA1”).ToLower(); /转小写格式!
其中的jsapi_ticket是用 access_token去换取的:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi
 access_token是用appid与appsecret换取的: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}

PS:因为access_token的有效期为7200秒,建议做全局缓存每7199秒获取一次就可以了!也已使用反馈的ERROR信息做重新拉取!微信对获取access_token是有限制的100000次每日,因为当前开发项目足够使用了就没做缓存了! 

后台完整代码如下!
==============================================================================
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Configuration;
using System.Text;
using System.Data;
using System.IO;
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
 
namespace WxPayAPI.items
{
    public partial class startgo : System.Web.UI.Page
    {
        public string appid = ConfigurationManager.AppSettings[“AppId”];
        public string appsecret = ConfigurationManager.AppSettings[“AppSecret”];
        public string timestamp;
        public string nonceStr;
        public string signature;
        public string accesstoken;
        public string thisurl;
        public string openid = “”;
        public string key = “”;
        public string jsapi_ticket = “”;
 
        protected void Page_Load(object sender, EventArgs e)
        {
 
            if (Session[“openid”] == null)
            {
                Response.Redirect(“/items/signup.aspx”);
            }
            else
            {
                openid = Session[“openid”].ToString();
                getaccess_toke();
                Session[“timestamp”] = timestamp = DateTime.Now.ToString(“MMddhhmmss”);
                Session[“nonceStr”] = nonceStr = business.LMFile.LMCreatRandom(10);
                Session[“thisurl”] = thisurl = Request.Url.ToString();
 
                Session[“key”] = key = “jsapi_ticket=” + jsapi_ticket + “&noncestr=” + nonceStr + “&timestamp=” + timestamp + “&url=” + thisurl;
                Session[“signature”] = signature = FormsAuthentication.HashPasswordForStoringInConfigFile(key, “SHA1”).ToLower();
 
                string binding = business.LMFile.LMSQLSelectKeyword(“Binding_Openid”, “select [Binding_Openid] from [Bike_Binding] where [Binding_Openid] = ‘” + openid + “‘;”); ;
                if (binding == “”)
                {
                    Response.Redirect(“/items/binding.aspx”);
                }
            }
        }
 
        public void getaccess_toke()
        {
            //签名算法:第一步 获得access_token
            string url = string.Format(“https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}”, appid, appsecret);
            string result = business.HttpClientHelper.GetResponse(url);
            //business.LogHelper.WriteLog(result); 
            JObject outputObj = JObject.Parse(result);
            Session[“accesstoken”] = accesstoken = outputObj[“access_token”].ToString();
            //第二步 获得jsapi_ticket
            url = string.Format(“https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi”, accesstoken);
            string result1 = business.HttpClientHelper.GetResponse(url);
            //business.LogHelper.WriteLog(result1);
            JObject outputObj1 = JObject.Parse(result1);//将json转为数组
            Session[“jsapi_ticket”] = jsapi_ticket = outputObj1[“ticket”].ToString(); //获取ticket
        }
    }
}

 

雷铭小才
2017-04-28 13:26:18
点赞

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注