微信公眾號圖文回復驗證碼並寫入數據庫的基本思路


接了個小活:要求公眾號中用戶回復1,公眾號被動回復7位數驗證碼,同時把用戶openId和驗證碼寫入數據庫

簡單寫了各測試demo:工具 thinkphp   訂閱號子欽有話說內申請的測試賬號 

接口配置信息修改

 

Controller控制器   輸入1得到被動回復驗證碼(里面大多數代碼與標題無關,想必大家能用到,所以沒有刪除)

<?php
namespace Home\Controller;
use Home\Common\CommonController;
/**
 *@parame  微信公眾號開發 
 */
class WeChatController extends CommonController {
    //配置接口信息接入api
    public function index() {
        //1.獲得參數 signature nonce token timestamp echostr
        $nonce     = $_GET['nonce'];
        $token     = 'zhangmangde';
        $timestamp = $_GET['timestamp'];
        $echostr   = $_GET['echostr'];
        $signature = $_GET['signature'];
        //2.拼成數組,然后按字典序排序
        $array     = array();
        $array     = array($nonce,$timestamp,$token);
        sort($array);
        //3.拼成字符串,sha1加密,然后和$signature進行比較
        $str = sha1(implode($array));
        if($str == $signature && $echostr){
            //第一次接入微信api的時候
            echo $echostr;
            exit;
        }else{
            $this->responseMsg();
        }
        
    }
    
