Tag Archives: 微信公号

Hello World 微信开发

通过iBeacon接入微信摇一摇

什么是iBeacon?维基百科的定义是这样的:

一套iBeacon的部署由一个或多个在一定范围内发射传输他们唯一的识别码iBeacon信标设备组成。接收设备上的软件可以查找iBeacon并实现多种功能,比如通知用户,接收设备也可以通过链接iBeacons从iBeacon的通用属性配置服务来恢复价值。iBeacons不推送通知给接收设备(除了他们自己的ID),然而,手机软件可以使用从iBeacons接收到的信号来自己推送通知

不用太关注这个定义,微信摇一摇.周边功能,虽然使用到iBeacon,但其实只用到了它的“信标”功能,具体过程是这样的:

  1.  iBeacon基站通过不断地通过蓝牙广播自己的存在(实际有间隔,100~5000+ms)
  2. 用户手机打开微信摇一摇界面时,如果此时蓝牙是打开的,摇一摇就会就会在“人、歌曲、tv”之外多出一个“周边”,并且默认是“周边”
  3. 用户这时摇手机,就会出现第一步 iBeacon基站相关的信息

那么, 这个 iBeacon设备的信息如果设置哪?

  1. 首先,需要有一个开通支付功能的微信服务号
  2. 微信公号后台“新功能插件”里,选择“摇一摇周边”,申请
  3. 登录摇一摇后台(zb.weixin.qq.com),“设备管理”,新建设备,申请新设备的UUID/Major/Minor
  4. 将上述参数设置到你的iBeacon设备设备内

关于iBeacon基站,摇一摇后台就很多的推荐,另外,你也可以在淘宝购买,甚至可以自己购买蓝牙模块,通过简单配置,将其变成蓝牙基站

下面的这个链接,讲述了通过树莓派将HM-10蓝牙模块配置成iBeacon基站的方法,操作简单,亲测可用

http://www.xuebuyuan.com/2015895.html

 

 

Hello World 微信开发

玩转微信公号开发(九)——获取用户信息

这里的“用户信息”,指的是昵称、头像等信息,具体的:

1
2
3
4
5
6
7
8
9
10
11
12
{
    "subscribe": 1, 
    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 
    "nickname": "Band", 
    "sex": 1, 
    "language": "zh_CN", 
    "city": "广州", 
    "province": "广东", 
    "country": "中国", 
    "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", 
   "subscribe_time": 1382694957
}

具体的接口是:

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

这里的ACCESS_TOKEN获取方法可以参考本系列之前的文章

如果用户没关注,subscribe字段为0,没有nickname、headimgurl等字段,只有用户关注你的公众号,才能拿到上面的全部信息

你可以用这个接口取得用户基本信息,也可以那它判断当前用户是否关注你的公众号

早期的时候,微信对用户基本信息控制的比较严格,只有用户授权过才能拿到这些信息,而且,再次拿信息的话,还要重新授权

偶然才看到微信的文档有了升级,用户信息接口换成了这个新的:/user/info,免去了惹人厌的授权过程。这点小小的开放,让很多基于微信的活动方案成为可能【赞一个】

————–
转载请注明出处:http://www.jiangkl.com/2014/04/weixin_user_info

Hello World

玩转微信公号开发(八)——消息的排重与回复

随着微信公号系统的逐步完善,原来的许多机制都得到了升级、增强,这可以让我们公众号的表现更稳定,但有时,也会给我们带来一下麻烦,比如下面这段微信文档新增的内容

————————————————
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。

关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。

假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。 这种情况下,可以使用客服消息接口进行异步回复。
————————————————

首先,如果后端没有复杂的逻辑,5秒足够了,但是如果不能保证5秒内回复消息,就只能调客服消息接口了,可惜客服接口属于高级接口,订阅号是没有的(坑爹啊!),并且,即使是订阅号,客服消息的限制也挺多

另外,所谓的“断掉连接,重新发起请求”并不靠谱,我自己扫码或者点按钮后就经常会收到重复消息,也就是说,第一个请求还没结束,的二个请求可能就来了。。。

综合这两点,我们其实可以搭建一种这样的回复方式:

