咱們要作一個臨時的二維碼,就相似超市的最後搶購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
臨時二維碼重點提示如下,若是是分兩次進行掃描,那麼最後的效果就是他會在永久二維碼的數據庫裏面增長一條數據,但重點仍是看永久二維碼裏面的業務邏輯是如何寫的了數據庫