今天我们来讲一下一个非常重要的消息:GPS位置消息。

一、应用举例

基于位置的应用太多太多了,比如:

查找附近的人;

查找附近的商家;

计算与指定的人或商家的距离;

使用百度地图、腾讯地图、阿里地图的api接口,在地图上打标,实现可视化地图;

计算配送费等等等等。

二、获取微信用户位置信息方式

微信公众号可以通过两种方式获取微信用户的GPS位置,

一是普通消息方式,用户在微信app内主动向公众号发出位置信息,如下图所示:

二是微信app自动提醒微信用户是否上传位置信息,用户允许后,可以定时向公众号发送位置信息,如下图所示:

该种方式需要在微信公众号内配置接口权限(见下图),打开自动接受用户信息,可以选择每隔几分钟发送,也可以选择每次进入使用公众号时发送,具体看应用需要,粉丝量大时,发送越频繁,服务器负荷越大。

第二种方式在后续事件消息处理时详解,这里不多说。

三、微信服务器发送消息格式

用户发送的位置消息,经微信服务器处理后,形成如下XML格式发到你的服务器:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId>
</xml>

 四、具体实现的源码

在接收到微信服务器发来的内容之后,首先由指定的接口网页AccessWx.aspx对信息类型进行判别,然后交给指定的消息处理类处理和回应。在本系列文章第1篇介绍的AccessWx.aspx.cs中开始部分引入命名空间using QinMing.Weixin.MessageHandlerLocation;

并完善下面这一段,增加本篇给出的位置消息处理环节。

         else if(MsgType == "location"){LocationMessageDeal tmd = new LocationMessageDeal();Response.Write(tmd.DealResult(weixinXML));              }

在命名空间QinMing.Weixin.MessageHandlerLocation下新建一个类LocationMessageDeal,用来处理微信服务器发来的视频消息。记得类源码文件要放在App_Code目录下!下面是位置消息处理源码:
QinMingWeixinMessageHandlerLocation.cs文件内容如下:

using System;
using System.Web;
using System.Xml;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Net;
using QinMing.Config;
using QinMing.Weixin.ReturnContent;
//using QinMing.WeixinSendTemplateMessage;namespace QinMing.Weixin.MessageHandlerLocation
{//视频消息处理public class LocationMessageDeal :System.Web.UI.Page{public string DealResult(string weixinXML){string content = DealLocation(weixinXML);  return content;}public string DealLocation(string weixinXML){XmlDocument doc = new XmlDocument();doc.LoadXml(weixinXML);XmlNodeList list = doc.GetElementsByTagName("xml");XmlNode xn = list[0];string FromUserName = xn.SelectSingleNode("//FromUserName").InnerText;   //关注用户的加密后openidstring ToUserName = xn.SelectSingleNode("//ToUserName").InnerText;       //公众微信号原始IDstring strresponse = "";//用户通过向公众号发送位置上报地理位置信息string Latitude = xn.SelectSingleNode("//Location_X").InnerText;string Longitude = xn.SelectSingleNode("//Location_Y").InnerText;string ScaleW = xn.SelectSingleNode("//Scale").InnerText;string AddrLabel = xn.SelectSingleNode("//Label").InnerText;UpdateLocation(FromUserName, Latitude, Longitude, ScaleW, AddrLabel);ReturnMsg rm = new ReturnMsg();strresponse = rm.ReturnText(FromUserName, ToUserName, "您的位置信息已收录,后期如有变更,请重新发送位置。");           //告知客服人员有微信用户更新位置消息//QinMingWeixinSendTemplateMessage SendTempMsg = new QinMingWeixinSendTemplateMessage();//SendTempMsg.SendTempMsgRemind("管理员openid", "客户发送位置消息", "");  return strresponse; }//更新微信用户表中的位置经纬度信息public void UpdateLocation(string FromUserName, string Latitude, string Longitude , string ScaleW, string AddrLabel){SqlConnection conn = new SqlConnection(QinMingConfig.DatabaseConnStr);conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandText = "update weixin_user_info set latitude='" + Latitude + "',longitude='" + Longitude + "',"+ "precision='" + ScaleW + "',addr_label='" + AddrLabel + "' where open_id='" + FromUserName + "'";cmd.ExecuteScalar();if (conn.State == ConnectionState.Open){conn.Close();conn.Dispose();}}}
}

