国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

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

Mar 16, 2017 pm 03:00 PM

這篇文章主要為大家詳解php微信開髮參數(shù)二維碼的使用說明,有興趣的夥伴們可以參考一下

最近做微信PC端網(wǎng)頁微信相關(guān)功能的開發(fā),從一個新手的角度來說,微信公眾號的文檔還是不好理解的,網(wǎng)上找的帖子大都也都基本上是複製微信公眾平臺上給的文檔,開發(fā)微信帶參數(shù)二維碼過程中還是遇到不少坑的,在此把我的開發(fā)過程比較詳細(xì)的記錄下,希望對大家有幫助。

我本次開發(fā)使用的是認(rèn)證服務(wù)號。

1 接入
首先進(jìn)入微信公眾號-> 基本配置?
下面是基本配置的頁面,在URL中填寫伺服器位址,這個位址就是接受微信推送事件的一個介面,我是使用thinkPHP框架開發(fā)的程序,在其中一個Module(Decoration)的Action目錄下新建一個類,例如叫: WechatAction.class.php ,在該Action中新建一個public方法,例如叫: URLRedirect () ,那麼在這個URL中填寫的就是http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect ,然後填入Token,Token隨意填,EncodingAESKey要不要都行,然後點(diǎn)擊確認(rèn),微信會往這個URL上發(fā)送一個get請求,裡麵包含很多參數(shù),其中大部分都是讓我們自己核對這次訪問是不是微信伺服器請求的,我自己沒有驗(yàn)證,他的要求是如果我們核對成功,即原樣回傳get請求中的一個參數(shù)echostr,這裡的回傳不是return,也不是ajaxReturn,而使用echo,如果用thinkPHP開發(fā)的話,直接使用echo I('echostr'); 即可。然後接口即驗(yàn)證成功了。

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

2 帶參數(shù)二維碼的作用
#微信的帶參數(shù)二維碼有兩種,一種是臨時二維碼,一種是永久二維碼,但是永久二維碼的生成是有個數(shù)限制的,我這次要實(shí)現(xiàn)的功能是用戶未登錄的情況下在網(wǎng)站上使用產(chǎn)品,比如獲得某商品的詳細(xì)報(bào)價,但是又不想註冊,然而又想保存這個報(bào)價單,這個時候網(wǎng)頁可以生成一張二維碼,用戶只要用微信掃一掃這個二維碼,官方公眾號就會給這個用戶發(fā)送一天圖文消息,圖文訊息點(diǎn)開後就是用戶剛獲得的報(bào)價單,而且可以隨時點(diǎn)擊查看並且分享給朋友進(jìn)行比價。所以臨時二維碼即可正常使用。
上面是我是怎麼使用的,下面介紹一下整個互動的流程

當(dāng)用戶掃描這個二維碼,如果用戶關(guān)注了公眾號,用戶會直接進(jìn)入與公眾號的會話頁面,微信伺服器會給我們在上一步設(shè)定的伺服器URL中推送一條訊息,其中可以攜帶一個我們自訂的參數(shù)。如果使用者未追蹤公眾號,使用者首先會跳到公眾號追蹤頁面,使用者點(diǎn)擊追蹤後,會直接進(jìn)入公眾號的會話頁面,微信伺服器這時也會為我們設(shè)定的URL推送一個事件訊息,攜帶我們自訂參數(shù),我們可以根據(jù)這個參數(shù)和事件類型做控制下一步動作。

3 特定開發(fā)流程?

3.1 取得access_token
這個access_token是我們程式呼叫微信介面的憑證,目前的有效期限是7200秒,所以我們需要定時更新 access_token。
取得方法:
方法: GET
url :https://api.weixin.qq.com/ cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
其中的參數(shù)APPID和APPSECRET是我們公眾號的APPID和APPSECRET,在微信公眾號-> 基本配置中可以查到,調(diào)用成功會回傳如下JSON資料:
?{"access_token":"ACCESS_TOKEN","expires_in":7200}

