初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客、问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的学渣一点帮助。—— 前言.
我需要用户接收微信分享的链接后,点击进入给参加活动的用户【点赞】,然后需要后台获取该微信用户的openid作为唯一的标记信息,以便保证该用户下次进入后进行数据库的比对,直接提取其对应的操作信息。
1.一般情况下,使用的公众号/服务号进行配置的信息基本如下:
2.因为我个人学习申请的是订阅号,好多功能不开放,进而选择了“公众平台测试账号”
3.点击“进入”后会被要求扫描二维码,使用自己的微信账号就可以。需要注意的是,“接口配置信息”中,URL为验证token的回调地址,此URL填写时多半需要你已经将代码上传的外网可访问的地址,我在后面会提供相应代码,再者注意Token值的确定,因为后面代码中会用到。
4.下拉页面,需要配置 网页授权获取用户基本信息,需要注意的是回调页面的域名一定不要写错,之前我就是错在这里浪费了很多时间,如果错误,后面二维码扫描时会报错:“redirect_uri参数错误”.个人建议去掉“http://”以及多余的后缀就好,可以参考下图。
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.微信公众号开发文档中有说明,需要访问的网站域名端口为80,需要注意一下,当然多数默认为80端口开放,如果没有外网可访问的网站,建议使用新浪SAE,在此我使用的是公司服务器直接测试。
2.因为微信开发的信息更新,获取我们网上获取的信息已过时,所以建议学会方法后面的操作参考开发文档也不是难事。
3.在此提供两个参考网站,个人觉得除了部分时间久远,还是很详细的,尤其对于SAE,以及开发文档的解释都值得一读。
方倍工作室 小宇博客 微信开发知识库 草料二维码