Category Archives: 微信开发

微信开发

微信用户信息接口的小坑

基于微信的开发,用户信息是基础,甭管是关注后,还是强制授权,都需要调取“sns/userinfo”接口,提取用户消息
很多事情,我们觉得理所当然,比如,sns/userinfo返回的nickname和headimgurl,这俩不都该成对出现吗?要么都有、要么都没有
不过,事与愿违,到库里去看用户消息,还真有不少nickname、headimgurl只有一个,另一个是空的;特别是nickname,很多都是空的

发现问题,就要寻找原因、解决问题,首先看nickname
由于项目里对外部资源调用的日志记录比较齐全,通过openid,很容易就能发现,比如nickname是下面早这类值时:
存到库就是空的。。。字符集的问题
库里varchar用的是utf8,请教运维,可以不可通过修改字符集,来保存这类支付,无果。。。
无奈关键用户表就不要胡乱做测试,解决方案是加了一个字段,专门保存urlencode(nickname),提取用户信息、需要显示昵称的时候,加个简单判断,再把urldecode显示出来

然后是headimgurl为空的情况
这个再查日志就没啥办法了:就是空的
猜测是用户本来就没上传头像,微信客户端里显示的默认头像,但默认头像既然非用户上传,就认为用户无头像,所以userinfo接口就不给喽
没限制的微信号做这类实际测试,还好headimgurl为空只是极少数

——补充。。。上面说的昵称中的表情符太毒了,wordrpess居然也没能兼容,无奈只能用图

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 微信开发

玩转微信公号开发(七)——账号体系与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