微信開發今天産品設計了一個非常惡心的功能,手機端H5點選按鈕調用掃一掃,去識别二維碼。
不過有微信的開發文檔,一步一個代碼來的整。
大概分為幾步:
1.首先得有appid和secret——>擷取access_token值(可謂是得access_token得半壁江山啊)
2.根據access_token以GET方式擷取jsapi_ticket(jsapi_ticket有過期時間,2小時必須緩存處理)
3.權限簽名見文檔詳細得很! 微信簽名算法文檔
4.引入官方jweixin-1.6.0.js檔案,以及注意大小寫 注意大小寫 駝峰寫法!!!!
5.開發平台記得配置域名,因為掃一掃需要頁面完全的url,記得添加。
6.簽名錯誤的話,可以去這驗證檢視:驗證簽名
上代碼:
//get方式拼接 擷取token
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
$res = json_decode($this->httpGet($url));
$access_token = $res->access_token;
//擷取ticket
$ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$access_token";
$ticket_res = json_decode($this->httpGet($ticket_url ));
if ($ticket_res->errcode == '0') {
$ticket = $res->ticket;
}
//PHP擷取連結
$url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
//jq擷取url
sign_url=location.href.split('#')[0];
//時間戳
$timestamp = time();
//随機數
$nonceStr = $this->createNonceStr();
// 這裡參數的順序要按照 key 值 ASCII 碼升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
"appId" => $this->appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
JQ代碼 頁面
<script type="text/javascript" src="/static/js/jweixin-1.6.0.js?v=<{$js_version}>"></script>
<script>
//判斷是否是微信浏覽器的函數
function isWeiXin(){
//window.navigator.userAgent屬性包含了浏覽器類型、版本、作業系統類型、浏覽器引擎類型等資訊,這個屬性可以用來判斷浏覽器類型
var ua = window.navigator.userAgent.toLowerCase();
//通過正規表達式比對ua中是否含有MicroMessenger字元串
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
return true;
}else{
return false;
}
}
$("#scan").click(function(){
var sign_url=location.href.split('#')[0];
var is_wx = isWeiXin();
if(!is_wx){
alert('請選擇微信進行操作!');
}
$.ajax({
url:'/sale/wxConfigScan/',
type:"GET",
data:{sign_url:sign_url},
dataType:"json",
async:false,
success:function (res) {
sign=res.Data;
},
error:function () {
// alert('伺服器出錯了!');
}
});
wx.config({
debug: false, // 開啟調試模式,調用的所有api的傳回值會在用戶端alert出來,若要檢視傳入的參數,可以在pc端打開,參數資訊會通過log打出,僅在pc端時才會列印。
appId: sign.appId, // 必填,公衆号的唯一辨別
timestamp:sign.timestamp, // 必填,生成簽名的時間戳
nonceStr: sign.nonceStr, // 必填,生成簽名的随機串
signature: sign.signature,// 必填,簽名,見附錄1
jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口清單,所有JS接口清單見附錄2
});
wx.error(function(res){
// config資訊驗證失敗會執行error函數,如簽名過期導緻驗證失敗,具體錯誤資訊可以打開config的debug模式檢視,也可以在傳回的res參數中檢視,對于SPA可以在這裡更新簽名。
});
wx.scanQRCode({
needResult: 0, // 預設為0,掃描結果由微信處理,1則直接傳回掃描結果,
scanType: ["qrCode","barCode"], // 可以指定掃二維碼還是一維碼,預設二者都有
success: function (res) {
var result = res.resultStr; // 當needResult 為 1 時,掃碼傳回的結果
}
});
})
</script>
其他:
public function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
// 為保證第三方伺服器與微信伺服器之間資料傳輸的安全性,所有微信接口采用https方式調用,必須使用下面2行代碼打開ssl安全校驗。
// 如果在部署過程中代碼在此處驗證失敗,請到 http://curl.haxx.se/ca/cacert.pem 下載下傳新的證書判别檔案。
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
public function createNonceStr($length = 16)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}