##其中access_token就是呼叫介面憑證,expire_in是token有效時間。
我自己是把a(bǔ)ccess_token存在資料庫中,同時保存過期時間,然後封裝公用函數(shù) getWechatAccessToken() ,每次先檢查access_token是否過期,如果過期則重新獲取,否則直接使用資料庫儲存的access_token即可,我忘了在哪裡看加過,這個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ù)庫相應(yīng)設(shè)置

 if (time() < $expireTime){    //access_token未過期
  return $wechatInfo[&#39;PUBLIC_WECHAT_ACCESSTOKEN&#39;][&#39;conf_value&#39;];
 }else{         //access_token過期,重新獲取
  $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

封裝好這個之後,我們每次就可以安心的使用了。

.2 建立臨時二維碼

#3.2.1 取得ticket3

#請求方式: 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即我們在3.1中取得的access_token,post資料中expire_seconds是二維碼的有效時間,最多30天,action_name臨時二維碼的話固定就是QR_SCENE,scene_id即我們自訂參數(shù),是個32位非0整數(shù)

你訂單的ID,微信伺服器推送事件的時候會把這個值回傳給我們設(shè)定的介面中,然後我會根據(jù)這個值去拿對應(yīng)的訂單資料展示在網(wǎng)頁上,這是後話。

以下是封裝的產(chǎn)生臨時二維碼的方法:?
#

//創(chuàng)建臨時二維碼
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() 是我封裝的一個POST方法函數(shù),我試過很多POST的方法,可能由於微信介面對POST方法和參數(shù)的限制比較嚴(yán)格,這個浪費(fèi)了好久時間,最後在網(wǎng)上找到了一個可以使用的封裝好的POST方法,建議大家先自己試試,如果微信回傳錯誤嗎,就用這個吧,起碼我測試微信這個介面的時候用postman測試回傳的都是錯誤,而且一定要用JSON

字串
,一定要是非常嚴(yán)格的JSON字串。下面是這個方法:?

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() 中有一個在###設(shè)定檔###中的參數(shù)給大家看下,其實(shí)就是微信介面連結(jié):?###C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = ###https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN## ####### #####這個介面的回傳值是:?###{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJVAAIE230,003" \/weixin.qq.com\/ q\/kZgfwMTm72WWPkovabbI"} #########其中ticket是讓我們用來進(jìn)行下一步調(diào)用的憑證,expire_seconds是二維碼的有效期,url是我們產(chǎn)生的二維碼掃描後打開的鏈接。所以如果我們自己實(shí)現(xiàn)了生成二維碼的方法,就不用再進(jìn)行下一步調(diào)用,我本人即在這一步就停止了,直接返回url的值,然後利用這個url的值生成二維碼存在本地即可。 PHP產(chǎn)生二維碼可以使用phpqrcode,挺好用的。下一步也大致提一下:######

3.2.2 獲取二維碼地址
請求方式: GET
接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
這個接口的返回值是一張圖片,可以直接展示或者下載,我們有具體使用過,所以也不知道應(yīng)該怎么展示。

3.3 用戶掃描二維碼之后發(fā)生的事情
3.3.1 掃描后發(fā)生了什么
上面提到了,用戶掃描我們生成的臨時二維碼,如果用戶未關(guān)注公眾號,則首先會跳轉(zhuǎn)到公眾號的關(guān)注頁面,點(diǎn)擊關(guān)注后,會進(jìn)入公眾號的會話頁面,同時會給我們設(shè)置的接口推送一個事件。如果用戶已經(jīng)關(guān)注了,用戶微信會直接跳轉(zhuǎn)到公眾號會話頁面,然后微信服務(wù)器會給我們設(shè)置的接口推送一個事件。

用戶關(guān)注與否微信服務(wù)器給我們推送的事件是差不多的,只是新關(guān)注用戶推送的事件中scene_id前面會加一個前綴。下面是微信公眾平臺文檔的說明:

用戶未關(guān)注時,進(jìn)行關(guān)注后的事件推送

<xml><ToUserName><![CDATA[toUser]]></ToUserName>        //開發(fā)者微信號
<FromUserName><![CDATA[FromUser]]></FromUserName>       //發(fā)送者賬號(openid)
<CreateTime>123456789</CreateTime>                //消息創(chuàng)建時間(整型)
<MsgType><![CDATA[event]]></MsgType>              //消息類型 event
<Event><![CDATA[subscribe]]></Event>              //事件類型(subscribe)
<EventKey><![CDATA[qrscene_123123]]></EventKey>        //事件KEY值,qrscene_為前綴,后面為二維碼參數(shù)值
<Ticket><![CDATA[TICKET]]></Ticket>               //二維碼ticke值,可以用來換取二維碼圖片
</xml>

用戶已關(guān)注時的事件推送

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>        //開發(fā)者微信號
<FromUserName><![CDATA[FromUser]]></FromUserName>     //發(fā)送者賬號(openid)
<CreateTime>123456789</CreateTime>             //消息創(chuàng)建時間
<MsgType><![CDATA[event]]></MsgType>     //消息類型event
<Event><![CDATA[SCAN]]></Event>               //事件類型 event
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>   //事件key值,是一個32位無符號整數(shù),即創(chuàng)建二維碼時的二維碼scene_id
<Ticket><![CDATA[TICKET]]></Ticket>      //二維碼的ticke,可以用來換取二維碼圖片
</xml>

3.3.2 我們要做些什么

我們需要在自己填寫的URL接口中接收這個事件,然后拿到我們需要的東西做我們想干的事兒。因?yàn)槲乙獙?shí)現(xiàn)的功能比較簡單,只需要拿到scene_id即可,因?yàn)檫@是我要展示給用戶看的訂單數(shù)據(jù)。下面是我寫的接收和處理部分,比較簡單,主要看一下應(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]);
  }
 }

