微信开发-1
微信开发
准备写2-3篇, 没什么意义, 建议直接看官方文档.
申请订阅号
服务号,订阅号,企业号的区别(官方说明)
- 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息;
- 服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息;
企业号:主要用于公司内部通讯使用,需要先有成员的通讯信息验证才可以关注成功企业号;
个人用户只能申请订阅号, 以下以订阅号为例.
注册成功之后可以通过网站管理你的个人订阅号, 为方便接口测试, 微信为我们提供了公众平台测试账号, 接下来我们通过测试号来了解常用接口的使用.
接口权限配置
这里需要验证服务器, 如果是个人服务器需要有80端口权限, 这里使用新浪sae来演示.
微信为我们提供了验证的示例代码, 修改代码中的token为自定义的token将这个php文件上传至sae, 在配置的URL处填写路径, Token中填写代码中的token, 提交.
接口调用
接下来就可以测试微信提供的各种接口了, 包括用户消息管理, 收发, 用户信息等等, 可以在微信开发者文档中查看所有接口的指南, 这里演示两个例子.
获取用户列表
获取access_token
为保证安全, 接口的调用一般分两步或者三步完成.首先第一步需要获取access_token, 接下来所有的接口都需要通过该access_token来进行调用, 通过下面的接口可以获取access_token, 参数为appid和appsecret:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
请求成功的返回值为:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
需要注意的是这个接口每天的调用次数为2000次, 每次请求到的access_token有效期为两小时, 每次调用产生的token值都不一样, 因此建议将此token保存至数据库中, 过期替换即可, 防止请求次数超限.
如何使用php调用接口点这里
通过token获取用户列表
在公众号中, 用户通过OpenID来标识, 每一个用户相对于同一个公众号的OpenID是固定的, 因此获取用户列表返回的内容为所有OpenID的数组, 一次请求最多拉取10000个用户, 可以通过设置参数中的next_openid多次拉取.
接口中两个参数:access_token(第一步获取到的token)
next_openid(不填默认为从头开始)https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
返回值:
{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
获取用户基本信息
获取到OpenID之后可以通过OpenID获取到对应用户的基本信息, 包括昵称、头像、性别、所在城市、语言和关注时间。
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
返回值
{ "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, "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" "remark": "", "groupid": 0 }
第三方网页授权获取用户基本信息
如果用户在微信中直接访问网页, 公众号可以通过微信的授权机制, 来获取用户的基本信息.
基本流程为:
- 设置授权回调域名
- 用户进入第三方网页, 会显示以下内容
- 授权通过后会自动返回到开发者设置的回调页面, 并传入一个code参数
- 通过code参数获取网页授权的access_token(不同于上边的access_token)
- 通过access_token和OpenID获取用户基本信息
注: 订阅号没有此接口的权限, 通过测试号模拟
设置授权回调域名
在测试号管理页面中配置授权回调域名, sae的域名为xxx.applinzi.com
引导用户打开网页
引导用户打开接口, 参数:
// appid: appid
// redirect_url: 授权成功后的回调页
// scope: 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在**未关注**的情况下,只要用户授权,也能获取其信息)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
授权成功回调
当用户同意授权后, 会向回调页传入一个code参数, 通过此code我们可以获取到接下来要用的access_token(注意这个token和之前的token不是同一个)
接口
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
返回值
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
拉取用户信息
通过上一步获取到access_token和OpenID之后就可以获取该用户的基本信息了
接口
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
返回值
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[
"PRIVILEGE1"
"PRIVILEGE2"
],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
使用php调用接口
在php中, 可以直接通过file_get_content来获取数据, 但是因为file_get_content的使用不够灵活, 而且简单的get请求可以通过file_get_content实现, POST请求的内容无法获取, 因此我们使用php的cURL扩展来调用微信的各类接口, 建议将常用的函数进行封装方便重复调用.
PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
GET请求的方法, 参数为请求的url
function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
// 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
// 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
//验证token, 本地可以注释掉, 上线必须打开
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
POST请求的方法, 参数为请求体body和请求的url
function httpPost ($data,$url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return $tmpInfo;
}