奪命雷公狗---微信開發38----臨時二維碼

咱們要作一個臨時的二維碼,就相似超市的最後搶購30秒。php

臨時二維碼手冊的查找方式幾乎差不了什麼html

 

 

第一步都是須要先申請到一個ticket值,而後經過ticket值去換取二維碼,temp_qrcode.php代碼以下:mysql

 

<?php
    header("Content-Type:text/html;charset=utf-8");
    require_once "get_token.php";
    require_once "common.php";
    //首先咱們申請一個二維碼的ticket
    //好比咱們規定$scene_id值5000表示咱們臨時生成的二維碼,有效時間爲50秒
    //臨時二維碼,是有過時時間的,最長能夠設置爲在二維碼生成後的30天(即2592000秒)後過時
    $scene_id = '500';
    //action_name 二維碼類型,QR_SCENE爲臨時,QR_LIMIT_SCENE爲永久,QR_LIMIT_STR_SCENE爲永久的字符串參數值
    //action_info 二維碼詳細信息
    //scene_id 場景值ID,臨時二維碼時爲32位非0整型,永久二維碼時最大值爲100000(目前參數只支持1--100000)
    //scene_str 場景值ID(字符串形式的ID),字符串類型,長度限制爲1到64,僅永久二維碼支持此字段
    //這下面的50表明50秒
    $post = '{"expire_seconds": 50, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$scene_id.'}}}';
    $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$access_token}";
    //發出http請求,申請ticket
    $res = http_request($url,$post);
    $str_json = json_decode($res);
    $ticket = $str_json->ticket;
    //經過ticket來換取二維碼
    $ticket = urlencode($ticket);
    $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={$ticket}";
    $filee = file_get_contents($url);
    //把該二維碼文件保存到空間裏的rqcode文件夾內,若是是linux系統要要修改下文件權限 chown -R www:www ./rqcode/
    $file_name = "qrcode{$scene_id}.jpg";
    file_put_contents("./qrcode/".$file_name,$filee);
    $rqcode_url = "http://weixin.showtp.com/qrcode/{$file_name}";
?>
<!DOCTYPE html>
<html>
    <head>
        <title>生成臨時性二維碼</title>
    </head>
    <body>
        <h1>生成臨時性二維碼 50秒內掃描該二維碼便可贈送美國充氣娃娃</h1>
        <img src="<?php echo $rqcode_url; ?>" />
    </body>
</html>

 

 

index.php代碼以下:linux

<?php
/**
  * wechat php test
  */

//define your token
require_once "common.php";
//這裏是引入curl發送函數的類
require_once 'WeChat.class.php';
define("TOKEN", "twgdh");

//這裏讓這個類繼承了curl發送參數的類
class wechatCallbackapiTest extends WeChat
{
    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 */
                // 使用simplexml技術對xml進行解析 
                // libxml_disable_entity_loader(true), 是從安全性考慮,爲了防止xml外部注入,
                //只對xml內部實體內容進行解析
                libxml_disable_entity_loader(true);
                //加載 postStr 字符串
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                global $tmp_arr;
                
                //當用戶公衆號有互動時,咱們將會動hd_time字段更新
                $connect = mysql_connect('localhost','root','root') or die('數據庫連接失敗');
                mysql_select_db('wxdb',$connect);
                mysql_query('set names utf8');
                $sql = "update qf_users set hd_time='{$time}' where openid='{$fromUsername}'";
                mysql_query($sql, $connect);
                
