ASP.net 微信公众平台JSAPI获取地理位置

ASP.Net获取地理位置
  项目需求需要在公众号内获取用户的地理位置,查了很多资料,大部分都是php的代码,很少有ASP.NET的代码,网上的东西大部分都不全,而且很晦涩,实际上很简单,这里给后来的朋友做个指引。
  JSAPI(不仅仅是地理位置)实际上的机制是,后台获取授权并获取相关数据,并把授权后的内容传入前台的JS里,前台的JS微信已经封装好了,调用即可返回所需数据,而实际的操作过程是,用户进入公众号的时候提示授权地理位置,进入到页面的时候就可以获取到地理位置。

相关步骤:
一、获取授权并取得数据
 1、第一步设置JS接口安全域名:公众号设置 功能设置 JS接口安全域名 设为你的网站域名即可。
 2、第二步 由于此接口需要使用到access_token,所以要获取access_token需要设置IP白名单,需要到公众号里面把服务器的IP填写进去。
 3、第三步授权取数据
 首先开看下微信JS需要的数据(通过后台获取的内容):
 appId 这个是公众号里面的
 timestamp 时间戳
 nonceStr 随机串
 jsApiList
 这个就是你要用什么接口,必须事先声明 比如: jsApiList[‘getLocation’,’playVoice’] 就是说你想调用获取地理位置和播放语音接口,详见:微信官方,我们就用jsApiList[‘getLocation’],其他的不管
 signature
 这个是签名,稍微麻烦一点,具体的获取流程是:通过AppID和secret获取access_token,然后通过access_token获取jsapi_ticket,然后通过签名算法生成signature,这些数据的获取官方都有详细的文档,总得来说要写很多,不怕麻烦看一下官方的文档一个个得写完,我这里用了一个第三方的微信SDK,Senparc,可以在NuGet里搜索Senparc.Weixin.MP就可以,代码很简单

C#代码:
首先记得引用

using Senparc.Weixin.MP.CommonAPIs;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Helpers;

然后是page_load方法

public partial class repair : System.Web.UI.Page
{
 public string noncestr;
 public string timeStamp;
 public string signature;
 protected void Page_Load(object sender, EventArgs e)
 {
   JsApiTicketResult jsApiTicketResult = CommonApi.GetTicket(WeiXin.APPID,WeiXin.APPSECRET);
   string url = "http://XXX.com";//当前页面URL
   noncestr = JSSDKHelper.GetNoncestr();//随机字符
   timeStamp = JSSDKHelper.GetTimestamp();//时间戳
   signature = JSSDKHelper.GetSignature(jsApiTicketResult.ticket, noncestr, timeStamp, url);//获取签名}
 }
}

至此获取了全部所需的内容,如不使用第三方SDK则参考https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.5267792197713446#62

二、前台配置JS,前面已经在后台获取了相关的数据,现在只需要传入前台
 1、在前台页面引入http://res.wx.qq.com/open/js/jweixin-1.2.0.js
 2、把后台获取的内容传递给前台JS变量

wx.config({
    debug: false, 
    appId: '<%=WEB.WeiXin.APPID%>', 
    timestamp:<%=timeStamp%> , 
    nonceStr: '<%=noncestr%>', 
    signature: '<%=signature%>',
    jsApiList: ['getLocation']
    });

 3、调用JSAPI方法:

wx.ready(function () {
 //调用获取地理位置接口
  wx.getLocation({
    type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
    success: function (res) {
      var latitude= res.latitude; // 纬度,浮点数,范围为90 ~ -90
      var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
      var speed = res.speed; // 速度,以米/每秒计
      var accuracy = res.accuracy; // 位置精度
      //代码到此已经获取到了用户的经纬度,以下是项目需求,通过经纬度获取地址的详细信息 比如 中国 北京市 东城区 等。
      
      //腾讯地图api获取地址 需要引用http://map.qq.com/api/js?v=2.exp
      geocoder = new qq.maps.Geocoder({
      complete: function (result) {
        //console.log(result);
         var addr = result.detail.addressComponents;
         var addrStr = addr.country + addr.province + addr.city + addr.district + addr.town + addr.street + addr.streetNumber + addr.village;
        //console.log(addrStr);
        $("#txtAdress").val(addrStr)//地址赋值
        $("#latitude").val(latitude)//经纬度赋值
        $("#longitude").val(longitude)//经纬度赋值
       }
      });

      var coord = new qq.maps.LatLng(latitude, longitude);
      geocoder.getAddress(coord);   
        }
      });
      })
wx.error(function (res) {
  console.log(res);
  alert('验证失败');
 });