微信小程序根据wx.login得到的code从Csharp后台获取openid和session_key(后台实现了4种方式调用jscode2session)

首先微信小程序部分代码:
pages文件夹下usrinfo页面,路径pages/usrinfo/usrinfo

wx.login得到code,根据code调用后台api部分:

// pages/usrinfo/usrinfo.js

  //点击微信登录
  wechatAction:function(e)
  {
    console.log(e);
    //用户点击授权
    //先临时保存获取到的微信用户信息
    const {nickName,avatarUrl} = JSON.parse(e.detail.rawData)
    this.setData({
      nickName:nickName,   //昵称
      avatarUrl:avatarUrl  //头像
    })
    //获取微信code
    this.reqWechatCode()
  },

  //微信登录:获取code
  reqWechatCode:function(){
    //授权接口登录接口
    let that = this
    //从微信获取code
    wx.showLoading({
      title:'获取code'
    })
    wx.login({
      success:function(res){
        console.log(res)
        if(res.code){
          that.setData({
            code:res.code
          })
          wx.getUserInfo({
            success:function(res){
              //保存微信登录参数
              const {encryptedData,iv,signature,rawData} = res
              that.setData({
                encryptedData:encryptedData,
                iv:iv,
                signature:signature,
                rawData:rawData
              })          
              //根据code向服务器发送登录请求获取token
              that.wxLoginReq(that.data.code)
            }
          })
        }else{
          wx.showToast({
            title:'获取code失败,请重试',
            icon:'none'
          })
        }
        wx.hideLoading()
      }
    })
  },

  //根据获取到的code向服务器发送登录请求获取token
  wxLoginReq:function(code){
    let that = this
    console.log("wxLoginReq:",code)
    wx.showLoading({
      title:'获取token中',
    })
    //拿到code再加上encrytedData,iv,rawData,signature等参数,请求token
    let encryptedData = that.data.encryptedData
    let iv = that.data.iv
    let signature = that.data.signature
    let rawData = that.data.rawData
    var req = require('../../utils/util.js')
    //请求成功
    let success = function(res){
      console.log("request sucesss : ",res)
      wx.hideLoading()
      //缓存token
      const{token,user_id} = res.data.data
      let userInfo = {
        token:token,
        user_id:user_id,
        nickName:that.data.nickName,
        avatarUrl:that.data.avatarUrl
      }
    }

    //请求失败
    let fail = function(res){
      wx.hideLoading()
      wx.showToast({
        title:'获取token失败,请重试',
        icon:'none'
      })
    }

    //登录请求
    req.reqLogin(code,encryptedData,iv,rawData,signature,success,fail)
  },

路径pages/utils/util
通过wx.request调用后台的具体实现

const reqLogin = (code, encryptedData, iv, rawData, signature, success, fail) => {
  wx.request({
    url: 'http://********/api/Values/login', // 仅为示例,非真实的接口地址
    method:"POST",
    data:{
      'encryptedData': encryptedData,
      'iv':iv,
      'rawData':rawData,
      'signature':signature,
      'js_code': code
    },
    header:{
      'content-type': 'application/x-www-form-urlencoded;charset=utf-8'//'application/json' //默认值
    },
    success(res)
    {
      console.log(res);
      success(res);
    },
    fail:function(res)
    {
      console.log(res)
      fail(res)
    }
  })
}

module.exports = {
  formatTime: formatTime,
  reqLogin: reqLogin
}

后台使用的VS2015平台下,WEB API工程。
新建工程后,修改了下路由设置。
在WebApiConfig.cs文件中修改

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            var format = GlobalConfiguration.Configuration.Formatters;
            //默认输出方式为xml和json,清除XML则只有json了。清除默认xml
            format.XmlFormatter.SupportedMediaTypes.Clear();
//通过参数设置返回格式
format.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "json", "application/json"));
format.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "xml", "application/xml"));
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

控制器直接使用的ValuesContorller.cs, 没有新增控制器。
后台http请求的一种方式如下

        [HttpPost]
        public void login([FromBody]JObject ob)
        {
            //临时登录凭证code 获取 session_key 和 openid
            string js_code = Convert.ToString(ob["js_code"]);
            //此处填写自己小程序的appid和secret
            string serviceAddress = "https://api.weixin.qq.com/sns/jscode2session?appid=自己的appID&secret=自己的secret&js_code=" + 自己的code+ "&grant_type=authorization_code";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceAddress);
            request.Method = "GET";
            request.ContentType = "textml;charset=UTF-8";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
            string jsonData = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
            var res = new
            {
                data = jsonData,
                Success = true
            };
            Formatting microsoftDataFormatSettings = default(Formatting);
            string result = JsonConvert.SerializeObject(res, microsoftDataFormatSettings);
            //向客户端写出内容
            //https://blog.csdn.net/hk8846/article/details/1648711?utm_source=blogxgwz1
            System.Web.HttpContext.Current.Response.Clear();
            System.Web.HttpContext.Current.Response.Write(result);
            System.Web.HttpContext.Current.Response.Flush();
            System.Web.HttpContext.Current.Response.End();
        }

具体源码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用ASP.NET中的Session对象的Session_OnStart和Session_OnEnd事件来统计一次用户会话期的页面点击次数,具体步骤如下: 1. 在Global.asax文件中,添加Session_OnStart和Session_OnEnd事件的处理方法,例如: ```csharp void Session_OnStart(object sender, EventArgs e) { // 初始化点击次数为0 Session["ClickCount"] = 0; } void Session_OnEnd(object sender, EventArgs e) { // 获取点击次数 int clickCount = (int)Session["ClickCount"]; // 将点击次数写入日志或数据库等 WriteLog("User " + Session.SessionID + " clicked " + clickCount + " times."); } ``` 在Session_OnStart事件中,初始化点击次数为0,将其保存到Session对象中。在Session_OnEnd事件中,从Session对象中获取点击次数,然后将其写入日志或数据库等,以便统计分析。 2. 在页面中,添加一个按钮或链接,每次点击时将点击次数加1,例如: ```csharp protected void Button1_Click(object sender, EventArgs e) { // 获取当前点击次数 int clickCount = (int)Session["ClickCount"]; // 点击次数加1 clickCount++; // 将新的点击次数保存回Session对象中 Session["ClickCount"] = clickCount; } ``` 在按钮或链接的Click事件中,首先获取当前的点击次数,然后将其加1,最后将新的点击次数保存回Session对象中。 注意,Session对象是在服务器端维护的,每个用户都有自己的Session对象。因此,在Session_OnStart和Session_OnEnd事件中,可以使用Session.SessionID属性来获取当前用户的Session对象的ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值