C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现
”摇一摇周边“是微信提供的一种新的基于位置的连接方式。用户通过“摇一摇”的“周边”页卡,可以与线下商户进行互动,获得商户提供的个性化的服务。微信4月份有一个赠送摇一摇设备的活动,我们有幸获得赠送资格,取得一个摇一摇的设备用来测试这个新增的、很有潜力的功能。”摇一摇周边“是微信基于低功耗蓝牙技术的 O2O 入口级应用,与微信的其他线下连接能力一道,加速促成了微信 O2O 闭环的实现。本文主要介绍一摇设备的配置使用,以及如何在开发层面上,定义及实现微信摇一摇的功能接口。
1、IBeacon基础知识介绍
摇一摇周边是基于IBeacon来实现的。IBeacon是苹果公司开发的一种通过低功耗蓝牙技术进行一个十分精确的微定位技术。IBeacon设备通过蓝牙信号广播设备id, 手机等终端进入IBeacon设备的信号范围,可以收到该设备的id.
实现分如下四个步骤:
第一步. 服务提供者向微信后台申请服务,微信后台生成一个IBeaconId,并将其映射到服务提供者提供的服务,再将IBeaconId告诉服务提供者;
第二步. 服务提供者把第一步拿到的IBeaconId设置到IBeacon设备上,让IBeacon设备广播该IBeaconId;
第三步. 用户在该IBeacon设备的信号范围内打开微信摇一摇周边,微信App拿到该IBeaconId;
第四步. 微信通过第三步拿到的IBeaconId,向微信后台拉取相应的服务,展示在摇出来的结果上。
第五步. 用户点击摇出来结果,在微信内嵌的浏览器上,会带上用户信息跳转到服务提供者在第一步申请服务时填的url,进入应用页面
应用场景:
2、摇一摇设备的使用
摇一摇的beacon设备很小,底座可以用赠送的双面胶粘贴在墙面上,底面还可以贴一个微信的提示标签,挺有意思的效果。
同时可以下载这个beacon设备的App软件RealKit进行设置设备,设备界面管理界面如下所示。
根据官方摇一摇(https://zb.weixin.qq.com/)的配置说明,我们拥有设备后,需要配置设备响应的页面,流程如下所示。
由于是微信赠送的设备,默认情况下,微信后台已经给我们添加赠送的摇一摇设备记录了;
如果是自己购买这种摇一摇的设备,那么需要自己手工添加设备记录,并输入相关的参数即可。
添加设备后,我们需要配置摇一摇的页面,页面就是在摇动微信的时候,显示给微信用户的一个界面,页面管理界面如下所示。
最终配置完成后,我们就来试一下这个神秘的设备了,看看效果如何。这个设备的信号穿透力还是很不错,隔了10米,两堵墙摇一摇还是很快出来界面的。
这个摇一摇周边的功能,我在IPhone4S里面始终无法出现周边这个模块,在5、6plus里面倒是很正常的出现并响应处理,而IPAD则是在摇一摇后出现页面的,但是页面无法响应。
3、基于C#的微信摇一摇接口的实现
摇一摇和功能界面相呼应,提供了设备管理、页面管理、素材管理、关联关系绑定、设备及用户信息、数据统计等功能接口,如下所示。
1)设备管理
而其中设备管理部分,又分为了好几个API的处理。
1 申请设备ID
2 编辑设备信息
3 配置设备与门店的关联关系
4 查询设备列表
申请设备ID
接口说明 申请配置设备所需的UUID、Major、Minor。申请成功后返回批次ID,可用返回的批次ID用“查询设备列表”接口拉取本次申请的设备ID。单次新增设备超过500个,需走人工审核流程,大概需要三个工作日;单次新增设备不超过500个的,当日可返回申请的设备ID。一个公众账号最多可申请99999个设备ID,如需申请的设备ID数超过最大限额,请邮件至zhoubian@tencent.com,邮件格式如下: 标题:申请提升设备ID额度 内容:1、公众账号名称及appid(wx开头的字符串,在mp平台可查看) 2、用途 3、预估需要多少设备ID。
接口调用说明
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/shakearound/device/applyid?access_token=ACCESS_TOKEN
POST数据格式:json
POST数据例子:
{
"quantity":3,
"apply_reason":"测试",
"comment":"测试专用",
"poi_id":1234
}
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
quantity | 是 | 申请的设备ID的数量,单次新增设备超过500个,需走人工审核流程 |
apply_reason | 是 | 申请理由,不超过100个字 |
comment | 否 | 备注,不超过15个汉字或30个英文字母 |
poi_id | 否 | 设备关联的门店ID,关联门店后,在门店1KM的范围内有优先摇出信息的机会。门店相关信息具体可查看门店相关的接口文档 |
返回说明 正常时的返回JSON数据包示例:
当申请个数小于等于500时,
{
"data": {
"apply_id": 123,
"device_identifiers":[
{
"device_id":10100,
"uuid":"FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
"major":10001,
"minor":10002
}
]
},
"errcode": 0,
"errmsg": "success."
}
当申请个数大于500时,
{
"data": {
"apply_id": 123,
"audit_status": 0,
"audit_comment": "审核未通过"
},
"errcode": 0,
"errmsg": "success."
}
参数说明
参数 | 说明 |
---|---|
device_identifiers | 指定的设备ID列表 |
device_id | 设备编号 |
UUID、major、minor | UUID、major、minor |
audit_status | 审核状态。0:审核未通过、1:审核中、2:审核已通过;审核会在三个工作日内完成 |
audit_comment | 审核备注,包括审核不通过的原因 |
apply_id | 申请的批次ID,可用在“查询设备列表”接口按批次查询本次申请成功的设备ID。 |
根据这些接口定义,我们可以创建一个摇一摇专用的接口类IShakeAround。
/// <summary>
/// 摇一摇周边的接口定义
/// </summary>
public interface IShakeAround
{
#region 设备管理
/// <summary>
/// 申请设备ID。
/// 接口说明 申请配置设备所需的UUID、Major、Minor。
/// 若激活率小于50%,不能新增设备。单次新增设备超过500个,需走人工审核流程。审核通过后,可用返回的批次ID用“查询设备列表”接口拉取本次申请的设备ID。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="applyInfo">设备申请信息</param>
ShakeDeviceApplyJson ApplyDevice(string accessToken, ShakeDeviceAddJson applyInfo); /// <summary>
/// 编辑设备信息。
/// 接口说明 编辑设备的备注信息。可用设备ID或完整的UUID、Major、Minor指定设备,二者选其一。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="info">设备信息</param>
/// <param name="comment">设备的备注信息,不超过15个汉字或30个英文字母。</param>
/// <returns></returns>
CommonResult UpdateDevice(string accessToken, ShakeDeviceIdentifier info, string comment); /// <summary>
/// 配置设备与门店的关联关系。接口说明 修改设备关联的门店ID、设备的备注信息。可用设备ID或完整的UUID、Major、Minor指定设备,二者选其一。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="info">设备信息</param>
/// <param name="poi_id">待关联的门店ID</param>
/// <returns></returns>
CommonResult BindDevice(string accessToken, ShakeDeviceIdentifier info, int poi_id); /// <summary>
/// 查询设备列表.
/// 接口说明 查询已有的设备ID、UUID、Major、Minor、激活状态、备注信息、关联门店、关联页面等信息。可指定设备ID或完整的UUID、Major、Minor查询,也可批量拉取设备信息列表。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="device_identifiers">设备列表信息</param>
/// <returns></returns>
ShakeDeviceSearchList SearchDevice(string accessToken, List<ShakeDeviceIdentifier> device_identifiers); /// <summary>
/// 查询设备列表.
/// 接口说明 查询已有的设备ID、UUID、Major、Minor、激活状态、备注信息、关联门店、关联页面等信息。可指定设备ID或完整的UUID、Major、Minor查询,也可批量拉取设备信息列表。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="data">分页查询条件。apply_id为批次ID,如果指定则以批次进行查询,否则以指定范围查询。</param>
/// <returns></returns>
ShakeDeviceSearchList SearchDevice(string accessToken, ShakeDeviceSearchPaging data); #endregion
接口定义好,我们增加对应的类实现即可,如下是申请设备的接口具体实现函数,其他遵循同样的规则就不再赘述。
/// <summary>
/// 申请设备ID。
/// 接口说明 申请配置设备所需的UUID、Major、Minor。
/// 若激活率小于50%,不能新增设备。单次新增设备超过500个,需走人工审核流程。审核通过后,可用返回的批次ID用“查询设备列表”接口拉取本次申请的设备ID。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="applyInfo">设备申请信息</param>
public ShakeDeviceApplyJson ApplyDevice(string accessToken, ShakeDeviceAddJson applyInfo)
{
var url = string.Format("https://api.weixin.qq.com/shakearound/device/applyid?access_token={0}", accessToken);
string postData = applyInfo.ToJson(); ShakeDeviceApplyJson data = null;
ShakeDeviceApplyResult result = JsonHelper<ShakeDeviceApplyResult>.ConvertJson(url, postData);
if (result != null)
{
data = result.data;
}
return data;
}
2)页面管理
同样页面管理也包含了几个不同的方法,用来创建、编辑、删除页面等处理操作
1 新增页面
2 编辑页面信息
3 查询页面列表
4 删除页面
新增页面
新增摇一摇出来的页面信息,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。其中,图片必须为用素材管理接口上传至微信侧服务器后返回的链接。
接口调用说明
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/shakearound/page/add?access_token=ACCESS_TOKEN
POST数据格式:json
POST数据例子:
{
"title":"主标题",
"description":"副标题",
"page_url":" https://zb.weixin.qq.com ",
"comment":"数据示例",
"icon_url":"http://3gimg.qq.com/shake_nearby/dy/icon "
}
根据这些接口定义,同样我们可以为IShakeAround接口类增加对应的接口定义了。
#region 页面管理 /// <summary>
/// 新增页面。
/// 新增摇一摇出来的页面信息,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
/// 其中,图片必须为用素材管理接口上传至微信侧服务器后返回的链接。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="info">新增页面POST数据对象</param>
/// <returns></returns>
ShakePageResult AddPage(string accessToken, ShakePageJson info); /// <summary>
/// 编辑页面信息。
/// 编辑摇一摇出来的页面信息,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="info">编辑页面POST数据对象</param>
/// <returns></returns>
ShakePageResult UpdatePage(string accessToken, ShakePageJson info); /// <summary>
/// 查询页面列表。
/// 查询已有的页面,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
/// 提供询方式:指定页面ID查询。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="begin">页面列表的起始索引值</param>
/// <param name="count">待查询的页面个数</param>
/// <returns></returns>
ShakePageSearchJson SearchPage(string accessToken, int begin, int count); /// <summary>
/// 查询页面列表。
/// 查询已有的页面,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
/// 提供询方式:批量拉取页面列表
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="page_ids">指定页面的id列表</param>
/// <returns></returns>
ShakePageSearchJson SearchPage(string accessToken, List<int> page_ids); /// <summary>
/// 查询页面列表。
/// 查询已有的页面,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
/// 提供两种查询方式,可指定页面ID查询,也可批量拉取页面列表。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="info"></param>
/// <returns></returns>
ShakePageSearchJson SearchPage(string accessToken, ShakePageSearchPaging info); /// <summary>
/// 删除页面。
/// 删除已有的页面,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
/// 只有页面与设备没有关联关系时,才可被删除。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="page_ids">指定页面的id列表</param>
/// <returns></returns>
CommonResult DeletePage(string accessToken, List<int> page_ids); #endregion 页面管理
3)其他管理
当然除了上面设备、页面的管理,还有一些如
上传图片素材、配置设备与页面的关联关系、以设备为维度的数据统计接口、以页面为维度的数据统计接口等方法接口用来实现,根据上面的处理方式定义即可。
4)测试代码
增加相关的接口定义,以及完成对应的接口实现,我们就需要编写一些测试类来对我们的接口进行测试的,这些对设备、页面的测试代码如下所示。
/// <summary>
/// 摇一摇设备的申请、修改、绑定处理操作测试
/// </summary>
private void btnDevice_Click(object sender, EventArgs e)
{
try
{
int poi_id = ;
ShakeDeviceApplyJson result = api.ApplyDevice(this.token, new ShakeDeviceAddJson() { quantity = , apply_reason = "测试", comment = "测试备注", poi_id = poi_id });
if (result != null)
{
Console.WriteLine(result.ToJson()); if (result.device_identifiers != null)
{
ShakeDeviceIdentifier device = result.device_identifiers[];
if (device != null)
{
int device_id = device.device_id; //465123;
Console.WriteLine(device_id); string comment = "修改的备注";
ShakeDeviceIdentifier info = new ShakeDeviceIdentifier(device.device_id, device.uuid, device.major, device.minor);
CommonResult comResult = api.UpdateDevice(this.token, info, comment);
MessageUtil.ShowTips(comResult.Success ? "操作成功" : "修改设备失败:" + comResult.ErrorMessage); comResult = api.BindDevice(this.token, info, poi_id);
MessageUtil.ShowTips(comResult.Success ? "操作成功" : "修改设备失败:" + comResult.ErrorMessage);
}
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex);
} }
/// <summary>
/// 增加摇一摇素材、增加页面、修改页面、删除页面的操作示例代码
/// </summary>
private void btnPage_Click(object sender, EventArgs e)
{
string file = FileDialogHelper.OpenImage(false);
if(string.IsNullOrEmpty(file))
{
return;
} ShakeMaterialJson mediaJson = api.AddMaterail(this.token, file);
if (mediaJson != null)
{
ShakePageJson json = new ShakePageJson()
{
title = "主标题",
description = "副标题",
comment = "备注说明",
page_url = "https://www.iqidi.com",
icon_url = mediaJson.pic_url
};
ShakePageResult result = api.AddPage(this.token, json);
if (result != null)
{
Console.WriteLine(result.ToJson());
if (result.data != null)
{
json.page_id = result.data.page_id;
json.comment = "修改备注信息"; result = api.UpdatePage(this.token, json);
if (result != null)
{
Console.WriteLine("修改页面");
Console.WriteLine(result.ToJson());
} CommonResult comResult = api.DeletePage(this.token, new List<int>() { json.page_id.Value });
MessageUtil.ShowTips(comResult.Success ? "删除页面操作成功" : "删除页面失败:" + comResult.ErrorMessage);
}
}
}
}
个人认为,摇一摇设备,开启了一个更广阔的应用空间,随着越来越多设备商的支持,微信接口的完善和增加,可以迸发出更多有意思、实用的应用场景。
C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现的更多相关文章
- C#开发微信门户及应用(38)--微信摇一摇红包功能
摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包.我曾经在<C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实 ...
- C#开发微信门户及应用(37)--微信公众号标签管理功能
微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...
- C#开发微信门户及应用(36)--微信卡劵管理的封装操作
前面几篇介绍了微信支付方面的内容,本篇继续微信接口的一些其他方面的内容:卡劵管理.卡劵管理是微信接口里面非常复杂的一个部分,里面的接口非常多,我花了不少时间对它进行了封装处理,重构优化等等工作,卡劵在 ...
- C#开发微信门户及应用(35)--微信支付之企业付款封装操作
在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...
- C#开发微信门户及应用(34)--微信裂变红包
在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...
- C#开发微信门户及应用(33)--微信现金红包的封装及使用
我在上篇随笔<C#开发微信门户及应用(32)--微信支付接入和API封装使用>介绍为微信支付的API封装及使用,其中介绍了如何配置好支付环境,并对扫码支付的两种方式如何在C#开发中使用进行 ...
- C#开发微信门户及应用(32)--微信支付接入和API封装使用
在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...
- C#开发微信门户及应用(29)--微信个性化菜单的实现
有一段时间没有接着微信的主题继续介绍里面的功能模块了,这段时间来,微信也做了不少的变化改动,针对这些特性我全面核对了一下相关的微信公众号和企业号的接口,对原有的微信API和系统管理做了全面的更新,本随 ...
- C#开发微信门户及应用(25)-微信企业号的客户端管理功能
我们知道,微信公众号和企业号都提供了一个官方的Web后台,方便我们对微信账号的配置,以及相关数据的管理功能,对于微信企业号来说,有通讯录中的组织架构管理.标签管理.人员管理.以及消息的发送等功能,其中 ...
随机推荐
- 前端制作动画的几种方式(css3,js)
制作动态的网页是是前端工程师必备的技能,很好的实现动画能够极大的提高用户体验,增强交互效果,那么动画有多少实现方式,一直对此有选择恐惧症的我就总结一下,以便在开发的时候选择最好的实现方式. 1.css ...
- 要想提高PHP的编程效率,你必须知道的要点
1.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数.此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储 ...
- golang语言构造函数
1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...
- BPM始终服务于人,落脚于人
数字经济时代下,云计算.大数据.移动互联已经成为当下企业必须采取的武装力量.随着互联网+.中国制造2025.工业4.0等国家战略的引导与支持,无数的企业在这场数字化浪潮中使尽浑身解数,想要抓住机遇奋力 ...
- AEAI DP V3.7.0 发布,开源综合应用开发平台
1 升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...
- AngularJS 第四天----控制器
控制器的作用 今天和大家学习AngularJS中控制器方面的知识,本文会给出一些例子来说明如何使用AngularJS的控制器.在开始我们的例子之前,首先说说AngularJS控制器的作用.简单的来说A ...
- Windows10自适应和交互式toast通知[1]
阅读目录: 概述 toast通知的结构 视觉区域(Visual) 行为(Actions) 特定场景下的Toast通知 带多内容的通知 带行为的通知(例子1) 带行为的通知(例子2) 带文本输入框和行为 ...
- ASP.NET MVC Model元数据(二)
ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...
- How ASP.NET Web API 2.0 Works?[持续更新中…]
一.概述 RESTful Web API [Web标准篇]RESTful Web API [设计篇] 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 二.路由 ...
- Entity Framework 6 Recipes 2nd Edition(10-5)译 -> 在存储模型中使用自定义函数
10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...