微信公众平台开发接口PHP SDK

本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息,而无需模拟登录。

以前没接触过微信公众平台开发,前几天刚找到实习公司就要求我做一个微信公众平台的应用,于是乎开始学习微信公众平台开发接口的调用,看开发文档之后还是不知道从何入手,只好上网找入门资料,终于在方倍工作室找到了完整的SDK,理解了思路之后其实也挺简单的,无非就是进行用户、微信服务器、开发者服务器三者之间的通信。下面是我参考方倍工作室SDK之后之间写的一个SDK,主要是响应文本消息和CLICK按钮消息,获取用户基本信息,当然并没有包含所有的消息类型和事件。更完整的SDK请参考方倍工作室,链接:

把微信和第三方网站结合起来运行,是许多客户经常要的方案。这里简要介绍一下获取微信用户的基本信息,并在第三方网站直接登录。

$token = ‘qiduoyun’;

当微信公户关注一个公众号时,会产生一个独一无二的OpenID,此时我们就需要用到它去请求微信服务器获取用户的基本信息,包括头像,昵称等。

$appid = 公众号appid;

更加详细的说明请参考 微信开发文档 。

$appsecret = 公众号appsecret;

获取的步骤如下:

$wechat = new Wechat($token,$appid,$appsecret);

1 第一步:用户同意授权,获取code 2
第二步:通过code换取网页授权access_token 3 第三步:刷新access_token 4
第四步:拉取用户信息(需scope为 snsapi_userinfo) 5
附:检验授权凭证是否有效

if(!isset($_GET[‘echostr’])) {
  $wechat->responseMsg();
} else {
  $wechat->valid();
}

一、在微信公众平台 ―― 开发者中心 : 网页授权获取用户基本信息 :点击
“修改”,配置网页回调域名

class Wechat
{
  private $token;
  private $appid;
  private $appsecret;

二、用户授权获取code

  public function __construct($token,$appid,$appsecret)
  {
    $this->token = $token;
    $this->appid = $appid;
    $this->appsecret = $appsecret;
  }

必备资源:

  //验证消息真实性
  public function valid()
  {
    $echostr = $_GET[‘echostr’];
    if($this->checkSignature()) {
    echo $echostr;
    exit;
    }
  }

澳门新葡亰娱乐官网 ,$appid = ‘*****************’; $appsecret =
‘*************************’;

  //验证签名
  private function checkSignature()
  {
    $token = $this->token;
    $timestamp = $_GET[‘timestamp’];
    $nonce = $_GET[‘nonce’];
    $signature = $_GET[‘signature’];

注:redirect_url是授权后重定向的回调链接地址,请使用urlencode对链接进行处理。

    $tmpArr = array($token,$timestamp,$nonce);
    sort($tmpArr,SORT_STRING);
    $tmpStr = implode($tmpArr);
    $tmpStr = sha1($tmpStr);

在网站入口处加上配置的 $url =
‘’.$appid.’&redirect_uri=http%3A%2F%2Fjixian.c.zmit.cn%2F&response_type=code&scope=snsapi_userinfo&state=123&connect_redirect=1#wechat_redirect’;

    if($tmpStr == $signature) {
    return true;
    } else {
    return false;
    }
  }

并请求访问上诉 url 。

  //获取access_token
  private function get_access_token($appid,$appsecret)
  {
    $url =
“”
.
    $appid . “&secret=” . $appsecret;
    $output = file_get_contents($url);
    $jsoninfo = json_decode($output,true);
    $access_token = $jsoninfo[‘access_token’];
    return $access_token;
  }

当用户授权后,回调设置的域名,并会在url参数中拼接我们所需要的code,我们直接用
$_GET[‘code’] 获取即可!

  //响应消息
  public function responseMsg()
  {
    $postStr = $GLOBALS[‘HTTP_RAW_POST_DATA’];
    if(!empty($postStr)) {
      $postObj =
simplexml_load_string($postStr,’SimpleXMLElement’,LIBXML_NOCDATA);
      $RX_TYPE = trim($postObj->MsgType);
      switch($RX_TYPE)
      {
       case ‘text’:
        $result = $this->receiveText($postObj);
        break;
      case ‘event’:
        $result = $this->receiveEvent($postObj);
        break;
      default:
        $result = “unknown message type: ” . $RX_TYPE;
        break;
      }
      echo $result;
    } else {
      echo ”;
      exit;
    }
  }

三、通过code获取网页授权access_token和openid

  //接收文本消息
  private function receiveText($object)
  {
    switch($object->Content)
    {
    case ‘猜猜我是谁’: //发送单图文消息:用户基本信息

$token_url =
‘_tokenappid=’.$appid.’&secret=’.$appsecret.’&code=’.$code.’&grant_type=authorization_code’;$token
= json_decode(file_get_contents($token_url));$opendid=
$token-openid;$access_token = $token-access_token;

      //获取access_token
      $access_token =
$this->get_access_token($this->appid,$this->appsecret);

四、获取用户信息

      //获取用户信息
      $url =
“” .
      $access_token . “&openid=” . $object->FromUserName .
“&lang=zh_CN”;
      $output = file_get_contents($url);
      $jsoninfo = json_decode($output,true);

$info_url =
‘_token=’.$access_token.’&openid=’.$opendid.’=zh_CN’;$info =
json_decode(file_get_contents($info_url));$data[‘name’] =
$info-nickname;$data[‘image’] = $info-headimgurl;print_r($info);

      if($jsoninfo[‘sex’] == 1) {
        $sex = “男”;
      } else if($jsoninfo[‘sex’] == 2) {
        $sex = “女”;
      } else {
        $sex = “未知”;
      }
      $content = array();
      $content[] = array(‘Title’ =>
“我知道你是谁!”,’Description’ => “昵称:” . $jsoninfo[‘nickname’]
.
        ”rn” . “性别:” . $sex . “rn” . “国家:” .
$jsoninfo[‘country’] . “rn” . “省份:” .
        $jsoninfo[‘province’] . “rn” . “城市:” .
$jsoninfo[‘city’],’PicUrl’ => $jsoninfo[‘headimgurl’],
        ’Url’ => ”);
      break;
    default:
      $content = ‘您发送的消息有误!’;
      break;
    }
    if(is_array($content)) {
      if(isset($content[0][‘PicUrl’])) {
        $result = $this->transmitInfo($object,$content);
      }
    } else {
      $result = $this->transmitText($object,$content);
    }
    return $result;
  }

五、当获取到用户的openid等信息后,我们就可以将其存入数据库,只要有openid了,就相当于微信用户已经登录该网站!

   //接收事件推送
  private function receiveEvent($object)
  {
    $content = “”;
    switch($object->Event)
    {
    case ‘subscribe’:
      $content = “欢迎关注*****!”;
      break;
    case ‘unsubscribe’:
      $content = “取消关注”;
      break;
    case ‘CLICK’:
      switch($object->EventKey)
      {
      case ‘我是谁’:
        //获取access_token
        $access_token =
$this->get_access_token($this->appid,$this->appsecret);

使用AppID和AppSecret获取的access_token,通过全局Access
Token获取用户基本信息

        //获取用户信息
        $url =
“” .
        $access_token . “&openid=” . $object->FromUserName .
“&lang=zh_CN”;
        $output = file_get_contents($url);
        $jsoninfo = json_decode($output,true);

  1. 用户关注以及回复消息的时候,均可以获得用户的OpenID

    xml ToUserName![CDATA[gh_b629c48b653e]]/ToUserName FromUserName![CDATA[ollB4jv7LA3tydjviJp5V9qTU_kA]]/FromUserName CreateTime1372307736/CreateTime MsgType![CDATA[event]]/MsgType Event![CDATA[subscribe]]/Event EventKey![CDATA[]]/EventKey/xml

        if($jsoninfo[‘sex’] == 1) {
          $sex = “男”;
        } else if($jsoninfo[‘sex’] == 2) {
          $sex = “女”;
        } else {
          $sex = “未知”;
        }
        $content = array();
        $content[] = array(‘Title’ =>
“我知道你是谁!”,’Description’ => “昵称:” . $jsoninfo[‘nickname’]
.
          ”rn” . “性别:” . $sex . “rn” . “国家:” .
$jsoninfo[‘country’] . “rn” . “省份:” .
          $jsoninfo[‘province’] . “rn” . “城市:” .
$jsoninfo[‘city’],’PicUrl’ => $jsoninfo[‘headimgurl’],
          ’Url’ => ”);
        break;
      default:
        $content = “该按钮暂时尚未添加事件!”;
        break;
        }
    break;
    default:
      $content = “对不起,目前暂不受理此事件!”;
      break;
    }
    if(is_array($content)) {
      if(isset($content[0][‘PicUrl’])) {
        $result = $this->transmitInfo($object,$content);
      }
    } else {
      $result = $this->transmitText($object,$content);
    }
    return $result;
  }

其中的FromUserName就是OpenID

  //发送文本消息
  private function transmitText($object,$content)
  {
    $textTpl = “<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[text]]></MsgType>
          <Content><![CDATA[%s]]></Content>
          </xml>”;
      $result = sprintf($textTpl, $object->FromUserName,
$object->ToUserName, time(), $content);
    return $result;
  }

  1. 然后使用access_token接口,请求获得全局Access Token

  //发送单图文消息:用户基本信息
  private function transmitInfo($object,$infoArray)
  {
    if(!is_array($infoArray)) {
      return;
        }
    $itemTpl = “<item>
          <Title><![CDATA[%s]]></Title>
          <Description><![CDATA[%s]]></Description>
          <PicUrl><![CDATA[%s]]></PicUrl>
          <Url><![CDATA[%s]]></Url>
          </item> “;
    $item_str = “”;
    foreach ($infoArray as $item){
      $item_str .= sprintf($itemTpl, $item[‘Title’],
$item[‘Description’], $item[‘PicUrl’],
      $item[‘Url’]);
    }
    $infoTpl = “<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[news]]></MsgType>
          <Content><![CDATA[]]></Content>
          <ArticleCount>%s</ArticleCount>
          <Articles> $item_str</Articles>
          </xml>”;
    $result = sprintf($infoTpl, $object->FromUserName,
$object->ToUserName, time(),
    count($infoArray));
    return $result;
  }
}

_type=client_credential&appid=APPID&secret=APPSECRET返回结果:

{ "access_token": "NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjbLc_KAA092cxkmpj5FpuqNO0IL7bB0Exz5s5qC9Umypy-rz2y441W9qgfnmNtIZWSjSQ", "expires_in": 7200}
  1. 再使用全局ACCESS_TOKEN获取OpenID的详细信息

_token=ACCESS_TOKEN&openid=OPENID返回如下:

{ “subscribe”: 1, “openid”: “oLVPpjqs2BhvzwPj5A-vTYAX4GLc”, “nickname”:
“刺猬宝宝”, “sex”: 1, “language”: “zh_CN”, “city”: “深圳”, “province”:
“广东”, “country”: “中国”, “headimgurl”: “”, “subscribe_time”:
1386160805}

至此,获得用户的基本信息。

这种方式最适合用户在关注的时候,回复一条欢迎关注+用户昵称的信息,如关注下面公众账号时的回复所示。扫描二维码可体验。

以上就是本文针对php微信公众平台开发之获取用户基本信息的全部内容,希望大家喜欢。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图