1. 程式人生 > >微信網頁開發常用功能封裝

微信網頁開發常用功能封裝

<?php
namespace weixin;
class Weixin{
    public $_appid;
    public $_appsecret;
    public $_redirect_uri;
    public $_access_token;
    public $_jsapi_ticket;
    public function __construct ($appid = '', $appsecret = '', $redirect_uri = '') {
        $this->_appid = $appid ? $appid : Config::get('wxConfig.appid');//設定自己的appid
        $this->_appsecret = $appsecret ? $appsecret : Config::get('wxConfig.secret');//設定自己的app_secret
        $this->_redirect_uri = $redirect_uri ? $redirect_uri : Config::get('wxConfig.redirect_host');//設定自己的登入回撥地址
    }
    /*
     * 生成授權連結
     * @param $stat string 自定義引數
     * @param $scope string 授權方式
     * @return string
     */
    public function createAuthUrl ($state = '', $scope = 'snsapi_userinfo') {
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?';
        $url .= 'appid=' . $this->_appid . '&redirect_uri=' . urlencode($this->_redirect_uri);
        $url .= '&response_type=code&state=' . $state . '&scope=' . $scope . '#wechat_redirect';
        return $url;
    }


    //獲取換取使用者資訊的access_token,openid
    public function getOpenid ($code) {
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?';
        $url .= 'appid=' . $this->_appid . '&secret=' . $this->_appsecret . '&code=' . $code . '&grant_type=authorization_code';
        $result = $this->getData($url, 'openid_accesstoken');
        return $result;
    }

    //獲取使用者資訊
    public function getUserInfo ($code) {
        $data = $this->getOpenid($code);
        if ($data) {
            $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $data['access_token'] . '&openid=' . $data['openid'] . '&lang=zh_CN';
            $userInfo = $this->getData($url, 'user_info');
            return $userInfo;
        } else {
            return false;
        }
    }

    //http get 方法 預設返回陣列
    private function httpGet ($url, $data_type = 'array') {
        $cl = curl_init();
        if (stripos($url, 'https://') !== FALSE) {
            curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($cl, CURLOPT_SSLVERSION, 1);
        }
        curl_setopt($cl, CURLOPT_URL, $url);
        curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
        $content = curl_exec($cl);
        $status = curl_getinfo($cl);
        curl_close($cl);
        if (isset($status['http_code']) && $status['http_code'] == 200) {
            if ($data_type == 'json') {
                $content = json_decode($content);
            }
            return json_decode($content, true);
        } else {
            return FALSE;
        }
    }

    //http post 方法 預設返回陣列
    private function httpPost ($url, $fields, $data_type = 'array') {
        $cl = curl_init();
        if (stripos($url, 'https://') !== FALSE) {
            curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($cl, CURLOPT_SSLVERSION, 1);
        }
        curl_setopt($cl, CURLOPT_URL, $url);
        curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($cl, CURLOPT_POST, true);
        curl_setopt($cl, CURLOPT_POSTFIELDS, $fields);
        $content = curl_exec($cl);
        $status = curl_getinfo($cl);
        curl_close($cl);
        if (isset($status['http_code']) && $status['http_code'] == 200) {
            if ($data_type == 'json') {
                $content = json_decode($content);
            }
            return json_decode($content, true);
        } else {
            return FALSE;
        }
    }

    //記錄日誌 根據框架情況或者講日誌儲存到資料庫
    public function writeLog ($actionname, $errcode = '') {
        Log::write('微信公眾號錯誤日誌方法:' . $actionname . ' === CODE:' . $errcode, 'WXERRCODE');
        return true;
    }

    //獲取基本介面access_token
    public function getAccessToken () {
        $accessToken = Cache::get('access_token');//讀取快取中的access_token
        if ($accessToken) {
            return $accessToken;
        } else {
            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $this->_appid . '&secret=' . $this->_appsecret;
            $data = $this->getData($url, 'access_token');
            if ($data) {
                $accessToken = $data['access_token'];
                Cache::set('access_token', $accessToken, 7000);//根據實際情況快取access_token,設定有效期
            } else {
                $accessToken = false;
            }
            return $accessToken;
        }
    }

    // 獲取 jssdk 簽名
    private function getJsapiTicket () {
        $tiket = Cache::get('jsapi_ticket');//讀取快取中的jsapi_tiket
        if ($tiket) {
            return $tiket;
        } else {
            $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $this->getAccessToken() . '&type=jsapi';
            $data = $this->getData($url, 'jsapi_ticket');
            if (!$data) {
                $tiket = false;
            } else {
                $tiket = $data['ticket'];
                Cache::set('jsapi_ticket', $tiket, 7000);//設定 
            }
            return $tiket;
        }
    }