                //根據接收到的消息類型,來進行分支處理(switch)
                switch($postObj->MsgType)
                {
                    case 'event':
                        //用戶未關注時,進行關注後的事件推送
                        if($postObj->Event == 'subscribe')
                        {
                            
                            $contentStr = "歡迎關注leigood微信測試號噢";
                            $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                            echo $resultStr; 
                            //當用戶訂閱時,根據用戶的掃描狀況來保存該用戶
                            $connect = mysql_connect('localhost','root','root') or die('鏈接數據庫失敗');
                            mysql_select_db('wxdb',$connect);
                            mysql_query('set names utf8');
                            //這裏的EventKey是手冊上告訴咱們的,EventKey事件KEY值,qrscene_爲前綴,後面爲二維碼的參數值
                            //EventKey也就是咱們的場景值
                            $EventKey = $postObj->EventKey;
                            $sql = "insert into qrcode_users (id,openid,scene_id) values(NULL,'{$fromUsername}','{$EventKey}')";
                            mysql_query($sql);
                        //這下面的EventKey是來自temp_qrcode.php文件裏面本身定義的$scene_id的值
                        }else if($postObj->Event == 'SCAN' && $postObj->EventKey == '500')
                        {
                            $contentStr = '恭喜您,您已經成功搶到咱們美國菲爾蘭州充氣娃娃一份';
                            $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                            echo $resultStr;
                        }
                        
                        break;
                    case 'text': //回覆文本模塊
                        //這裏開始測試客服消息接口了
                        if(!empty($keyword)){
                           //將用戶提交的內容入庫
                           $connect = mysql_connect('localhost','root','root') or die('鏈接數據庫失敗');
                           mysql_select_db('wxdb',$connect);
                           mysql_query('set names utf8');
                           $sql = "insert into zx_info (id,openid,zx_info) values(NULL,'{$fromUsername}','{$keyword}')";
                           mysql_query($sql);
                           
                           $contentStr = '您的諮詢消息咱們已經收到,稍後將會有咱們的客服表明進行回覆';
                           $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                           echo $resultStr;
                        }else{
                            $contentStr = '您輸入的格式有誤';
                            $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                            echo $resultStr;
                        }
                        break;
                    case 'image': //處理用戶上傳圖片
                        $media_id = $postObj -> MediaId; //獲取到用戶上傳的圖片的mediaid
                        $resultStr = sprintf($tmp_arr['image'], $fromUsername, $toUsername, $time, $media_id);
                        echo $resultStr;
                        
                        //將圖片保存到本地服務器的文件系統
                        //1.先給圖片建立一個名字
                        $image_file_name = time().'.jpg';
                        //2.獲取該圖片的內容
                        $image_file = file_get_contents($postObj->PicUrl);
                        //3.保存到本地服務器的文件系統
                        //提醒:必定要保證您建立的文件夾是www用戶可讀可寫,不然沒法保存該圖片到文件夾下
                        file_put_contents("./uploadimage/".$image_file_name,$image_file);
                        
                        //將圖片的路徑和相關信息入庫
                        //1.建立一張表
                        //2.連接mysql數據庫,而且添加圖片信息
                        $connect = mysql_connect('localhost','root','root');
                        mysql_select_db('wxdb',$connect);
                        mysql_query('set names utf8');
                        $media_path = "./uploadimage/".$image_file_name; //路徑
                        $sql = "insert into keep_image_uploads (id,openid,media_id,media_path) values(NULL,'{$fromUsername}','{$media_id}','{$media_path}')";
                        mysql_query($sql,$connect);
                        break;
                    case 'voice': //處理用戶上傳語言的業務邏輯
                        $media_id = $postObj -> MediaId; //獲取media_id的id號
                        $resultStr = sprintf($tmp_arr['voice'], $fromUsername, $toUsername, $time, $media_id);
                        echo $resultStr;
                        break;
                    case 'location': //處理用戶上傳的地理位置信息
                        $Location_X = $postObj -> Location_X; //獲取上傳地理位置的緯度
                        $Location_Y = $postObj -> Location_Y; //獲取上傳地地理位置經度
                        $contentStr = "您上報的地理位置是:\n經度是:{$Location_Y} \n緯度是: {$Location_X}";
                        $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                        echo $resultStr;
                        break;
                    case 'link': //接收並回復連接信息
                        //獲取到用戶上傳的連接信息
                        $Title = $postObj -> Title;
                        $Url = $postObj -> Url;
                        $contentStr = "<a href='{$Url}'>{$Title}</a>";
                        $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                        echo $resultStr;
                        break;
                        
                }
        }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;
        }
    }
}

//若是這段代碼放在上面,那程序將會報錯,由於繼承的問題,會顯示類沒有找到
$wechatObj = new wechatCallbackapiTest();
//當接入成功後,請註銷這句話,不然,會反覆驗證。
//$wechatObj->valid();
//添加響應請求的語句
$wechatObj->responseMsg();

?>

 

 

index.php核心代碼以下:sql

 

 

臨時二維碼重點提示如下,若是是分兩次進行掃描,那麼最後的效果就是他會在永久二維碼的數據庫裏面增長一條數據,但重點仍是看永久二維碼裏面的業務邏輯是如何寫的了數據庫

ticket

相關文章
相關標籤/搜索