微信公众平台开发[1] —— 获取用户Openid及个人信息

    初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客、问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的学渣一点帮助。—— 前言.

    背景介绍:

     我需要用户接收微信分享的链接后,点击进入给参加活动的用户【点赞】,然后需要后台获取该微信用户的openid作为唯一的标记信息,以便保证该用户下次进入后进行数据库的比对,直接提取其对应的操作信息。

    操作流程:

    一.公众号的信息配置

       1.一般情况下,使用的公众号/服务号进行配置的信息基本如下:

       微信公众平台开发[1] —— 获取用户Openid及个人信息_第1张图片

      

       2.因为我个人学习申请的是订阅号,好多功能不开放,进而选择了“公众平台测试账号”


       微信公众平台开发[1] —— 获取用户Openid及个人信息_第2张图片

      3.点击“进入”后会被要求扫描二维码,使用自己的微信账号就可以。需要注意的是,“接口配置信息”中,URL为验证token的回调地址,此URL填写时多半需要你已经将代码上传的外网可访问的地址,我在后面会提供相应代码,再者注意Token值的确定,因为后面代码中会用到。

       微信公众平台开发[1] —— 获取用户Openid及个人信息_第3张图片

          4.下拉页面,需要配置 网页授权获取用户基本信息,需要注意的是回调页面的域名一定不要写错,之前我就是错在这里浪费了很多时间,如果错误,后面二维码扫描时会报错:“redirect_uri参数错误”.个人建议去掉“http://”以及多余的后缀就好,可以参考下图。

          微信公众平台开发[1] —— 获取用户Openid及个人信息_第4张图片

          微信公众平台开发[1] —— 获取用户Openid及个人信息_第5张图片

    二.后台代码的编写

    1.回调地址的代码,该文件是我直接从开发者平台下载而来,只改动了“token”值。

//define your token
define("TOKEN", "wxToShow");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
   public function valid()
   {
      $echoStr = $_GET["echostr"];

      //valid signature , option
      if($this->checkSignature()){
         echo $echoStr;
         exit;
      }
   }

   public function responseMsg()
   {
      //get post data, May be due to the different environments
      $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      //extract post data
      if (!empty($postStr)){
         /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
               the best way is to check the validity of xml by yourself */
         libxml_disable_entity_loader(true);
         $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
         $fromUsername = $postObj->FromUserName;
         $toUsername = $postObj->ToUserName;
         $keyword = trim($postObj->Content);
         $time = time();
         $textTpl = "<xml>
                     <ToUserName><![CDATA[%s]]></ToUserName>
                     <FromUserName><![CDATA[%s]]></FromUserName>
                     <CreateTime>%s</CreateTime>
                     <MsgType><![CDATA[%s]]></MsgType>
                     <Content><![CDATA[%s]]></Content>
                     <FuncFlag>0</FuncFlag>
                     </xml>";
         if(!empty( $keyword ))
         {
            $msgType = "text";
            $contentStr = "Welcome to wechat world!";
            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            echo $resultStr;
         }else{
            echo "Input something...";
         }

      }else {
         echo "";
         exit;
      }
   }

   private function checkSignature()
   {
      // you must define TOKEN by yourself
      if (!defined("TOKEN")) {
         throw new Exception('TOKEN is not defined!');
      }

      $signature = $_GET["signature"];
      $timestamp = $_GET["timestamp"];
      $nonce = $_GET["nonce"];

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

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


     2.提供访问地址的代码,注意appid的正确填写,其次就是redirect_uri的地址确定,我提供的可作参考。再者对于下面代码中的url中“scope=snsapi_userinfo可以自行控制,需要分辨snsapi_base和snsapi_userfo的简单区别,百度可有很多具体解释。

function getBaseInfo(){
    
    $appid = "wx3xxxxxxxxa199";
    $redirect_uri = urlencode("http://www.xxxxxx.com/wxToShow/wxToBaby.php");
    $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
    header('location:'.$url);
}
getBaseInfo();

 
 

     3.提供 redirect_uri 中的代码,此代码的功能是打印出微信用户的信息,便于参考获取的json数据,当提取到微信用户的数据,后续相关数据库操作代码开发就不是难事了。

//获取到网页授权的access_token
$appid = "wx361bbb4c4d43a199";//填写公众号或服务号、测试号的appid
$secret = "9cac57349441947f99c43d09cca1a8a2";//填写对应的secriet

if(isset($_SESSION['openId'])){
    $openid = $_SESSION['openId'];
}else{
    $code = $_GET['code'];
    $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code ";

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_HEADER,0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    $res = curl_exec($ch);
    curl_close($ch);
    $json_obj = json_decode($res,true);
    $openid = $json_obj['openid'];
    $_SESSION['openId'] = $openid;
}
    echo '微信用户:'.$openid.'<br/>';
    echo '$json_obj 返回信息:';
    var_dump($json_obj);

    getUserInfo($json_obj);
/**
 * @param $json_obj
 * 根据用户openid 获取其所有信息
 */
function getUserInfo($json_obj){
    $access_token = $json_obj['access_token'];
    $openid = $json_obj['openid'];
    $get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$get_user_info_url);
    curl_setopt($ch,CURLOPT_HEADER,0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    $res = curl_exec($ch);
    curl_close($ch);

//解析json
    $user_obj = json_decode($res,true);
    var_dump($user_obj);
    echo 'Name:'.$user_obj['nickname'];
}

    三.最后的功能测试

     1.使用“草料二维码”生成微信可扫描的二维码,然后使用手机扫描即可:
     微信公众平台开发[1] —— 获取用户Openid及个人信息_第6张图片
     2.扫描过后显示如下:
     微信公众平台开发[1] —— 获取用户Openid及个人信息_第7张图片



    补充:

     1.微信公众号开发文档中有说明,需要访问的网站域名端口为80,需要注意一下,当然多数默认为80端口开放,如果没有外网可访问的网站,建议使用新浪SAE,在此我使用的是公司服务器直接测试。

     2.因为微信开发的信息更新,获取我们网上获取的信息已过时,所以建议学会方法后面的操作参考开发文档也不是难事。

     3.在此提供两个参考网站,个人觉得除了部分时间久远,还是很详细的,尤其对于SAE,以及开发文档的解释都值得一读。

      方倍工作室  小宇博客     微信开发知识库 草料二维码


   >>源代码下载>>>


你可能感兴趣的:(PHP,微信,OpenID)