微信开发

准备写2-3篇, 没什么意义, 建议直接看官方文档.

申请订阅号

  1. 服务号,订阅号,企业号的区别(官方说明)

    • 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息;
    • 服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息;
    • 企业号:主要用于公司内部通讯使用,需要先有成员的通讯信息验证才可以关注成功企业号;

      个人用户只能申请订阅号, 以下以订阅号为例.

      注册成功之后可以通过网站管理你的个人订阅号, 为方便接口测试, 微信为我们提供了公众平台测试账号, 接下来我们通过测试号来了解常用接口的使用.
      测试号

  2. 接口权限配置

    这里需要验证服务器, 如果是个人服务器需要有80端口权限, 这里使用新浪sae来演示.
    微信为我们提供了验证的示例代码, 修改代码中的token为自定义的token

    将这个php文件上传至sae, 在配置的URL处填写路径, Token中填写代码中的token, 提交.

接口调用

接下来就可以测试微信提供的各种接口了, 包括用户消息管理, 收发, 用户信息等等, 可以在微信开发者文档中查看所有接口的指南, 这里演示两个例子.

获取用户列表

  1. 获取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调用接口点这里

  2. 通过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"}
    
  3. 获取用户基本信息

    获取到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
    }
    

第三方网页授权获取用户基本信息

如果用户在微信中直接访问网页, 公众号可以通过微信的授权机制, 来获取用户的基本信息.
基本流程为:

  1. 设置授权回调域名
  2. 用户进入第三方网页, 会显示以下内容
  3. 授权通过后会自动返回到开发者设置的回调页面, 并传入一个code参数
  4. 通过code参数获取网页授权的access_token(不同于上边的access_token)
  5. 通过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;
}