首頁 微信小程式 微信開發 微信開發帶參數二維碼的實例詳解

微信開發帶參數二維碼的實例詳解

May 03, 2017 am 10:42 AM

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

  我本次開發使用的是認證服務號碼。

1 存取

#  先進入微信公眾號碼->基本設定 

  下面是基本配置的頁面,在URL中填寫伺服器位址,這個位址就是接受微信推送事件的一個接口,我是使用thinkPHP框架開發的程序,在其中一個Module(Decoration)的Action目錄下新建一個類,例如叫:  

WechatAction.class.php  ,在該Action中新建一個public方法,例如叫:  URLRedirect()

  ,那麼在這個URL中填寫的就是  

http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect  ,然後填寫Token,Token隨意填,EncodingAESKey要不要都行,然後點選確認,微信會往這個URL上發送一個get請求,裡麵包含很多參數,其中大部分都是讓我們自己核對這次訪問是不是微信伺服器請求的,我自己沒有驗證,他的要求是如果我們核對成功,即原樣返回get請求中的一個參數echostr,這裡的回傳不是return,也不是ajaxReturn,而使用echo,如果用thinkPHP開發的話,直接使用  echo I('echostr');  即可。然後接口即驗證成功了。

 

2 帶有參數二維碼的作用

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

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

 

######3 特定開發流程##################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
登入後複製

  其中的參數APPID和APPSECRET是我們公眾號的APPID和APPSECRET,在微信公眾號-> 基本配置中可以查到,呼叫成功會回傳如下JSON資料:

{"access_token":"ACCESS_TOKEN","expires_in":7200}
登入後複製

  其中access_token就是呼叫介面憑證,expire_in是token有效時間。

  我自己是把access_token存在資料庫中,同時儲存過期時間,然後封裝公用函數  getWechatAccessToken()  ,每次先檢查access_token是否過期,如果過期則重新獲取,否則直接使用資料庫保存的access_token即可,我忘了在哪裡看加過,這個access_token每天的獲取次數應該是有限制的。下面是  getWechatAccessToken()   的具體實作:

 1 //获取access_token
 2 function getWechatAccessToken(){ 3     $wechatInfo = M('wechat_info')->select(); 4     $wechatInfo = array_reduce($wechatInfo, create_function('$result, $v', '$result[$v["conf_name"]] = $v;return $result;')); 5     $expireTime = $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES']['conf_value'];                             //前面不用管,是我数据库相应设置
 6 
 7     if (time() < $expireTime){              //access_token未过期
 8         return $wechatInfo[&#39;PUBLIC_WECHAT_ACCESSTOKEN&#39;][&#39;conf_value&#39;]; 9     }else{                                  //access_token过期,重新获取10         $baseUrl = C(&#39;WECHAT_PUBLIC_GET_ACCESS_TOKEN&#39;);11         $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));12         $result = file_get_contents($url);13         $result = json_decode($result, true);14 
15         if (array_key_exists(&#39;errorcode&#39;, $result)){        //失败重试一次16             return false;17         }else{18             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;]));19             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));20             return $result[&#39;access_token&#39;];21         }22     }23 }
登入後複製
C(&#39;WECHAT_PUBLIC_GET_ACCESS_TOKEN&#39;) = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
登入後複製

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

3.2 建立臨時二維碼

#3.2.1 取得ticket

#
      请求方式: 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即我們自訂參數,是個32位元非0整數,我在應用程式中把它設為訂單的ID,微信伺服器推送事件的時候會把這個值傳回給我們設定的介面中,然後我會根據這個值去拿對應的訂單資料展示在網頁上,這是後話。

  下面是封裝的產生暫存二維碼的方法:

//创建临时二维码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()  是其中的方法 api_notice_increment()

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

 中有一個在設定檔中的參數給大家看下,其實就是微信介面連結:

C(&#39;WECHAT_PUBLIC_GET_TEMPORARY_TICKET&#39;) = 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是讓我們用來進行下一步呼叫的憑證,expire_seconds是二維碼的有效期,url是我們產生的二維碼掃描後打開的連結。所以如果我們自己實現了生成二維碼的方法,就不用再進行下一步調用,我本人即在這一步就停止了,直接返回url的值,然後利用這個url的值生成二維碼存在本地即可。 PHP產生二維碼可以使用phpqrcode,挺好用的。下一步也大致提一下:

3.2.2 取得二維碼位址

   请求方式: GET
   接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
登入後複製
 

# 這個介面的回傳值是一張圖片,可以直接展示或下載,我們有具體使用過,所以也不知道該怎麼展示。

3.3 使用者掃描在二維碼之後發生的事情

3.3.1 掃描後發生了什麼

######

  上面提到了,用户扫描我们生成的临时二维码,如果用户未关注公众号,则首先会跳转到公众号的关注页面,点击关注后,会进入公众号的会话页面,同时会给我们设置的接口推送一个事件。如果用户已经关注了,用户微信会直接跳转到公众号会话页面,然后微信服务器会给我们设置的接口推送一个事件。

  用户关注与否微信服务器给我们推送的事件是差不多的,只是新关注用户推送的事件中scene_id前面会加一个前缀。下面是微信公众平台文档的说明:

 用户未关注时,进行关注后的事件推送
登入後複製
<xml><ToUserName><![CDATA[toUser]]></ToUserName>        //开发者微信号<FromUserName><![CDATA[FromUser]]></FromUserName>       //发送者账号(openid)<CreateTime>123456789</CreateTime>                //消息创建时间(整型)<MsgType><![CDATA[event]]></MsgType>              //消息类型 event<Event><![CDATA[subscribe]]></Event>              //事件类型(subscribe)<EventKey><![CDATA[qrscene_123123]]></EventKey>        //事件KEY值,qrscene_为前缀,后面为二维码参数值<Ticket><![CDATA[TICKET]]></Ticket>               //二维码ticke值,可以用来换取二维码图片</xml>
登入後複製

  用户已关注时的事件推送

 <xml><ToUserName><![CDATA[toUser]]></ToUserName>        //开发者微信号<FromUserName><![CDATA[FromUser]]></FromUserName>     //发送者账号(openid)<CreateTime>123456789</CreateTime>             //消息创建时间<MsgType><![CDATA[event]]></MsgType>                    //消息类型event<Event><![CDATA[SCAN]]></Event>               //事件类型 event<EventKey><![CDATA[SCENE_VALUE]]></EventKey>            //事件key值,是一个32位无符号整数,即创建二维码时的二维码scene_id<Ticket><![CDATA[TICKET]]></Ticket>                     //二维码的ticke,可以用来换取二维码图片</xml>
登入後複製

3.3.2 我们要做些什么

  我们需要在自己填写的URL接口中接收这个事件,然后拿到我们需要的东西做我们想干的事儿。因为我要实现的功能比较简单,只需要拿到scene_id即可,因为这是我要展示给用户看的订单数据。下面是我写的接收和处理部分,比较简单,主要看一下应该怎么接收微信推送的事件:

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){         //已关注者扫描
            $this->sendMessage($fromUsername, $EventKey);
        }else{                   //未关注者关注后推送事件
            $this->sendMessage($fromUsername, $keyArray[1]);
        }
    }
登入後複製

  我没有使用其他参数,只是根据不同的推送事件拿到我想要的订单ID,然后这时候其实相当于你在这里用公众号的客服在跟扫码的这个用户对话,上段代码中调用的sendMessage()是使用客户账号给扫码用户发送一个图文消息,因为我在拿scen_id的同时也拿到了用户的openid,可以利用这个给用户发送消息。

  下面是 sendMessage() 方法:

//给用户发送图文消息,点击跳转到报价页面
    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,就是在组给用户发送的文字而已,需要注意$dataStr的格式,这里面要求JSON字符串比较严格,必须所有的字符串都用双引号括起来。微信接口对POST参数的限制真心严格。

  下面是微信公众平台开发者文档中要求发送图文消息的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是用户点击这个消息之后打开的地址,这个时候我就组了一个自己网站的地址,是一个get请求地址,里面携带参数是用户的openid和订单id,这样用户点击开图文消息就可以看到自己刚才下单的内容了,因为需要在网页上展示用户的微信头像和昵称,所以我把openid也放到参数里,在页面加载前先拿到用户的个人信息和订单数据,再展示网页。这样流程:用户未登录下单 -> 生成微信二维码 -> 用户扫码关注公众号 -> 查看订单详细信息 就完成了。而且因为这个图文消息打开后的链接携带的参数是这个用户的额openid和其下单的订单ID,不管分享到哪儿,用什么浏览器打开都是可以访问的,且展示的也是这个用户的头像和昵称信息,这也是我要实现的一个效果。

以上是微信開發帶參數二維碼的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何使用 PHP 實作動態生成二維碼功能 如何使用 PHP 實作動態生成二維碼功能 Sep 05, 2023 pm 05:45 PM

如何使用PHP實現動態生成二維碼功能二維碼(QRCode)被廣泛應用於各個領域,它可以儲存大量資訊且易於掃描。在網頁應用程式中,我們經常需要動態產生二維碼,以便提供使用者方便的操作方式。本文將介紹如何使用PHP實作動態產生二維碼的功能。一、安裝和設定PHPQRCode程式庫為了方便產生二維碼,我們可以使用PHPQRCode函式庫。首先,我們需要

wps製作一個二維碼的操作方法 wps製作一個二維碼的操作方法 Mar 28, 2024 am 09:41 AM

1.開啟軟體,進入wps文字操作介面。 2、在該介面內找到插入選項。 3.點選插入選項,在其編輯工具區找到二維碼選項。 4.點選二維碼選項,彈出二維碼對話框。 5.在左側選擇文字選項,在文字方塊裡就能輸入我們的資訊了。 6.在右側可以設定二維碼的形狀和二維碼的顏色。

如何在 iPhone 上掃描二維碼 如何在 iPhone 上掃描二維碼 May 04, 2023 am 11:46 AM

先決條件:在您的iPhone上啟用二維碼掃描預設情況下,所有運行iOS11的iPhone都啟用了掃描QR碼的功能。因此,您需要確保您的iPhone已更新到最新的可用版本,至少iOS11才能能夠原生掃描QR碼。在繼續執行以下任何方法之前,您必須確保在iPhone上啟用了該功能。您可以透過開啟「設定」應用程式並點選「相機」部分在iPhone上啟用QR碼掃描。在下一個畫面上,啟用「掃描QR碼」切換。這應該會打開該功能,以便您可以使用以下任何方法掃描並從QR碼中提取

如何使用PHP產生批次的二維碼? 如何使用PHP產生批次的二維碼? Aug 25, 2023 pm 04:33 PM

如何使用PHP產生批次的二維碼?隨著網路科技的不斷發展,二維碼已經成為了非常普遍的訊息傳遞工具。二維碼可以儲存大量的信息,並且可以快速掃描識別,因此在各行各業中得到了廣泛的應用。在很多情況下,我們需要大量產生大量的二維碼,例如用於商品標籤、活動門票等。 PHP是一種廣泛應用於web開發的腳本語言,具有靈活、簡單易用的特性。下面,我們將介紹如何使用PHP生

如何使用PHP產生帶有時間限制的二維碼? 如何使用PHP產生帶有時間限制的二維碼? Aug 26, 2023 pm 04:34 PM

如何使用PHP產生帶有時間限制的二維碼?隨著行動支付和電子門票的普及,二維碼成為了一種常見的技術。在許多場景中,我們可能需要產生一種帶有時間限制的二維碼,即使在一定時間後,該二維碼也會失效。本文將介紹如何使用PHP產生具有時間限制的二維碼,並提供程式碼範例供參考。安裝PHPQRCode函式庫要使用PHP產生二維碼,我們需要先安裝PHPQRCode函式庫。這個庫

企業微信二維碼載入不出來怎麼辦? 企業微信二維碼載入不出來怎麼辦? Mar 14, 2024 pm 10:46 PM

  企業微信二維碼載入不出來怎麼辦?當我們在登入企業微信電腦版的時候發現二維碼載入不出來無法顯示的時候該怎麼解決,這裡小編就給大家詳細介紹一下企業微信二維碼加載不出來的解決方法,有需要的小夥伴快來看看!  方法一、網路原因  1、可能是網速緩慢,導致載入緩慢從而無法顯示,可以斷開之後重新連接。  2、檢查電腦本身的網絡問題,看看是否連接上了網絡,可以重新啟動一下網絡設備。  方法二、維護更新  可能由於企業微信版本過低,導致無法產生二維碼,可以將軟體更新升級成最新版本。  方法三、防火牆  1

如何使用Vue實現二維碼生成 如何使用Vue實現二維碼生成 Nov 07, 2023 am 09:57 AM

二維碼是現代社會中廣泛使用的一種資訊編碼方式,Vue是一款前端框架,如何使用Vue實現二維碼生成?一、了解二維碼產生的原理二維碼的生成原理是將一段文字或一段URL位址轉換成一張圖片,在這張圖片中編碼了文字或URL位址的資訊。二維碼產生可以使用第三方函式庫,本文介紹如何使用Qrcode.js函式庫來產生二維碼。 Qrcode.js是一款輕量、無依賴的二維碼產生函式庫。二

PHP編碼小技巧:如何產生具有防偽驗證功能的二維碼? PHP編碼小技巧:如何產生具有防偽驗證功能的二維碼? Aug 17, 2023 pm 02:42 PM

PHP編碼小技巧:如何產生具有防偽驗證功能的二維碼?隨著電子商務和互聯網的發展,二維碼越來越被廣泛應用於各行各業。而在使用二維碼的過程中,為了確保產品的安全性和防止偽造,為二維碼添加防偽驗證功能是十分重要的一環。本文將介紹如何使用PHP產生具有防偽驗證功能的二維碼,並附上對應程式碼範例。在開始之前,我們需要準備以下幾個必要的工具和函式庫:PHPQRCode:PHP

See all articles