一个消息来了以后,首先根据微信文档里提到的排重方式,比如使用fromusername/msgid/event/count/createtime做md5,作为key,来标示这个消息,在这个请求内,处理相关的业务逻辑,但处理结果不在这个消息内回复,而是放到类似redis的缓存内

再有消息来时,由于同一个消息重复发送,key也是相同的,首先检查redis有没有该消息key的回复内容存在,如果有,直接回复,如果没有,再走上面的逻辑

这样子,不但可以排重,还可以为自己的业务逻辑多争取些处理时间

 

————

转载请注明出处:http://www.jiangkl.com/2014/03/重复消息/ ‎

 

Hello World 微信开发

玩转微信公号开发(七)——账号体系与oauth登录

默认情况下,如之前“接收消息”里所说,一个用户和微信公号发生交互是,开发者拿到的是用户的openId,每一个用户,对应每一个公号,都有唯一的一个openId,当用户使用微信内置webview访问我们的页面是,开发者可以调用oauth2.0协议,302到自定的url,获取访问者的openId

1
2
3
4
5
$redirect = 'http://xxxx.xxx.com/xxx';
$url = 'http://open.weixin.qq.com/connect/oauth2/authorize?appid=your-appid&redirect_uri='
   .$redirect.'&response_type=code&scope=snsapi_base&state=ubox#wechat_redirect';
$this->redirect($url);
exit;

其中,scope=snsapi_base是要获取的权限类型,snsapi_base获取的只是openId,snsapi_userinfo可以用户获取用的较详细的昵称、头像等内容,但是是需要用户授权
上面的$redirect,就是登陆后需要跳转回来的开发者服务器的地址,这个登录操作是自动的,不需要用户做操作
跳回以后,url后附加一个code参数,通过这个code,再调微信的对应接口,即可获得openId,或者userinfo

1
2
3
4
5
6
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=your-appid&secret=your-appSecret&code='.
	$_GET['code'].'&grant_type=authorization_code';
$json = Http::httpsGet($url);
$wxInfo = json_decode($json, true);
$openId = $wxInfo['openid'];
//.....你的其他操作

取得json的接口如下:

1
2
3
4
5
6
7
{
  "access_token":"xxxxxxxxxxxxxxxxxxxxxxxx",
  "expires_in":7200,
  "refresh_token":"xxxxxxxxxxxxxxxxxxxxxxxx",
  "openid":"ogaN_jp4sLWa4ZXGu5L39SSKcXU8",
  "scope":"snsapi_base,"
}

如你所见,openid就在里面了,进一步的,有了access_token,scope值如果是snsapi_userinfo,那么你还可以调“/sns/userinfo”接口取用户昵称等信息
expires_in是token超时时间,refresh_token可以用来刷新access_token

————
转载请注明出处: http://www.jiangkl.com/2014/02/weixin_oauth_userinfo/

Hello World 微信开发

玩转微信公号开发(六)——设置菜单

这里要讲的是,在开发模式下,如何自定义菜单

因为可能有中文乱码的问题,所以这里直接拼json串,然后调接口,post就ok了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function weixin_custom_menu(){
	$token 		= WXUtil::getAccessToken();
	$url 			= "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token;
	$msg 		= '{"button":['
		//单菜单
		.'{"type":"click","name":"现在购买","key":"BTN_1"},'
		.'{"type":"click","name":"优惠活动","key":"BTN_2"},'
		.'{"name":"帮助",//多级菜单
			"sub_button":[
					{"type":"view","name":"下载","url":"http://xx.com/download.html"},
					{"type":"view","name":"使用教程","url":"http://xx.com/howbuy.html"},  
					{"type":"view","name":"关于我们","url":"http://xx.com/about.html"}
				]
			}
		]}';
	echo $msg;
	$r 		= Http::httpsPost($url, $msg);
	print_r($r);//打印结果,返回error为0的话,即为设置成功
	exit;
}

参数说明

  • type,按钮的类型
    1. click,按钮,点击后,发送给开发者网关一个事件
      view,链接,打开一个webview页面,页面地址为url字段指定
  • name,按钮的显示名称
  • key,事件标示,对应本系列第二篇里提到的EventKey字段
  • url

菜单设置后,通常需要退出公众号再进一次才能生效,如果还不行,只能取消关注、再关注一次

————
转载请注明住处:http://www.jiangkl.com/2014/01/weixin_custom_menu