    /**
     * 獲取資料curl get
     * @param $url string 獲取連結
     * @param $input string 獲取欄位
     * @return bool|mixed
     */
    private function getData ($url, $input) {
        $retry = 3;
        while ($retry--) {
            $data1 = $this->httpGet($url);
            if (!$data1) {
                continue;
            }
            break;
        }
        if (isset($data1['errcode']) && $data1['errcode']) {
            $this->writeLog($input, $data1['errcode']);
            return false;
        }
        return $data1;
    }

    protected function postData ($url, $field, $input) {
        $retry = 3;
        while ($retry--) {
            $data1 = $this->httpPost($url, $field);
            if (!$data1) {
                continue;
            }
            break;
        }
        if (isset($data1['errcode']) && $data1['errcode']) {
            $this->writeLog($input, $data1['errcode']);
            return false;
        }
        return $data1;
    }

    //生成隨機字串
    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;
    }

    //生成簽名
    public function creatSign () {
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $jsapiTicket = $this->getJsapiTicket();
        if (!$jsapiTicket) {
            return false;
        }
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        // 這裡引數的順序要按照 key 值 ASCII 碼升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        $signature = sha1($string);
        $signPackage = array(
            "appId"     => $this->_appid,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }

    // 傳送模板訊息
    /**
     * @param $touser string 使用者openid
     * @param $msg array 要傳送的訊息
     * @param $template_id string 模板訊息ID
     * @param string $url 模板訊息url
     * @param string $color 字型顏色
     * @return bool|string
     */
    public function sendTplMsg ($touser, $msg, $template_id, $url = '', $color = '#FF683F') {
        if (!$touser || !$template_id) {
            return false;
        }
        if (!is_array($msg) || !$msg) {
            return false;
        }
        $accessToken = $this->getAccessToken();
        if (!$accessToken) {
            return false;
        }
        $postUrl = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' . $accessToken;
        $data = array(
            'touser'      => trim($touser),
            'template_id' => trim($template_id),
            'url'         => $url,
        );
        $message = array();
        $message['first'] = array(
            'value' => $msg['first'],
            'color' => $color
        );
        $message['keyword1'] = array(
            'value' => $msg['keyword1'],
            'color' => $color
        );
        $message['keyword2'] = array(
            'value' => $msg['keyword2'],
            'color' => $color
        );
        if (array_key_exists('keyword3', $msg)) {
            $message['keyword3'] = array(
                'value' => $msg['keyword3'],
                'color' => $color
            );
        }
        if (array_key_exists('keyword4', $msg)) {
            $message['keyword4'] = array(
                'value' => $msg['keyword4'],
                'color' => $color
            );
        }
        $message['remark'] = array(
            'value' => $msg['remark'],
            'color' => $color
        );
        $data['data'] = $message;
        $data = json_encode($data);
        $result = $this->httpPost($postUrl, $data);
        if (!$result) {
            return false;
        }
        if ($result['errcode'] != 0 || $result['errmsg'] != 'ok') {
            $this->writeLog('sendTplMsg', $result['errcode']);
            return false;
        }
        return true;
    }
}

完整程式碼、使用方法:https://github.com/m249005779/wechat-common-functions 


相關推薦

網頁開發常用功能封裝

