中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

微信開發(fā)—帶參數(shù)二維碼的使用方法-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)微信開發(fā)—帶參數(shù)二維碼的使用方法的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括茶陵網(wǎng)站建設(shè)、茶陵網(wǎng)站制作、茶陵網(wǎng)頁制作以及茶陵網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,茶陵網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到茶陵省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

1 接入

首先進(jìn)入微信公眾號 -> 基本配置

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

微信開發(fā)—帶參數(shù)二維碼的使用方法

2 帶參數(shù)二維碼的作用

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

上面是我是怎么使用的,下面介紹一下整個(gè)交互的流程:

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

3 具體開發(fā)過程

3.1 獲取access_token

這個(gè)access_token是我們程序調(diào)用微信接口的憑證,目前的有效期是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是我們公眾號的APPID和APPSECRET,在微信公眾號 -> 基本配置中可以查到,調(diào)用成功會返回如下JSON數(shù)據(jù):

{"access_token":"ACCESS_TOKEN","expires_in":7200}

其中access_token就是調(diào)用接口憑證,expire_in是token有效時(shí)間。

我本人是把a(bǔ)ccess_token存在數(shù)據(jù)庫中,同時(shí)保存過期時(shí)間,然后封裝公用函數(shù)  getWechatAccessToken()  ,每次先檢查access_token是否過期,如果過期則重新獲取,否則直接使用數(shù)據(jù)庫保存的access_token即可,我忘了在哪兒看加過,這個(gè)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['PUBLIC_WECHAT_ACCESSTOKEN']['conf_value'];
    }else{                                  //access_token過期,重新獲取
        $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è)之后,我們每次就可以安心的使用了。

3.2 創(chuàng)建臨時(shí)二維碼

3.2.1 獲取ticket

    請求方式: 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是二維碼的有效時(shí)間,最多為30天,action_name臨時(shí)二維碼的話固定就是QR_SCENE,scene_id即我們自定義參數(shù),是個(gè)32位非0整數(shù),我在應(yīng)用中把它設(shè)為訂單的ID,微信服務(wù)器推送事件的時(shí)候會把這個(gè)值返回給我們設(shè)置的接口中,然后我會根據(jù)這個(gè)值去拿相應(yīng)的訂單數(shù)據(jù)展示在網(wǎng)頁上,這是后話。

下面是封裝的生成臨時(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']);
}

其中的方法  api_notice_increment()  是我封裝的一個(gè)POST方法函數(shù),我試過很多POST的方法,可能由于微信接口對POST方法和參數(shù)的限制比較嚴(yán)格,這個(gè)浪費(fèi)了好久時(shí)間,最后在網(wǎng)上找到了一個(gè)可以使用的封裝好的POST方法,建議大家先自己試試,如果微信返回錯誤嗎,就用這個(gè)吧,起碼我測試微信這個(gè)接口的時(shí)候用postman測試返回的都是錯誤,而且一定要用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, '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í)就是微信接口鏈接:

C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##

這個(gè)接口的返回值是:

{"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的值,然后利用這個(gè)url的值生成二維碼存在本地即可。PHP生成二維碼可以使用phpqrcode,挺好用的。下一步也大致提一下:

3.2.2 獲取二維碼地址

 請求方式: GET
   接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET

這個(gè)接口的返回值是一張圖片,可以直接展示或者下載,我們有具體使用過,所以也不知道應(yīng)該怎么展示。

3.3 用戶掃描二維碼之后發(fā)生的事情

3.3.1 掃描后發(fā)生了什么

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

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

用戶未關(guān)注時(shí),進(jìn)行關(guān)注后的事件推送
<xml><ToUserName><![CDATA[toUser]]></ToUserName>        
//開發(fā)者微信號<FromUserName><![CDATA[FromUser]]></FromUserName>       
//發(fā)送者賬號(openid)<CreateTime>123456789</CreateTime>                
//消息創(chuàng)建時(shí)間(整型)<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)注時(shí)的事件推送

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

3.3.2 我們要做些什么

我們需要在自己填寫的URL接口中接收這個(gè)事件,然后拿到我們需要的東西做我們想干的事兒。因?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, '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]);
        }
    }

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

下面是 sendMessage() 方法:

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

感謝各位的閱讀!關(guān)于“微信開發(fā)—帶參數(shù)二維碼的使用方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

名稱欄目:微信開發(fā)—帶參數(shù)二維碼的使用方法-創(chuàng)新互聯(lián)
分享地址:http://www.rwnh.cn/article16/ceeddg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站定制網(wǎng)站、網(wǎng)站設(shè)計(jì)公司App開發(fā)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
云梦县| 西城区| 昭觉县| 那坡县| 从化市| 仪陇县| 富顺县| 万宁市| 章丘市| 德兴市| 南陵县| 绥化市| 大庆市| 榆社县| 定襄县| 龙山县| 济源市| 那曲县| 广灵县| 科技| 溧水县| 沙湾县| 军事| 松潘县| 杨浦区| 上饶市| 金秀| 山东省| 牡丹江市| 金平| 越西县| 乃东县| 吴江市| 巴中市| 文昌市| 东港市| 磐石市| 朝阳县| 肥乡县| 留坝县| 南岸区|