亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) 微信小程式 微信開(kāi)發(fā) 詳解php微信開(kāi)髮帶參數(shù)二維碼的使用說(shuō)明

詳解php微信開(kāi)髮帶參數(shù)二維碼的使用說(shuō)明

Mar 16, 2017 pm 03:00 PM

這篇文章主要為大家詳解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)證成功了。

詳解php微信開(kāi)髮帶參數(shù)二維碼的使用說(shuō)明

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[&#39;PUBLIC_WECHAT_ACCESSTOKEN&#39;][&#39;conf_value&#39;];
 }else{         //access_token過(guò)期,重新獲取
  $baseUrl = C(&#39;WECHAT_PUBLIC_GET_ACCESS_TOKEN&#39;);
  $url = str_replace("##APPSECRET##", $wechatInfo[&#39;PUBLIC_WECHAT_APPSECRET&#39;][&#39;conf_value&#39;], str_replace("##APPID##", $wechatInfo[&#39;PUBLIC_WECHAT_APPID&#39;][&#39;conf_value&#39;], $baseUrl));
  $result = file_get_contents($url);
  $result = json_decode($result, true);

  if (array_key_exists(&#39;errorcode&#39;, $result)){  //失敗重試一次
   return false;
  }else{
   M(&#39;wechat_info&#39;)->where(array(&#39;conf_name&#39; => &#39;PUBLIC_WECHAT_ACCESSTOKEN&#39;))->save(array(&#39;conf_value&#39; => $result[&#39;access_token&#39;]));
   M(&#39;wechat_info&#39;)->where(array(&#39;conf_name&#39; => &#39;PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES&#39;))->save(array(&#39;conf_value&#39; => time()+$result[&#39;expires_in&#39;]-200));
   return $result[&#39;access_token&#39;];
  }
 }
}

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(&#39;WECHAT_PUBLIC_GET_TEMPORARY_TICKET&#39;));
 $qrcode = &#39;{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": &#39;.$orderId.&#39;}}}&#39;;
 $result = api_notice_increment($url, $qrcode);
 $result = json_decode($result, true);
 return urldecode($result[&#39;url&#39;]);
}

其中的方法api_notice_increment() 是我封裝的一個(gè)POST方法函數(shù),我試過(guò)很多POST的方法,可能由於微信介面對(duì)POST方法和參數(shù)的限制比較嚴(yán)格,這個(gè)浪費(fèi)了好久時(shí)間,最後在網(wǎng)上找到了一個(gè)可以使用的封裝好的POST方法,建議大家先自己試試,如果微信回傳錯(cuò)誤嗎,就用這個(gè)吧,起碼我測(cè)試微信這個(gè)介面的時(shí)候用postman測(cè)試回傳的都是錯(cuò)誤,而且一定要用JSON

字串
,一定要是非常嚴(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, &#39;Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)&#39;);
 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, &#39;SimpleXMLElement&#39;, 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(&#39;##TOKEN##&#39;, getWechatAccessToken(), C(&#39;WECHAT_SEND_MESSAGE&#39;));
  $redirectUrl = str_replace("##ORDERID##", $orderId, str_replace("##OPENID##", $openid, C(&#39;WECHAT_REDIRECT_URL_PRE&#39;)));
  $orderInfo = M(&#39;order&#39;)->where(array(&#39;orderid&#39; => $orderId))->field(array(&#39;totalMoney&#39;, &#39;savedMoney&#39;, &#39;roomarea&#39;))->find();
  $description = str_replace("##ROOMAREA##", intval($orderInfo[&#39;roomarea&#39;] * 1.25), C(&#39;WECHAT_MESSAGE_BRIEF&#39;));
  $description = str_replace("##TOTALBUDGET##", $orderInfo[&#39;totalMoney&#39;], $description);
  $description = str_replace("##MARKETBUDGET##", $orderInfo[&#39;totalMoney&#39;]+$orderInfo[&#39;savedMoney&#39;], $description);
  $description = str_replace("##SAVEMONEY##", $orderInfo[&#39;savedMoney&#39;], $description);
  $dataStr = &#39;{"touser":"&#39; . $openid . &#39;","msgtype":"news","news":{"articles":[{"title":"&#39; . C(&#39;WECHAT_MESSAGE_TITLE&#39;) .
   &#39;","description":"&#39; . $description . &#39;","url":"&#39; . $redirectUrl . &#39;","picurl":"&#39; . C(&#39;WECHAT_MESSAGE_PICURL&#39;) . &#39;""}]}}&#39;;
  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)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門(mén)話題

Laravel 教程
1597
29
PHP教程
1488
72