上段代码中用到的用户信息表weixin_user_info创建语句如下:(后面会频繁用到此表,这里先给出表结构)

CREATE TABLE weixin_user_info
(open_id nvarchar(40) NULL,          --公众号内微信用户唯一编码nickname nvarchar(60) NULL,         --昵称sex int NULL,                       --性别language nvarchar(20) NULL,         --语言city nvarchar(40) NULL,             --城市province nvarchar(60) NULL,         --省分country nvarchar(60) NULL,          --乡镇headimgurl nvarchar(400) NULL,      --头像图片链接unionid nvarchar(60) NULL,          --公众号、小程序、网页扫码登录共用的用户唯一标识remark nvarchar(20) NULL,           --备注groupid nvarchar(20) NULL,          --用户所在编组subscribe_scene nvarchar(60) NULL,  --关注来源qr_scene nvarchar(10) NULL,         --扫码类型qr_scene_str nvarchar(100) NULL,    --扫码类型描述remove_flag nvarchar(10) NULL,      --是否取消关注latitude nvarchar(50) NULL,         --GPS纬度longitude nvarchar(50) NULL,        --GPS经度precision nvarchar(50) NULL,        --GPS精度addr_label nvarchar(200) NULL,      --GPS位置地址描述guishu_openid nvarchar(40) NULL,    --推荐人openidguishu_mobile nvarchar(12) NULL,    --推荐人手机号guishu_type nvarchar(20) NULL,      --推荐来源类型join_time datetime NULL,            --关注时间personal_score bigint NULL          --用户积分
)

五、位置信息应用举例之一:计算两个经纬度之间的米、千米数值

    //获取两个GPS之间的距离,单位为米MapHelper mh1 = new MapHelper();double d1 = mh1.GetDistanceMeter(Lat1, Lon1, Lat2, Lon2);//获取两个GPS之间的距离,单位为米MapHelper mh2 = new MapHelper();double d2 = mh2.GetDistanceKilometre(Lat1, Lon1, Lat2, Lon2);

所用的MapHelper类源码如下:

    public class MapHelper{private const double earth_radius = 6378.137;//地球半径private static double rad(double d){return d * Math.PI / 180.0;}/// <summary>/// 计算2个点之间的距离/// </summary>/// <param name="lat1">点A</param>/// <param name="lng1">点A</param>/// <param name="lat2">点B</param>/// <param name="lng2">点B</param>/// <returns>公里</returns>public double GetDistanceKilometre(double lat1, double lng1, double lat2, double lng2){double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lng1) - rad(lng2);double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));s = s * earth_radius;s = Math.Round(s * 10000) / 10000;return s;}/// <summary>/// 计算2个点之间的距离/// </summary>/// <param name="lat1">点A</param>/// <param name="lng1">点A</param>/// <param name="lat2">点B</param>/// <param name="lng2">点B</param>/// <returns>米</returns>public double GetDistanceMeter(double lat1, double lng1, double lat2, double lng2){double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lng1) - rad(lng2);double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));s = s * earth_radius;s = Math.Round(s * 10000) / 10;return s;}}

实例:用C#.NET手把手教你做微信公众号开发(7)--普通消息处理之位置消息相关推荐

  1. 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

    在做线上.线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下jsapi支付,场景就是在微信内打开某个页面,完成在线支付,同样一个网页,使用微信打开就是js ...

  2. 实例:用C#.NET手把手教你做微信公众号开发(21)--使用微信支付线上收款:H5方式

    在做线上.线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下H5场景支付,使用手机浏览器打开就是H5方式,最常见的推广是短信内置链接,这种场景需要调用微信 ...

  3. 实例:用C#.NET手把手教你做微信公众号开发(22)--网页里通过OAuth获取用户openid

    第一篇:理论 如果一个用户并未关注某个公众号,只是在微信内打开了公众号web服务器上的某个网页,要如何获取用户的openid以及用户的微信信息,以便实现业务逻辑呢?本篇讲述网页授权OAuth获取微信用 ...

  4. 实例:用C#.NET手把手教你做微信公众号开发(3)--普通消息处理之图片

    本着简短.便于理解应用的原则,本系列文章每次只讲一个公众号知识点,给出一个应用实例,通过一个知识点帮助你掌握公众号一类应用的开发方法. 上一篇我们掌握了微信客户端.微信服务器.你的服务器之间的信息互动 ...

  5. 实例:用C#.NET手把手教你做微信公众号开发(19)--使用微信支付转账到微信粉丝零钱账户

    公众号给微信用户支付费用的方式有很多种,最常用的是发红包和转账到零钱账户,上一篇文章详细讲解了使用发红包的过程,从公众号内的配置,到微信支付的配置,再到具体的类实现. 本篇主要讲解转账到零钱,具体的类 ...

  6. 实例:用C#.NET手把手教你做微信公众号开发(13)--事件消息处理之取消关注

    一.取消关注事件 用户在取消关注公众号时,微信会把这个事件推送到开发者填写的URL,方便开发者做帐号的解绑等处理. <xml><ToUserName><![CDATA[t ...

  7. 实例:用C#.NET手把手教你做微信公众号开发(12)--带参数二维码裂变推广

    为什么能裂变推广是营销学和心理学的范畴了,这里举个简单的例子来介绍.公众号有足以吸引粉丝的地方,要么是知识.要么是优惠.要么是服务,反正不同于其他人,能够吸引人关注:有了这个前提,怎么让更多的人知道这 ...

  8. 实例:用C#.NET手把手教你做微信公众号开发(11)--生成带参数二维码

    上一篇讲了普通关注的各种情景,接下来准备详细讲解带参数的二维码的应用实例.在下一篇详解之前,这里先介绍一下如何下载二维码.生成二维码表,为后续的应用做好准备. 为了满足用户渠道推广分析和用户帐号绑定等 ...

  9. 实例:用C#.NET手把手教你做微信公众号开发(10)--事件消息处理之关注公众号(普通关注)

    一.事件消息种类 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后 ...

  10. 实例:用C#.NET手把手教你做微信公众号开发(6)--普通消息处理之视频、小视频

    本篇讲解微信客户端向公众号发送视频和小视频的处理方式. 视频消息常见应用: 在线教学: 基于公众号的定向类型小视频应用,类似于抖音.快手,但不用再安装app: 视频剪辑.特效添加,比如美颜: 其它视频 ...

最新文章

  1. oraclesqldeveloper 批量插入多个存储过程_MongoDB如何批量执行写操作
  2. 【转】python的复制,深拷贝和浅拷贝的区别
  3. iOS block 用法
  4. 1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
  5. 大话存储学习笔记(4)
  6. mysql+查看端口和进程,linux查看端口、进程以及kill情况
  7. 跨域问题及jQuery中Ajax传参的讲解
  8. html img标签的alt属性和title属性(说明)
  9. 没有密码,如何取消Word文档的只读模式?
  10. 几种镜像恒流源电路分析!
  11. 百度大脑大升级:各种算法并驾齐驱
  12. 最新传智播客nodejs入门到精通(基础就业)全套nodejs视频教程
  13. python查表法是什么_python查表法提取骨骼线经历
  14. 今日头条——青龙羊毛
  15. python 一张图画多条线_Python画多条线在一个图里
  16. 深度学习(一)—— 深度学习概述
  17. 常熟理工学院计算机专业排名2015,2019年常熟理工学院优势专业排名及分数线
  18. 微服务架构设计实践系列之九:应用架构
  19. 数据库 蚂蚁_蚂蚁集团把夺得世界第一数据库的 OceanBase 独立公司化
  20. 华为FreeBuds 4轻体验,能打的不只舒适降噪

热门文章

  1. 学计算机发展方向,2021女生学计算机专业好吗 有什么发展方向
  2. Spring boot AML教程
  3. 学军OJ题解——诸葛的理想
  4. mysql级联删除外键约束_mysql通过外键级联删除
  5. python中计时工具timeit模块的基本用法
  6. 计算机与信息专业综合试题,2017年西南大学计算机与信息科学学院软件学院808计算机专业基础综合考研题库...
  7. 51Openlab上Mininet快速入门
  8. 面试题(19)今日头条Java后台研发三面题目
  9. Bugku 杂项 细心的大象
  10. 手机 音乐 推送 到 linux 播放器,很简单地解决了:用手机控制群晖播放音乐并推送到功放的问题...