微信封裝的調(diào)用微信簽名包的類(lèi)庫(kù)
廢話不多說(shuō)了,直接給大家貼代碼了,具體代碼如下所示:
<?php
namespace Home\Model;
use Think\Model;
class WechatModel extends Model {
private $_token = ''; //令牌
private $appid;
private $appsecret;
public function __construct()
{
$this->appid = C('APPID');//公眾號(hào)的appid
$this->appsecret = C('APPSECRET');//公眾號(hào)的秘鑰
}
//調(diào)用js-sdk的簽名包
public function getSignPackage() {
$jsapiTicket = $this->getJsApiTicket();
// 注意 URL 一定要?jiǎng)討B(tài)獲取,不能 hardcode.(獲取當(dāng)前網(wǎng)頁(yè)的url)
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
//時(shí)間戳
$timestamp = time();
//隨機(jī)字符串獲取
$nonceStr = $this->createNonceStr();
// 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
//生成字符串是用來(lái)簽名用的
$signature = sha1($string);
$signPackage = array(
"appId" => $this->appid,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
}
//使用會(huì)員卡領(lǐng)取的簽名包
public function getHuiYuanSignPackage() {
$apiTicket = $this->getApiTicket();
// 注意 URL 一定要?jiǎng)討B(tài)獲取,不能 hardcode.(獲取當(dāng)前網(wǎng)頁(yè)的url)
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
//時(shí)間戳
$timestamp = time();
//隨機(jī)字符串獲取
// $nonceStr = $this->createNonceStr();
// 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序
$string = $timestamp.$apiTicket."car_id";//card_id為自己創(chuàng)建的會(huì)員卡的id
//生成字符串是用來(lái)簽名用的
$signature = sha1($string);
$signPackage = array(
"timestamp" => $timestamp,
"signature" => $signature,
);
return $signPackage;
}
//獲取會(huì)員卡的api_ticket
public function getApiTicket(){
$data = json_decode(file_get_contents("api_ticket.json"));
if ($data->expire_time < time()) {
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&access_token=$accessToken";
$res = json_decode($this->httpGet($url));
$ticket = $res->ticket;
if ($ticket) {
$data->expire_time = time() + 7000;
$data->jsapi_ticket = $ticket;
$fp = fopen("api_ticket.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
}
} else {
$ticket = $data->jsapi_ticket;
}
return $ticket;
}
//獲取隨機(jī)字符串
private 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;
}
//獲取Access Token
public function getAccessToken(){
//將json字符串轉(zhuǎn)換為json對(duì)象(json_encode是將數(shù)組轉(zhuǎn)換為json字符串,json_decode("",true) 如果加true是將json字符串轉(zhuǎn)化為php數(shù)組,不加true轉(zhuǎn)換為PHP對(duì)象)
$data = json_decode(file_get_contents("access_token.json"));
if ($data->expire_time < time()) {
// 如果是企業(yè)號(hào)用以下URL獲取access_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;
if ($access_token) {
$data->expire_time = time() + 7000;
$data->access_token = $access_token;
$fp = fopen("access_token.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
}
} else {
$access_token = $data->access_token;
}
return $access_token;
}
//獲取jsapi_ticket(jsapi_ticket是公眾號(hào)用于調(diào)用微信JS接口的臨時(shí)票據(jù))
private function getJsApiTicket() {
// jsapi_ticket 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫(xiě)入到文件中做示例
$data = json_decode(file_get_contents("jsapi_ticket.json"));
if ($data->expire_time < time()) {
$accessToken = $this->getAccessToken();
// 如果是企業(yè)號(hào)用以下 URL 獲取 ticket
// $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode($this->httpGet($url));
$ticket = $res->ticket;
if ($ticket) {
$data->expire_time = time() + 7000;
$data->jsapi_ticket = $ticket;
$fp = fopen("jsapi_ticket.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
}
} else {
$ticket = $data->jsapi_ticket;
}
return $ticket;
}
//獲取用戶的openid
public function openId(){
$url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if (!isset($_GET['code'])) {
//獲取組裝的url
$openidUrl = $this->snsapi_base($url);
redirect($openidUrl);
}else{
$openidAccess_token = $this->openidAccess_token($_GET['code']);
return $openidAccess_token;
}
}
//獲取微信用戶的opnid
public function getOpenId($openid,$access_token)
{
$userInfo = $this->getUserInfo($openid,$access_token);
return $userInfo;
}
public function snsapi_base($redirect_uri, $scope = "snsapi_userinfo", $state = 0)
{
$appId = $this->appid;
$url = "https://open.weixin.qq.com/connect/oauth2/authorize";
$url .= "?appid=$appId";
$url .= "&redirect_uri=http://$redirect_uri";
$url .= "&response_type=code";
$url .= "&scope=$scope";
$url .= "&state=$state#wechat_redirect";
return $url;
}
public function openidAccess_token($code){
$appId = $this->appid;
$appSecret= $this->appsecret;
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code";
return json_decode($this->httpGet($url),true);
}
//獲取用戶信息
public function getUserInfo($openid, $access_token){
$url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN ";
return json_decode($this->httpGet($url),true);
//請(qǐng)求
}
private function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
}
以上所述是小編給大家介紹的微信封裝的調(diào)用微信簽名包的類(lèi)庫(kù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 微信 jssdk 簽名錯(cuò)誤invalid signature的解決方法
- C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法
- 基于微信簽名signature獲取(實(shí)例講解)
- 微信開(kāi)發(fā)之使用java獲取簽名signature
- Android微信支付獲取二次簽名Sign的方法
- 詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案
- 詳解Vue開(kāi)發(fā)微信H5微信分享簽名失敗問(wèn)題解決方案
- .NET微信小程序用戶數(shù)據(jù)的簽名驗(yàn)證和解密代碼
- VUE解決微信簽名及SPA微信invalid signature問(wèn)題(完美處理)
- 微信js sdk invalid signature簽名錯(cuò)誤問(wèn)題的解決方法分析
相關(guān)文章
ThinkPHP3.2框架使用addAll()批量插入數(shù)據(jù)的方法
這篇文章主要介紹了ThinkPHP3.2框架使用addAll()批量插入數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了thinkPHP針對(duì)單條數(shù)據(jù)插入及批量數(shù)據(jù)插入操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03
PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】
這篇文章主要介紹了PHP設(shè)計(jì)模式:組合模式Composite,結(jié)合實(shí)例形式詳細(xì)分析了PHP組合模式Composite基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
yii框架創(chuàng)建與設(shè)置默認(rèn)控制器并載入模板操作示例
這篇文章主要介紹了yii框架創(chuàng)建與設(shè)置默認(rèn)控制器并載入模板操作,結(jié)合實(shí)例形式分析了Yii框架控制器與模板相關(guān)操作技巧及使用注意事項(xiàng),需要的朋友可以參考下2020-03-03
thinkPHP5框架閉包函數(shù)與子查詢傳參用法示例
這篇文章主要介紹了thinkPHP5框架閉包函數(shù)與子查詢傳參用法,結(jié)合實(shí)例形式分析了thinkPHP5閉包查詢與參數(shù)傳遞相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
php輸入流php://input使用示例(php發(fā)送圖片流到服務(wù)器)
在做一個(gè)攝像頭拍照然后上傳的功能,php中使用php://input來(lái)獲取內(nèi)容,可以看下面的示例2013-12-12
php源碼 fsockopen獲取網(wǎng)頁(yè)內(nèi)容實(shí)例詳解
這篇文章主要介紹了php源碼 fsockopen獲取網(wǎng)頁(yè)內(nèi)容實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
PHP+MySql實(shí)現(xiàn)一個(gè)簡(jiǎn)單的留言板
留言板是接觸WEB開(kāi)發(fā)的基礎(chǔ),寫(xiě)一個(gè)留言板需要知道前端的一些基礎(chǔ)標(biāo)簽,對(duì)數(shù)據(jù)庫(kù)有一個(gè)了解會(huì)基礎(chǔ)SQL語(yǔ)言,PHP基礎(chǔ)知識(shí),前段基礎(chǔ)+數(shù)據(jù)庫(kù)基礎(chǔ)+PHP基礎(chǔ)=>留言板2020-07-07

