這篇文章主要為大家詳解php微信開(kāi)髮參數(shù)二維碼的使用說(shuō)明,有興趣的夥伴們可以參考一下
最近做微信PC端網(wǎng)頁(yè)微信相關(guān)功能的開(kāi)發(fā),從一個(gè)新手的角度來(lái)說(shuō),微信公眾號(hào)的文檔還是不好理解的,網(wǎng)上找的帖子大都也都基本上是複製微信公眾平臺(tái)上給的文檔,開(kāi)發(fā)微信帶參數(shù)二維碼過(guò)程中還是遇到不少坑的,在此把我的開(kāi)發(fā)過(guò)程比較詳細(xì)的記錄下,希望對(duì)大家有幫助。
我本次開(kāi)發(fā)使用的是認(rèn)證服務(wù)號(hào)。
1 接入
首先進(jìn)入微信公眾號(hào)-> 基本配置?
下面是基本配置的頁(yè)面,在URL中填寫(xiě)伺服器位址,這個(gè)位址就是接受微信推送事件的一個(gè)介面,我是使用thinkPHP框架開(kāi)發(fā)的程序,在其中一個(gè)Module(Decoration)的Action目錄下新建一個(gè)類(lèi),例如叫: WechatAction.class.php ,在該Action中新建一個(gè)public方法,例如叫: URLRedirect () ,那麼在這個(gè)URL中填寫(xiě)的就是http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect ,然後填入Token,Token隨意填,EncodingAESKey要不要都行,然後點(diǎn)擊確認(rèn),微信會(huì)往這個(gè)URL上發(fā)送一個(gè)get請(qǐng)求,裡麵包含很多參數(shù),其中大部分都是讓我們自己核對(duì)這次訪問(wèn)是不是微信伺服器請(qǐng)求的,我自己沒(méi)有驗(yàn)證,他的要求是如果我們核對(duì)成功,即原樣回傳get請(qǐng)求中的一個(gè)參數(shù)echostr,這裡的回傳不是return,也不是ajaxReturn,而使用echo,如果用thinkPHP開(kāi)發(fā)的話,直接使用echo I('echostr'); 即可。然後接口即驗(yàn)證成功了。
2 帶參數(shù)二維碼的作用
#微信的帶參數(shù)二維碼有兩種,一種是臨時(shí)二維碼,一種是永久二維碼,但是永久二維碼的生成是有個(gè)數(shù)限制的,我這次要實(shí)現(xiàn)的功能是用戶未登錄的情況下在網(wǎng)站上使用產(chǎn)品,比如獲得某商品的詳細(xì)報(bào)價(jià),但是又不想註冊(cè),然而又想保存這個(gè)報(bào)價(jià)單,這個(gè)時(shí)候網(wǎng)頁(yè)可以生成一張二維碼,用戶只要用微信掃一掃這個(gè)二維碼,官方公眾號(hào)就會(huì)給這個(gè)用戶發(fā)送一天圖文消息,圖文訊息點(diǎn)開(kāi)後就是用戶剛獲得的報(bào)價(jià)單,而且可以隨時(shí)點(diǎn)擊查看並且分享給朋友進(jìn)行比價(jià)。所以臨時(shí)二維碼即可正常使用。
上面是我是怎麼使用的,下面介紹一下整個(gè)互動(dòng)的流程:
當(dāng)用戶掃描這個(gè)二維碼,如果用戶關(guān)注了公眾號(hào),用戶會(huì)直接進(jìn)入與公眾號(hào)的會(huì)話頁(yè)面,微信伺服器會(huì)給我們?cè)谏弦徊皆O(shè)定的伺服器URL中推送一條訊息,其中可以攜帶一個(gè)我們自訂的參數(shù)。如果使用者未追蹤公眾號(hào),使用者首先會(huì)跳到公眾號(hào)追蹤頁(yè)面,使用者點(diǎn)擊追蹤後,會(huì)直接進(jìn)入公眾號(hào)的會(huì)話頁(yè)面,微信伺服器這時(shí)也會(huì)為我們?cè)O(shè)定的URL推送一個(gè)事件訊息,攜帶我們自訂參數(shù),我們可以根據(jù)這個(gè)參數(shù)和事件類(lèi)型做控制下一步動(dòng)作。
3 特定開(kāi)發(fā)流程?
3.1 取得access_token
這個(gè)access_token是我們程式呼叫微信介面的憑證,目前的有效期限是7200秒,所以我們需要定時(shí)更新 access_token。
取得方法:
方法: GET
url :https://api.weixin.qq.com/ cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
其中的參數(shù)APPID和APPSECRET是我們公眾號(hào)的APPID和APPSECRET,在微信公眾號(hào)-> 基本配置中可以查到,調(diào)用成功會(huì)回傳如下JSON資料:
?{"access_token":"ACCESS_TOKEN","expires_in":7200}
##其中access_token就是呼叫介面憑證,expire_in是token有效時(shí)間。
我自己是把a(bǔ)ccess_token存在資料庫(kù)中,同時(shí)保存過(guò)期時(shí)間,然後封裝公用函數(shù) getWechatAccessToken() ,每次先檢查access_token是否過(guò)期,如果過(guò)期則重新獲取,否則直接使用資料庫(kù)儲(chǔ)存的access_token即可,我忘了在哪裡看加過(guò),這個(gè)access_token每天的獲取次數(shù)應(yīng)該是有限制的。以下是getWechatAccessToken()? 的具體實(shí)作:
//獲取access_token function getWechatAccessToken(){ $wechatInfo = M('wechat_info')->select(); $wechatInfo = array_reduce($wechatInfo, create_function('$result, $v', '$result[$v["conf_name"]] = $v;return $result;')); $expireTime = $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES']['conf_value']; //前面不用管,是我數(shù)據(jù)庫(kù)相應(yīng)設(shè)置 if (time() < $expireTime){ //access_token未過(guò)期 return $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN']['conf_value']; }else{ //access_token過(guò)期,重新獲取 $baseUrl = C('WECHAT_PUBLIC_GET_ACCESS_TOKEN'); $url = str_replace("##APPSECRET##", $wechatInfo['PUBLIC_WECHAT_APPSECRET']['conf_value'], str_replace("##APPID##", $wechatInfo['PUBLIC_WECHAT_APPID']['conf_value'], $baseUrl)); $result = file_get_contents($url); $result = json_decode($result, true); if (array_key_exists('errorcode', $result)){ //失敗重試一次 return false; }else{ M('wechat_info')->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN'))->save(array('conf_value' => $result['access_token'])); M('wechat_info')->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES'))->save(array('conf_value' => time()+$result['expires_in']-200)); return $result['access_token']; } } }
C('WECHAT_PUBLIC_GET_ACCESS_TOKEN') = https://api.weixin.qq.com/ cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
封裝好這個(gè)之後,我們每次就可以安心的使用了。
.2 建立臨時(shí)二維碼
#3.2.1 取得ticket3
#請(qǐng)求方式: POST
介面:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST資料: {"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
介面URL中的TOKEN即我們?cè)?.1中取得的access_token,post資料中expire_seconds是二維碼的有效時(shí)間,最多30天,action_name臨時(shí)二維碼的話固定就是QR_SCENE,scene_id即我們自訂參數(shù),是個(gè)32位非0整數(shù)
你訂單的ID,微信伺服器推送事件的時(shí)候會(huì)把這個(gè)值回傳給我們?cè)O(shè)定的介面中,然後我會(huì)根據(jù)這個(gè)值去拿對(duì)應(yīng)的訂單資料展示在網(wǎng)頁(yè)上,這是後話。
以下是封裝的產(chǎn)生臨時(shí)二維碼的方法:?
#//創(chuàng)建臨時(shí)二維碼
function getTemporaryQrcode($orderId){
$accessToken = getWechatAccessToken();
$url = str_replace("##TOKEN##", $accessToken, C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET'));
$qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$orderId.'}}}';
$result = api_notice_increment($url, $qrcode);
$result = json_decode($result, true);
return urldecode($result['url']);
}
字串
,一定要是非常嚴(yán)格的JSON字串。下面是這個(gè)方法:?
function api_notice_increment($url, $data){ $ch = curl_init(); $header = "Accept-Charset: utf-8"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { curl_close( $ch ); return $ch; }else{ curl_close( $ch ); return $tmpInfo; } }
###getTemporaryQrcode() 中有一個(gè)在###設(shè)定檔###中的參數(shù)給大家看下,其實(shí)就是微信介面連結(jié):?###C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = ###https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN## ####### #####這個(gè)介面的回傳值是:?###{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJVAAIE230,003" \/weixin.qq.com\/ q\/kZgfwMTm72WWPkovabbI"} #########其中ticket是讓我們用來(lái)進(jìn)行下一步調(diào)用的憑證,expire_seconds是二維碼的有效期,url是我們產(chǎn)生的二維碼掃描後打開(kāi)的鏈接。所以如果我們自己實(shí)現(xiàn)了生成二維碼的方法,就不用再進(jìn)行下一步調(diào)用,我本人即在這一步就停止了,直接返回url的值,然後利用這個(gè)url的值生成二維碼存在本地即可。 PHP產(chǎn)生二維碼可以使用phpqrcode,挺好用的。下一步也大致提一下:######
3.2.2 獲取二維碼地址
請(qǐng)求方式: GET
接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
這個(gè)接口的返回值是一張圖片,可以直接展示或者下載,我們有具體使用過(guò),所以也不知道應(yīng)該怎么展示。
3.3 用戶掃描二維碼之后發(fā)生的事情
3.3.1 掃描后發(fā)生了什么
上面提到了,用戶掃描我們生成的臨時(shí)二維碼,如果用戶未關(guān)注公眾號(hào),則首先會(huì)跳轉(zhuǎn)到公眾號(hào)的關(guān)注頁(yè)面,點(diǎn)擊關(guān)注后,會(huì)進(jìn)入公眾號(hào)的會(huì)話頁(yè)面,同時(shí)會(huì)給我們?cè)O(shè)置的接口推送一個(gè)事件。如果用戶已經(jīng)關(guān)注了,用戶微信會(huì)直接跳轉(zhuǎn)到公眾號(hào)會(huì)話頁(yè)面,然后微信服務(wù)器會(huì)給我們?cè)O(shè)置的接口推送一個(gè)事件。
用戶關(guān)注與否微信服務(wù)器給我們推送的事件是差不多的,只是新關(guān)注用戶推送的事件中scene_id前面會(huì)加一個(gè)前綴。下面是微信公眾平臺(tái)文檔的說(shuō)明:
用戶未關(guān)注時(shí),進(jìn)行關(guān)注后的事件推送
<xml><ToUserName><![CDATA[toUser]]></ToUserName> //開(kāi)發(fā)者微信號(hào) <FromUserName><![CDATA[FromUser]]></FromUserName> //發(fā)送者賬號(hào)(openid) <CreateTime>123456789</CreateTime> //消息創(chuàng)建時(shí)間(整型) <MsgType><![CDATA[event]]></MsgType> //消息類(lèi)型 event <Event><![CDATA[subscribe]]></Event> //事件類(lèi)型(subscribe) <EventKey><![CDATA[qrscene_123123]]></EventKey> //事件KEY值,qrscene_為前綴,后面為二維碼參數(shù)值 <Ticket><![CDATA[TICKET]]></Ticket> //二維碼ticke值,可以用來(lái)?yè)Q取二維碼圖片 </xml>
用戶已關(guān)注時(shí)的事件推送
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> //開(kāi)發(fā)者微信號(hào) <FromUserName><![CDATA[FromUser]]></FromUserName> //發(fā)送者賬號(hào)(openid) <CreateTime>123456789</CreateTime> //消息創(chuàng)建時(shí)間 <MsgType><![CDATA[event]]></MsgType> //消息類(lèi)型event <Event><![CDATA[SCAN]]></Event> //事件類(lèi)型 event <EventKey><![CDATA[SCENE_VALUE]]></EventKey> //事件key值,是一個(gè)32位無(wú)符號(hào)整數(shù),即創(chuàng)建二維碼時(shí)的二維碼scene_id <Ticket><![CDATA[TICKET]]></Ticket> //二維碼的ticke,可以用來(lái)?yè)Q取二維碼圖片 </xml>
3.3.2 我們要做些什么
我們需要在自己填寫(xiě)的URL接口中接收這個(gè)事件,然后拿到我們需要的東西做我們想干的事兒。因?yàn)槲乙獙?shí)現(xiàn)的功能比較簡(jiǎn)單,只需要拿到scene_id即可,因?yàn)檫@是我要展示給用戶看的訂單數(shù)據(jù)。下面是我寫(xiě)的接收和處理部分,比較簡(jiǎn)單,主要看一下應(yīng)該怎么接收微信推送的事件:
public function urlRedirect(){ $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = (string)$postObj->FromUserName; $EventKey = trim((string)$postObj->EventKey); $keyArray = explode("_", $EventKey); if (count($keyArray) == 1){ //已關(guān)注者掃描 $this->sendMessage($fromUsername, $EventKey); }else{ //未關(guān)注者關(guān)注后推送事件 $this->sendMessage($fromUsername, $keyArray[1]); } }
我沒(méi)有使用其他參數(shù),只是根據(jù)不同的推送事件拿到我想要的訂單ID,然后這時(shí)候其實(shí)相當(dāng)于你在這里用公眾號(hào)的客服在跟掃碼的這個(gè)用戶對(duì)話,上段代碼中調(diào)用的sendMessage()是使用客戶賬號(hào)給掃碼用戶發(fā)送一個(gè)圖文消息,因?yàn)槲以谀胹cen_id的同時(shí)也拿到了用戶的openid,可以利用這個(gè)給用戶發(fā)送消息。
下面是sendMessage()方法:
//給用戶發(fā)送圖文消息,點(diǎn)擊跳轉(zhuǎn)到報(bào)價(jià)頁(yè)面 public function sendMessage($openid,$orderId){ $url = str_replace('##TOKEN##', getWechatAccessToken(), C('WECHAT_SEND_MESSAGE')); $redirectUrl = str_replace("##ORDERID##", $orderId, str_replace("##OPENID##", $openid, C('WECHAT_REDIRECT_URL_PRE'))); $orderInfo = M('order')->where(array('orderid' => $orderId))->field(array('totalMoney', 'savedMoney', 'roomarea'))->find(); $description = str_replace("##ROOMAREA##", intval($orderInfo['roomarea'] * 1.25), C('WECHAT_MESSAGE_BRIEF')); $description = str_replace("##TOTALBUDGET##", $orderInfo['totalMoney'], $description); $description = str_replace("##MARKETBUDGET##", $orderInfo['totalMoney']+$orderInfo['savedMoney'], $description); $description = str_replace("##SAVEMONEY##", $orderInfo['savedMoney'], $description); $dataStr = '{"touser":"' . $openid . '","msgtype":"news","news":{"articles":[{"title":"' . C('WECHAT_MESSAGE_TITLE') . '","description":"' . $description . '","url":"' . $redirectUrl . '","picurl":"' . C('WECHAT_MESSAGE_PICURL') . '""}]}}'; api_notice_increment($url, $dataStr); }
其中 C('WECHAT_SEND_MESSAGE') = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=##TOKEN##' 至于下面的一大段str_replace,就是在組給用戶發(fā)送的文字而已,需要注意$dataStr的格式,這里面要求JSON字符串比較嚴(yán)格,必須所有的字符串都用雙引號(hào)括起來(lái)。微信接口對(duì)POST參數(shù)的限制真心嚴(yán)格。
下面是微信公眾平臺(tái)開(kāi)發(fā)者文檔中要求發(fā)送圖文消息的POST data格式:
{ "touser":"OPENID", "msgtype":"news", "news":{ "articles": [ { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" }, { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" } ] } }
其中url是用戶點(diǎn)擊這個(gè)消息之后打開(kāi)的地址,這個(gè)時(shí)候我就組了一個(gè)自己網(wǎng)站的地址,是一個(gè)get請(qǐng)求地址,里面攜帶參數(shù)是用戶的openid和訂單id,這樣用戶點(diǎn)擊開(kāi)圖文消息就可以看到自己剛才下單的內(nèi)容了,因?yàn)樾枰诰W(wǎng)頁(yè)上展示用戶的微信頭像和昵稱,所以我把openid也放到參數(shù)里,在頁(yè)面加載前先拿到用戶的個(gè)人信息和訂單數(shù)據(jù),再展示網(wǎng)頁(yè)。這樣流程:用戶未登錄下單 -> 生成微信二維碼 -> 用戶掃碼關(guān)注公眾號(hào) -> 查看訂單詳細(xì)信息 就完成了。而且因?yàn)檫@個(gè)圖文消息打開(kāi)后的鏈接攜帶的參數(shù)是這個(gè)用戶的額openid和其下單的訂單ID,不管分享到哪兒,用什么瀏覽器打開(kāi)都是可以訪問(wèn)的,且展示的也是這個(gè)用戶的頭像和昵稱信息,這也是我要實(shí)現(xiàn)的一個(gè)效果。
以上是詳解php微信開(kāi)髮帶參數(shù)二維碼的使用說(shuō)明的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)