<?php namespace weixin; class Weixin{     public $_appid;     public $_appsecret;     public $_redirect_uri; public $_access_token;

php網頁開發實現自動登入註冊功能例項

功能:自動登入註冊功能 描述:php實現微信網頁自動登入註冊功能 範圍:適用於所有php版本 thinkphp5.0例項 $token = cookie('token'); if($token){ //這裡寫登入後的邏輯 }else{ $

網頁開發

ati scope 重新 log appid 微信網頁授權 刷新 connect 開發者 微信網站一般是先要微信網頁授權後獲取到access_token,才有資格獲取用戶信息的,所以如果用戶在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取用戶基本信息,進

網頁開發沒有備案域名怎麽辦?【僅供線下測試使用】

安全 服務器 blog image 發送 如何配置 system32 clas 是你 大家都知道微信JS-SDK使用第一步就是綁定“JS接口安全域名”, 微信明確規定填寫的域名須通過ICP備案的驗證。 但是很多像我這樣的普通程序員就只是想學習學習

網頁-開發ios對於es6相容問題

微信網頁開發ios對於es6相容問題 最近在做微信網頁活動頁面,在ios9.3.3出現網頁的js程式碼全部失效: 描述: 機型iphone6s,ios9.3.3,微信版本6.6.5 js程式碼全部失效,剛開始還以為是ios和微信授權有bug, 後來發現是es6語法不能讀,導致報錯

網頁開發wx.getLocation在安卓手機上的一個坑

    我在wx.getLocation的成功回撥函式裡,執行了一句 this.lon = res.longitude.toFixed(6)     在蘋果手機和除錯工具上都是能獲取到資料的,但是在安卓手機上this.lon沒有獲取到資料,排查之後,發

網頁開發weixin://preInjectJSBridge/fail、分享描述失效問題記錄

問題:微信網頁開發做分享功能時IOS上正常,Android在分享到朋友時描述失效,weinre除錯顯示weixin://preInjectJSBridge/fail報錯 解決:先說重點如何解決的,其實

網頁開發樣式庫的使用

一、WeUI 是什麼 WeUI 是一套同微信原生視覺體驗一致的基礎樣式庫,由微信官方設計團隊為微信內網頁和微信小程式量身設計,令使用者的使用感知更加統一。在微信網頁或小程式中使用 WeUI,有如下優勢: 1. 同微信客戶端一致的視覺效果,令所有微信使用者都能

網頁開發分享

首先提供一個微信官方地址點選開啟連結 早期web專案中經常用到微信分享功能,現在整理一下,供記憶與分享,開發環境為JAVA +H5。 1、微信的開發環境不在多說,大概為:使用已備案的域名,設定“公眾號設定”的三項域名、 設定開發者密碼(AppSecret)、除錯通過核心服務

網頁開發--獲取信使用者資訊

流程 使用者掃碼或者直接點選連結進入我們的入口頁面; 進入授權登入頁面,使用者點選授權登入按鈕; 微信會自動將我麼的網頁授權域名後增加引數; 根據微信給的code去獲取當前登入的微信使用者的使用者資

網頁開發之快取問題

通過網上搜索,得到以下幾種解決方法: 1.在使用window.location.href跳轉頁面時,在url後面加上“?datetime=”+new Date().getTime();保證每次瀏覽的網頁是最新的。 2.js或css更新後,在html引用的地方更新版本號,例如scr="../js/demo.js

網頁授權操作邏輯封裝-C#例項

一、微信網頁授權登入 前提: 1.已經獲取的介面許可權,如果是測試賬號就已經有許可權了 2.配置介面的授權域名 步驟: 1.使用者同意授權,獲取code 2.根據code 獲取access_token及當前操作使用者的openid、unionid 3.根據openid獲

公眾開發投票功能

第一步:必須經過網頁授權第二步:通過code換取網頁授權的sccess_token第三步:重新整理 access_token第四步:拉取使用者資訊分佈閱讀:第一步:在確保微信公眾賬號擁有授權作用域(scope引數)的許可權的前提下(服務號獲得高階介面後,預設擁有scope引數

網頁開發--分享介面

流程 關於流程,在上一篇中已經有圖介紹: 微信文件 JSSDK使用步驟 首先確保已經獲取了相關許可權 步驟一:繫結域名 先登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”。 備註:登入後可在“開發者

網頁開發的一些感想,順便附上中呼叫掃一掃史上最簡便的方法 5行程式碼實現H5掃一掃 HTML5掃一掃最簡便的辦法

呼叫範例完整程式碼下載: csdn的這個博文寫的有點囉嗦,建議移步這裡: 在網頁上點一個按鈕或者連結呼叫微信掃一掃然後返回結果我們繼續處理,很多人應該都會有這樣的需求,不過微信對這個空子比較嚴格,需要你的網頁有簽名,而簽名生成需要有一個微信公眾號的appk

erdaicms首款基於weui(網頁開發樣式庫)的前端模版上線

  微信為了配和微信小程式釋出(據小馬哥說,年前會發布哦),釋出了微信網頁開發樣式庫,為的是統一微信第三方程式的視覺效果,提升使用者體驗,為微信小程式做準備,Erdaicms第一時間做了跟蹤開發,現在,基於weui(微信網頁開發樣式庫)的前端模版上線,效果預覽:  

C#網頁開發---JSSDK使用 通過config介面注入許可權驗證配置

 1:   我們來看,下面的這個是開發需要配置的東西,我們通過開發文件來一個一個的配置wx.config({ debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出

網頁開發之獲取使用者unionID的兩種方法--基於的多點登入使用者識別

假設網站A有以下功能需求:1,pc端微信掃碼登入;2,微信瀏覽器中的靜默登入功能需求,這兩種需求就需要用到使用者的unionID,這樣才能在多個登入點(終端)識別使用者。那麼這兩種需求下使用者的unionID該如何獲取呢? 1,先看pc端的解決方案 以snsapi_logi

.Net網頁開發之JSSDK使用步驟和配置資訊timestamp(時間戳),nonceStr(隨機串),signature(簽名),access_token(介面呼叫憑據)的生成獲取講解

 前言:   因為接下來會有幾篇關於微信JS-SDK功能使用的文章,主要會對微信分享,獲取裝置資訊,獲取地理位置,微信掃一掃這幾個功能進行講解。而這幾個功能都是圍繞著微信JS-SDK實現的,首先使用微信JS-SDK時我們需要生成對應的配置資訊,才能夠成功的呼叫微信JS-SDK。看了下微信官方文件對

.Net網頁開發之使用JS-SDK自定義分享內容

第一步、微信JS-SDK的使用步驟,配置資訊的生成獲取講解:   關於JS-SDK的使用步驟和timestamp(時間戳),nonceStr(隨機串),signature(簽名),access_token(介面呼叫憑據)生成獲取的詳細說明在這裡:https://www.cnblogs.com/Can-day