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

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

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

Mar 16, 2017 pm 03:00 PM

這篇文章主要為大家詳解php微信開發(fā)帶參數(shù)二維碼的使用說明,感興趣的小伙伴們可以參考一下

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

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

1 接入
首先進(jìn)入微信公眾號 -> 基本配置?
下面是基本配置的頁面,在URL中填寫服務(wù)器地址,這個地址就是接受微信推送事件的一個接口,我是使用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ù),其中大部分都是讓我們自己核對這次訪問是不是微信服務(wù)器請求的,我自己沒有驗(yàn)證,他的要求是如果我們核對成功,即原樣返回get請求中的一個參數(shù)echostr,這里的返回不是return,也不是ajaxReturn,而使用echo,如果用thinkPHP開發(fā)的話,直接使用 echo I('echostr'); 即可。然后接口即驗(yàn)證成功了。?

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

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

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

3 具體開發(fā)過程?

3.1 獲取access_token
這個access_token是我們程序調(diào)用微信接口的憑證,目前的有效期是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數(shù)據(jù):
?{"access_token":"ACCESS_TOKEN","expires_in":7200}

其中access_token就是調(diào)用接口憑證,expire_in是token有效時間。
我本人是把a(bǔ)ccess_token存在數(shù)據(jù)庫中,同時保存過期時間,然后封裝公用函數(shù) getWechatAccessToken() ,每次先檢查access_token是否過期,如果過期則重新獲取,否則直接使用數(shù)據(jù)庫保存的access_token即可,我忘了在哪兒看加過,這個access_token每天的獲取次數(shù)應(yīng)該是有限制的。下面是 getWechatAccessToken()? 的具體實(shí)現(xiàn):

//獲取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 創(chuàng)建臨時二維碼

3.2.1 獲取ticket3

請求方式: POST
接口:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST數(shù)據(jù): {"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
接口URL中的TOKEN即我們在3.1中獲取的access_token,post數(shù)據(jù)中expire_seconds是二維碼的有效時間,最多為30天,action_name臨時二維碼的話固定就是QR_SCENE,scene_id即我們自定義參數(shù),是個32位非0整數(shù),我在應(yīng)用中把它設(shè)為訂單的ID,微信服務(wù)器推送事件的時候會把這個值返回給我們設(shè)置的接口中,然后我會根據(jù)這個值去拿相應(yīng)的訂單數(shù)據(jù)展示在網(wǎng)頁上,這是后話。

下面是封裝的生成臨時二維碼的方法:

//創(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í)就是微信接口鏈接:
C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##

這個接口的返回值是:
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}

其中ticket是讓我們用來進(jìn)行下一步調(diào)用的憑證,expire_seconds是二維碼的有效期,url是我們生成的二維碼掃描后打開的鏈接。所以如果我們自己實(shí)現(xiàn)了生成二維碼的方法,就不用再進(jìn)行下一步調(diào)用,我本人即在這一步就停止了,直接返回url的值,然后利用這個url的值生成二維碼存在本地即可。PHP生成二維碼可以使用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)到報價頁面
 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微信開發(fā)帶參數(shù)二維碼的使用說明的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系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脫衣機(jī)

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