我沒有使用其他參數(shù),只是根據(jù)不同的推送事件拿到我想要的訂單ID,然后這時候其實(shí)相當(dāng)于你在這里用公眾號的客服在跟掃碼的這個用戶對話,上段代碼中調(diào)用的sendMessage()是使用客戶賬號給掃碼用戶發(fā)送一個圖文消息,因?yàn)槲以谀胹cen_id的同時也拿到了用戶的openid,可以利用這個給用戶發(fā)送消息

下面是sendMessage()方法:

//給用戶發(fā)送圖文消息,點(diǎn)擊跳轉(zhuǎn)到報(bào)價頁面
 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)格,必須所有的字符串都用雙引號括起來。微信接口對POST參數(shù)的限制真心嚴(yán)格。

下面是微信公眾平臺開發(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)擊這個消息之后打開的地址,這個時候我就組了一個自己網(wǎng)站的地址,是一個get請求地址,里面攜帶參數(shù)是用戶的openid和訂單id,這樣用戶點(diǎn)擊開圖文消息就可以看到自己剛才下單的內(nèi)容了,因?yàn)樾枰诰W(wǎng)頁上展示用戶的微信頭像和昵稱,所以我把openid也放到參數(shù)里,在頁面加載前先拿到用戶的個人信息和訂單數(shù)據(jù),再展示網(wǎng)頁。這樣流程:用戶未登錄下單 -> 生成微信二維碼 -> 用戶掃碼關(guān)注公眾號 -> 查看訂單詳細(xì)信息 就完成了。而且因?yàn)檫@個圖文消息打開后的鏈接攜帶的參數(shù)是這個用戶的額openid和其下單的訂單ID,不管分享到哪兒,用什么瀏覽器打開都是可以訪問的,且展示的也是這個用戶的頭像和昵稱信息,這也是我要實(shí)現(xiàn)的一個效果。


以上是詳解php微信開髮帶參數(shù)二維碼的使用說明的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72