因公司需要,開發一個微信藍牙設備連接公眾號。故把微信公眾號開發流程,微信硬件開發流程摸索瞭一遍,雖然中間掉坑好多次,但最終還是完成瞭公眾號的開發。h5+php實現前臺到後臺的編程。
1 既然是公眾號開發,首先得去申請一個公眾號。要成為公眾號開發者,還得去申請開發者,關鍵是特麼個人還不能申請,得企業才能申請。這有點坑瞭。申請好瞭公眾號開發者後登陸公眾號平臺
添加設備功能後,在設備功能頁面點擊添加產品。
添加產品過程中,會有個二維碼的選擇,型號二維碼和設備二維碼。選擇型號二維碼後微信公眾號會自動生成一個型號二維碼,利用這個型號二維碼後面就會通過這個型號二維碼掃描發現周邊已經授權過的藍牙設備。選擇設備二維碼則自己利用微信硬件開發文檔提供的獲取設備二維碼的接口,調用接口生成一個url網址,利用這個網站隨便用一個生成二維碼的工具生成一個二維碼,再用微信掃一掃,就會調到公眾號的綁定設備的接口。
添加產品完成後,每個產品會有個產品編號,這個產品編號後面調用微信硬件開發的授權接口時需要用到。這個時候就可以做開發調試瞭。開發調試授權的接口隻能調用100次,但這在調試時已經足夠用瞭。但是要正式生產則需要更多授權,這個時候就要去申請認證瞭,一般認證通過會在2-3個工作日就會通知。認證完成後可以申請更多的授權配額。
2 後臺伺服器的搭建。
後臺伺服器可以自己去網上買。還有伺服器的域名。等下要和微信伺服器通信起來,需要填寫一個URL。藍牙設備和微信伺服器通信,微信伺服器和這個填寫的URL通信。
這裡剛開始買的是阿裡雲的伺服器,但是發現阿裡雲的伺服器域名地址隻能測試用,放在這裡沒有通過。用瞭一個國外的免費的伺服器後臺,但還是沒有通過。最後買瞭百度雲的通過瞭。
3 開發調試。
1設備授權。
通過這個接口。就可以獲取一個設備id和設備二維碼。設備id就是以後和設備通信時微信公眾號發送給URL的唯一設備標識碼。設備綁定和解綁,設備和微信公眾號通信,微信公眾號通過設備Id,把設備的通信數據發給前面填寫的URL。
2 授權後綁定設備的mac地址。
調用完這個接口後,在微信公眾號界面,如果檢測到mac地址的設備,公共號就會自動去連接,公眾號標題下面就會顯示連接狀態。
接下來就是開發h5頁面和伺服器後臺的事情瞭。
這裡有個坑就是型號二維碼。若是有個設備被一個產品的型號二維碼授權過瞭之後,則利用其他產品的產品id再去授權型號二維碼授權時,調用授權接口返回的數據都正常。但是掃描時壓根掃描不到設備。(曾經我閱讀微信硬件開發文檔好幾遍,翻遍微信硬件開發論壇好幾次,網上查找微信藍牙開發文章也是翻瞭10幾頁之後都沒找到有人說明過這個問題,後來發瞭封郵件給微信硬件開發頁面上面的一個郵箱,後面真給我回復瞭,說是重復授權會導致授權失敗,真是個大坑啊,文檔上面也不說明)設備二維碼則可以反復授權都沒關心。
還有個坑就是設備連接微信公眾號後,我的伺服器接收不到微信伺服器發來的設備數據。後來在其他手機公眾號上面連接又可以接收的到。不知道這是手機原因還是公眾號的原因。手機型號是vivio max。
還有通信方式就是通過h5 利用微信JS-SDK直接自己掃描連接設備,收發數據都可以通過微信JS提供的接口獲得。這樣子自己可操作性就大些,並且還不受微信硬件開發接口調用頻率的限制。但這種方式更繁瑣些。
我開發的是結合這兩種,掃描連接用微信公眾號自帶的,有個界面要一直獲取設備數據的就利用這種方式去獲取。這裡貼部分關鍵代碼。
首先初始化微信JS調用環境。
這裡是寫你需要調用的函數,由於前面掃描連接操作都交給瞭微信公眾號,所以我這裡隻有接收和發送數據的函數。
在調用JSSDK的時候主要的問題就是wx.config裡面的那些參數設置。參數主要在H5頁面請求一個自己後臺的接口,是在後臺伺服器把參數都設置和生成好,再傳回H5頁面。
<?php include 'lu.php'; header("Access-Control-Allow-Origin: *"); error_reporting(E_ALL ^ E_DEPRECATED); // checkSignature(); /** * 微信js接口簽名 */ $getTicket=true; //如果本地有並且不為空 $jsapi_ticket = file_get_contents("jsapi_ticket.txt"); $time=file_get_contents("jsapi_time.txt"); $time2=time(); $dt=$time2-$time; mlogger("***************time:".$time); mlogger("***************time2:".$time2); mlogger("***************dt:".$dt); if($dt<7200){ mlogger("已有..........jsapi_ticket:".$jsapi_ticket); $getTicket=false; $signature = file_get_contents("signature.txt"); mlogger("signature : ".$signature); mlogger("time :".$time); $data=array(); $data["timestamp"]=$time; $data["signature"]=$signature; $d=json_encode(array('data' => $data)); echo $d; }else{ //如果過期瞭則重新生成 $access_token=getWXToken(); $turl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; $jsapi_data=file_get_contents($turl); mlogger("從伺服器獲取數據..........:".$jsapi_data); $obj = json_decode($jsapi_data); $jsapi_ticket=$obj->ticket; mlogger("..........jsapi_ticket:".$jsapi_ticket); file_put_contents("jsapi_ticket.txt",$jsapi_ticket); file_put_contents("jsapi_time.txt",$time2); $timestamp = $time2; $noncestr ="123"; $url=$_GET["url"]; $tmpArr = array( $jsapi_ticket, $time, $noncestr,$url); $tmpStr = "jsapi_ticket=".$jsapi_ticket."&noncestr=".$noncestr."×tamp=".$timestamp."&url=".$url; mlogger("..........tmpStr:".$tmpStr); $signature = sha1($tmpStr); mlogger("signature :".$signature); mlogger("time :".$timestamp); file_put_contents("signature.txt",$signature); $data=array(); $data["timestamp"]=$timestamp; $data["signature"]=$signature; $d=json_encode(array('data' => $data)); echo $d; } // } function mlogger($content){ // echo "<br>".$content."<br>"; date_default_timezone_set ('PRC'); file_put_contents("log.html", date('Y-m-d H:i:s') . "-----p_signatureUtil----" . $content . "<br>", FILE_APPEND); }; ?>
還要註意點就是解析設備的數據和發送的到設備數據都要經過base64轉換。
隻要和收發數據瞭,那麼開發起來就問題不大瞭。