    /*public function show(){
        echo 'zhangmangde';
    }*/
    //接受事件,推送並回復
    public function responseMsg(){
        //1.獲取到微信推送過來的post數據(xml格式)
        $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
        //2.處理消息類型,並設置回復內容和類型
        /*<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        </xml>*/
        $postObj = simplexml_load_string($postArr);//將xml字符串載入對象中
        //$postObj->ToUserName = '';
        //$postObj->FromUserName = '';
        //$postObj->CreateTime = '';
        //$postObj->MsgType = '';
        //$postObj->Event = '';
        //判斷該數據包是否是訂閱的事件推送
        if(strtolower($postObj->MsgType) == 'event'){
            //如果是關注subcribe事件
            if(strtolower($postObj->Event) == 'subscribe'){
                //回復用戶消息
                $arr  = array(
                    array(
                        'title'       => '歡迎關注子欽的公眾號開發版喲^^~~^^',
                        'description' => '張子欽很酷哦 or ziqin is very cool 哈哈!關注有驚喜哦',
                        'picUrl'      => 'http://waphd.simufengyun.com/Public/Home/images/zmd123.png',
                        'url'         => 'http://wap.simufengyun.com/',
                    ),
                );
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;//實例化時,一定要注意Model的路徑問題 下面a()方法是測試路徑問題
                $weChatModel->responseSubscribe($postObj,$arr);//調用模型中的方法
            }    
            //點擊事件
            if(strtolower($postObj->Event) == 'click'){
                //如果是自定義菜單中的event->click
                if(strtolower($postObj->EventKey) == 'item1'){
                    $content = "這是菜單一事件的推送";
                }
                if(strtolower($postObj->EventKey) == 'songs'){
                    $content = "這是歌曲事件的推送";
                }
                //實例化模型
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            //跳轉事件
            if(strtolower($postObj->Event) == 'view'){
                //如果是自定義菜單中的event->view
                $content = "要跳轉的鏈接是".$postObj->EventKey;
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            //
            if(strtolower($postObj->Event) == 'SCAN'){
                //自定義菜單中的event->scan
                $content = "掃描場景".$postObj->EventKey;
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            if(strtolower($postObj->Event) == 'LOCATION'){
                //自定義菜單中的event->LOCATION
                $content = "上傳位置:緯度".$postObj->Latitude.";經度".$postObj->Longitude;
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            if(strtolower($postObj->Event) == 'scancode_waitmsg'){
                //自定義菜單中的event->scancode_waitmsg
                $content = "掃描帶提示:類型".$postObj->ScanCodeInfo->ScanType."結果:".$postObj->ScanCodeInfo->ScanResult;
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            if(strtolower($postObj->Event) == 'scancode_push'){
                //自定義菜單中的event->scancode_push
                $content = "掃碼推事件";
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            if(strtolower($postObj->Event) == 'pic_sysphoto'){
                //自定義菜單中的event->pic_sysphoto
                $content = "系統拍照";
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            if(strtolower($postObj->Event) == 'pic_weixin'){
                //自定義菜單中的event->pic_weixin
                $content = "相冊發圖:數量".$postObj->SendPicsInfo->Count;
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            if(strtolower($postObj->Event) == 'pic_photo_or_album'){
                //自定義菜單中的event->pic_photo_or_album
                $content = "拍照或者相冊:數量".$postObj->SendPicsInfo->Count;
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
            if(strtolower($postObj->Event) == 'location_select'){
                //自定義菜單中的event->location_select
                $content = "發送位置:標簽".$postObj->SendLocationInfo->Label;
                //實例化模型
                $weChatModel = new \Home\Model\WeChatModel;
                $weChatModel->responseText($postObj,$content);//調用方法
            }
        }
        
        //判斷是否是純文本
        /*if(strtolower($postObj->MsgType) == 'text'){
            switch(trim($postObj->Content)){
                case 1:
                    $content = '您輸入的數字是1';
                break;
                case 2:
                    $content = '您輸入的數字是2';
                break;
                case 3:
                    $content = '您輸入的數字是3';
                break;
                case '英文':
                    $content = 'ziqin is very good';
                break;
                case '電話':
                    $content = '15236272691';
                break;
                case '百度':
                    $content = '<a href="https://www.baidu.com">百度搜索</a>';
                break;
            }
            $template = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        </xml>";
            $toUser   = $postObj->FromUserName;
            $fromUser = $postObj->ToUserName;
            $time     = time();
            $msgType  = 'text';
            echo sprintf($template,$toUser,$fromUser,$time,$msgType,$content);
        }*/
        
        //用戶發送tuwen1關鍵字的時候,發送一個圖文 或者發送純文本  或者多圖文
        if(strtolower($postObj->MsgType) == 'text' && trim($postObj->Content)=='tuwen1'){
            $arr  = array(
                array(
                    'title'       => '私募風雲網年度峰會報名開始啦',
                    'description' => 'ziqin is very cool',
                    'picUrl'      => 'http://wap.simufengyun.com//Public/Home/images/ban1.jpg',
                    'url'         => 'http://wap.simufengyun.com/',
                ),
                array(
                    'title'       => '私募風雲網官方網站',
                    'description' => 'simufengyun is very cool',
                    'picUrl'      => 'http://wap.simufengyun.com//Public/Home/images/ban2.jpg',
                    'url'         => 'http://wap.simufengyun.com/',
                ),
                array(
                    'title'       => '我是子欽有話說',
                    'description' => 'ziqin is very cool',
                    'picUrl'      => 'http://wap.simufengyun.com//Public/Home/images/ban3.jpg',
                    'url'         => 'http://wap.simufengyun.com/',
                ),
            );
            //實例化模型
            $weChatModel = new \Home\Model\WeChatModel;//實例化時,一定要注意Model的路徑問題 下面a()方法是測試路徑問題
            $weChatModel->responseNews($postObj,$arr);//調用模型中的方法
        }else{
            switch(trim($postObj->Content)){
                case 1:
                      $openId = $postObj->FromUserName;//獲取用戶openId
          $content .= '您的驗證碼是:'.getsRandChar(7)."\n";//回復隨機7位數驗證碼 
          $content .='您的openId是:'.$openId;
          //此處可以操作寫入數據庫
break; case 2: $content = '您輸入的數字是2'; break; case 3: $content = '您輸入的數字是3'; break; case 4: $content = '張'; break; case '英文': $content = 'ziqin is very good'; break; case '電話': $content = '15236272691'; break; case '百度': $content = '<a href="https://www.baidu.com">百度搜索</a>'; break; default: $content = "沒有找到相關信息"; break; } //實例化模型 $weChatModel = new \Home\Model\WeChatModel; $weChatModel->responseText($postObj,$content);//調用方法 } } //接收事件消息 /* private function receiveEvent($object) { $content = ""; switch ($object->Event) { case "subscribe": $content = "歡迎關注方倍工作室 "; $content .= (!empty($object->EventKey))?("\n來自二維碼場景 ".str_replace("qrscene_","",$object->EventKey)):""; break; case "unsubscribe": $content = "取消關注"; break; case "CLICK": switch ($object->EventKey) { case "COMPANY": $content = array(); $content[] = array("Title"=>"方倍工作室", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); break; default: $content = "點擊菜單:".$object->EventKey; break; } break; case "VIEW": $content = "跳轉鏈接 ".$object->EventKey; break; case "SCAN": $content = "掃描場景 ".$object->EventKey; break; case "LOCATION": $content = "上傳位置:緯度 ".$object->Latitude.";經度 ".$object->Longitude; break; case "scancode_waitmsg": $content = "掃碼帶提示:類型 ".$object->ScanCodeInfo->ScanType." 結果:".$object->ScanCodeInfo->ScanResult; break; case "scancode_push": $content = "掃碼推事件"; break; case "pic_sysphoto": $content = "系統拍照"; break; case "pic_weixin": $content = "相冊發圖:數量 ".$object->SendPicsInfo->Count; break; case "pic_photo_or_album": $content = "拍照或者相冊:數量 ".$object->SendPicsInfo->Count; break; case "location_select": $content = "發送位置:標簽 ".$object->SendLocationInfo->Label; break; default: $content = "receive a new event: ".$object->Event." \n技術支持 方倍工作室"; break; } if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($object, $content); }else if (isset($content['MusicUrl'])){ $result = $this->transmitMusic($object, $content); } }else{ $result = $this->transmitText($object, $content); } return $result; }*/ //采集遠程數據 /*function http_curl(){ //獲取遠程數據 //1.初始化curl $ch = curl_init(); $url = 'http://wap.simufengyun.com'; //2.設置curl參數 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //3.采集 $output = curl_exec($ch); //4.關閉 curl_close($ch); var_dump($output); }*/ /** *$url 接口url string *$type 請求類型 string *$res 返回數據類型 string *$arr post請求參數 string */ function http_curl($url,$type='get',$res='json',$arr=''){ //獲取遠程數據 //1.初始化curl $ch = curl_init(); //$url = 'http://wap.simufengyun.com'; //2.設置curl參數 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); if($type == 'post'){ curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$arr); } //3.采集 $output = curl_exec($ch); //4.關閉 curl_close($ch); if($res == 'json'){ if(curl_error($ch)){ //請求失敗,返回錯誤信息 return curl_error($ch); }else{ return json_decode($output,true); } } //var_dump($output); } //獲取access_token和微信服務器ip地址 /*function getWxAccessToken(){ //1.請求url地址 $appid = 'wxd3a57f24b4e021b2'; $appsecret = 'feffb8659a14792c9323fdf27b4b35f7'; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret; //2.初始化 $ch = curl_init(); //3.設置參數 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //4.調用接口(采集) $res = curl_exec($ch); //5.關閉curl curl_close($ch); if(curl_errno($ch)){ var_dump(curl_error($ch)); } $arr = json_decode($res,true); var_dump($arr); }*/ //獲取微信服務器ip function getWxServerIp(){ $accessToken = "9E_hA1sd77bpRQ0GqhyU4G5zpLxKZM3Yrxa1za0yyYQpWJmXif5AI3nRNUBe6xESQtQR5SbHHTkvYx5XkcnXkcXn6gVpGVGGbCswbLMMtqEfD1mGXHobq3nKtUkwFXvVSLXgABAFYK"; $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$accessToken; $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $res = curl_exec($ch); curl_close($ch); if(curl_errno($ch)){ var_dump(curl_error($ch)); } $arr = json_decode($res,true); echo "<pre>"; var_dump($arr); echo "<pre>"; } //測試實例化Model模型路徑問題 public function a(){ $weChatModel = new \Home\Model\WeChatModel; var_dump($weChatModel); } //返回access_token; access_token存入session避免重復調用 public function getWxAccessToken(){ //將access_token 存在session/cookie中 if($_SESSION['access_token'] && $_SESSION['expires_time']>time()){ //如果access_token在session並沒有過期 return $_SESSION['access_token']; }else{ //如果access_token在session不存在或者已經過期,重新取access_token $appid = 'wxd3a';//此處用你自己的appid $appsecret = 'feffb8659a14792c9323fdf';//用你自己的appsecret $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret; $res = $this->http_curl($url,'get','json'); $access_token = $res['access_token']; //將重新獲取到的access_token存入session $_SESSION['access_token'] = $access_token; $_SESSION['expires_time'] = time() + 7200; return $access_token; } } //自定義菜單 public function definedItem(){ //創建微信菜單 //目前微信接口的調用方式都是通過curl post/get header('content-type:text/html;charset=utf-8');//解決中文亂碼 echo $access_token = $this->getWxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token; $postArr = array( 'button'=>array( array( 'name'=>urlencode('子欽'), 'type'=>'click', 'key'=>'item1', ),//第一個一級菜單 array( 'name'=>urlencode('子欽語錄'), 'sub_button'=>array( array( 'name'=>urlencode('歌曲'), 'type'=>'click', 'key'=>'songs', ),//第一個二級菜單 array( 'name'=>urlencode('私募風雲網'), 'type'=>'view', 'url'=>'http://wap.simufengyun.com', ),//第二個二級菜單 ), ),//第二個一級菜單 array( 'name' =>urlencode('子欽心語'), 'type' =>'view', 'url' => 'http://wap.simufengyun.com', ),//第三個一級菜單 ), ); //其他按鈕類型 $postArr2 = array( 'button'=>array( array( 'name'=>urlencode('掃碼'), 'sub_button'=>array( array( 'type'=>"scancode_waitmsg", 'name'=>urlencode("掃碼帶提示"), 'key'=>"rselfmenu_0_0", ),//第一個二級菜單 array( 'type'=>"scancode_push", 'name'=>urlencode("掃碼推事件"), 'key'=>"rselfmenu_0_1", ),//第二個二級菜單 ), ),//第一個一級菜單 array( 'name'=>urlencode("發圖"), 'sub_button'=>array( array( 'type'=>'pic_sysphoto', 'name'=>urlencode("系統拍照發圖"), 'key'=>"rselfmenu_1_0", ),//第一個二級菜單 array( 'type'=>'pic_photo_or_album', 'name'=>urlencode("拍照或者相冊發圖"), 'key'=>"rselfmenu_1_1", ),//第二個二級菜單 array( 'type'=>'pic_weixin', 'name'=>urlencode("微信相冊發圖"), 'key'=>"rselfmenu_1_2", ),//第三個二級菜單 ), ),//第二個一級菜單 array( 'name'=>urlencode("發送位置"), 'type'=>"location_select", "key"=>"rselfmenu_2_0", ),//第三個一級菜單 ), ); /*echo '<hr />'; var_dump($postArr); echo '<hr />'; echo $postJson = urldecode(json_encode($postArr)); $res = $this->http_curl($url,'post','json',$postJson); echo "<hr/>"; var_dump($res);*/ echo '<hr />'; var_dump($postArr2); echo '<hr />'; echo $postJson = urldecode(json_encode($postArr2)); $res = $this->http_curl($url,'post','json',$postJson); echo "<hr/>"; var_dump($res); }
}

Model類

<?php
namespace Home\Model;
use Think\Model;
class WeChatModel extends Model{
    //多圖文的回復微信方法
    public function responseNews($postObj,$arr)
    {
        $toUser   = $postObj->FromUserName;
        $fromUser = $postObj->ToUserName;
        $time     = time();
        $template = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <ArticleCount>".count($arr)."</ArticleCount>
                    <Articles>";
        foreach($arr as $k=>$v){
            $template .="<item>
                        <Title><![CDATA[".$v['title']."]]></Title> 
                        <Description><![CDATA[".$v['description']."]]></Description>
                        <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>
                        <Url><![CDATA[".$v['url']."]]></Url>
                        </item>";
            }
        $template .= "</Articles>
                    </xml>";
        echo sprintf($template,$toUser,$fromUser,$time,'news');
     }
     
     //回復單文本
     public function responseText($postObj,$content){
        $template = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    </xml>";
        $toUser   = $postObj->FromUserName;
        $fromUser = $postObj->ToUserName;
        $time     = time();
        $msgType  = 'text';
        echo sprintf($template,$toUser,$fromUser,$time,$msgType,$content);
     }
    //回復用戶關注消息
    public function responseSubscribe($postObj,$arr){
        $this->responseNews($postObj,$arr);
    }
 }

7位驗證的函數方法

//生成隨機數,length長度 
function getsRandChar($length){
    $str = null;
    $strPol = "0123456789abcdefghijklmnopqrstuvwxyz";//不區分大小寫
   //$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";//區分大小寫
$max = strlen($strPol)-1; for($i=0;$i<$length;$i++){ $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介於min和max兩個數之間的一個隨機整數 } return $str; }

 

有不明白的加微信咨詢zmd1047773569

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM