微信JS-SDK選擇相冊或拍照并上傳PHP實現

理解:微信上傳接口是拍照,或者選擇本地照片,上傳到微信的服務器,獲取到一個id,通過token與這個id獲取到圖片,保存到服務器即可。

效果

?

通過微信js接口,調用底層程序。

需要引入js文件,并進行配置。

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
復制代碼
wx.config({debug: false,appId: 'wxed7996e9ad58345d',timestamp: 1449717454,nonceStr: 'asdfasdfasdf',signature: 'b74fb4ab4790172d2ab7e58f0051a1523aaa4803',jsApiList: ['chooseImage','uploadImage']
});
復制代碼

其中appId為微信公眾平臺id,timestamp為當前時間戳,nonceStr為隨機字符串,signature為簽名。

signature是最重要參數。需要通過很多步驟來獲取。

首先獲取access_token,能存活兩小時,每天允許獲取2000次。超過就不能獲取了。

復制代碼
// 獲取access_token 兩小時有效private function get_access_token(){$appid = C('oauth_config.appid');$appsecret = C('oauth_config.appsecret');$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;$rurl = file_get_contents($url);$rurl = json_decode($rurl,true);if(array_key_exists('errcode',$rurl)){return false;}else{$access_token = $rurl['access_token'];return $access_token;}}
復制代碼

然后獲取jsticket

復制代碼
// 獲取jsticket 兩小時有效private function getjsticket(){ // 只允許本類調用,繼承的都不可以調用,公開調用就更不可以了$access_token = $this->get_access_token();$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; // 兩小時有效$rurl = file_get_contents($url);$rurl = json_decode($rurl,true);if($rurl['errcode'] != 0){return false;}else{$jsticket = $rurl['ticket'];return $jsticket;}}
復制代碼

然后獲取signature,它是由多個參數拼接加密形成的,有實效性。

復制代碼
// 獲取 signatureprivate function getsignature(){$noncestr = '';$jsapi_ticket = $this->getjsticket();$timestamp = time();$url = 'http://zhudianbao.diandodo.com/index.php?g=Opener&m=Merchant&a=open';$string1 = 'jsapi_ticket='.$jsapi_ticket.'&noncestr='.$noncestr.'&timestamp='.$timestamp.'&url='.$url;$signature = sha1($string1);return $signature;}
復制代碼

配置好之后,就可以使用了。我用了兩個功能,一個是選擇照片,一個是上傳照片。

復制代碼
function chooseImage(obj){// 選擇張片
    wx.chooseImage({count: 1, // 默認9sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認二者都有
        success: function(res) {var localIds = res.localIds; // 返回選定照片的本地ID列表,localId可以作為img標簽的src屬性顯示圖片$(obj).attr('src', localIds);// 上傳照片
            wx.uploadImage({localId: '' + localIds,isShowProgressTips: 1,success: function(res) {serverId = res.serverId;$(obj).next().val(serverId); // 把上傳成功后獲取的值附上
                }});}});
}
復制代碼

選擇照片返回的localIds很有意思,可以用于上傳使用,并且可以放在img的src屬性中,展示圖片。

上傳成功后,獲取一個serverId,通過這個id可以下載上傳到微信服務器上的圖片文件,把它保存到自己的服務器中。

復制代碼
// 獲取圖片地址private function getmedia($access_token,$media_id,$foldername){$url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=".$access_token."&media_id=".$media_id;if (!file_exists("./Uploads/User_cert/".$foldername)) {mkdir("./Uploads/User_cert/".$foldername, 0777, true);}$targetName = './Uploads/User_cert/'.$foldername.'/'.date('YmdHis').rand(1000,9999).'.jpg';$ch = curl_init($url); // 初始化$fp = fopen($targetName, 'wb'); // 打開寫入curl_setopt($ch, CURLOPT_FILE, $fp); // 設置輸出文件的位置,值是一個資源類型curl_setopt($ch, CURLOPT_HEADER, 0);curl_exec($ch);curl_close($ch);fclose($fp);return $targetName;}
復制代碼

防止圖片名稱相同,加一個rand隨機數,因為在同一秒鐘可能會上傳多張照片。

$targetName = './Uploads/User_cert/'.$foldername.'/'.date('YmdHis').rand(1000,9999).'.jpg';

這個serverId以表單的形式提交到服務器,然后對其進行寫入文件,獲取地址,并把地址保存到服務器中。

微信的js與jquery不沖突,可以共同使用。

?附上牛逼的JSSDK類

復制代碼
<?php
class JSSDK {private $appId;private $appSecret;public function __construct($appId, $appSecret) {$this->appId = $appId;$this->appSecret = $appSecret;}public function getSignPackage() {$jsapiTicket = $this->getJsApiTicket();// 注意 URL 一定要動態獲取,不能 hardcode.$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";$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; }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;}private function getJsApiTicket() {// jsapi_ticket 應該全局存儲與更新,以下代碼以寫入到文件中做示例$data = json_decode(file_get_contents("jsapi_ticket.json"));if ($data->expire_time < time()) {$accessToken = $this->getAccessToken();// 如果是企業號用以下 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;}private function getAccessToken() {// access_token 應該全局存儲與更新,以下代碼以寫入到文件中做示例$data = json_decode(file_get_contents("access_token.json"));if ($data->expire_time < time()) {// 如果是企業號用以下URL獲取access_token// $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";$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;}private 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, true);curl_setopt($curl, CURLOPT_URL, $url);$res = curl_exec($curl);curl_close($curl);return $res;}
}



本文轉自TBHacker博客園博客,原文鏈接:http://www.cnblogs.com/jiqing9006/p/5038340.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396996.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JMS-ActiveMQ學習-3 ActiveMQ與Spring集成

Spring下開發消息的發送和接收程序 點對點模式 一、創建生產者項目 1.創建maven項目 2.添加spring-jms、jms規范、activemq依賴 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms&…

看libevent所遇到的英語生詞

libevent – an event notification library The libevent API &#xff08;libevent應用程序&#xff09;provides a mechanism&#xff08;機制&#xff09; to execute&#xff08;執行&#xff09; a callback function&#xff08;回調函數&#xff09; when a specific&a…

java中迭代器要導包嗎_java 中迭代器的使用方法詳解

java 中迭代器的使用方法詳解前言&#xff1a;迭代器模式將一個集合給封裝起來&#xff0c;主要是為用戶提供了一種遍歷其內部元素的方式。迭代器模式有兩個優點&#xff1a;①提供給用戶一個遍歷的方式&#xff0c;而沒有暴露其內部實現細節&#xff1b;②把元素之間游走的責任…

android socket 長連接_TCP/IP,http,socket,長連接,短連接

點擊上方藍色字體&#xff0c;選擇“標星公眾號”優質文章&#xff0c;第一時間送達上一篇&#xff1a;這300G的Java資料是我師傅當年給我的&#xff0c;免費分享給大家下一篇&#xff1a;這200G的Java實戰資料是我師傅當年教我的第二招作者 | ksfzhaohui來源 | my.oschina.net…

二、Python安裝擴展庫

第一步:推薦easy_install工具 下載地址:https://pypi.python.org/pypi/setuptools 下載"ez_setup.py"文件; 通過運行cmd命令找到ez_setup.py文件所在目錄,通過命令[python ez_setup.py]執行安裝easy_install 安裝成功截圖 第二步:安裝擴展酷 例如安裝"suds"…

ORACLE 10.2.01升級10.2.05 for windows 詳細文檔

最近要做一個數據庫的升級工作&#xff0c;提前在自己的PC機上練習了一下&#xff0c;這種文檔在網上很多&#xff0c;但是大多都是使用命令編輯腳本&#xff0c;其實數據庫還有一個DBUA的升級工具可以使用&#xff0c;使升級工作方便了很多。 OS環境&#xff1a;windows XP 32…

php 導出mysql 結構_導出結構和數據(如phpmyadmin)

在這里,您可以找到一個全面的解決方案來轉儲MySQL結構和數據,比如在PMA中(不使用exec、passthru等):它是Dszymczuk項目的一個分支,有我的增強功能。用法很簡單//MySQL connection parameters$dbhost localhost;$dbuser dbuser;$dbpsw pass;$dbname dbname;//Connects to my…

tableViewCell的操作

在iOS的開發過程中&#xff0c;tableView的使用永遠都是最常用的控件。今天學習了一下tableViewCell的操作。代碼并不是很復雜&#xff0c;如果有OC開發經驗的人&#xff0c;應該很容易看懂的。 class ViewController: UIViewController ,UITableViewDelegate, UITableViewData…

stm32正交編碼器 原理圖_惡劣環境下應用的電感式增量編碼器和絕對編碼器

編碼器可分為兩種基本類型 - 增量編碼器和絕對編碼器。增量編碼器的顯著特征是它報告角度的變化。換句話說&#xff0c;當增量編碼器通電時&#xff0c;它不會報告其角位置&#xff0c;直到它具有測量的參考點。絕對編碼器明確地在比例或范圍內報告其位置。換句話說&#xff0c…

【SqlServer】Sqlserver中的DOS命令操作

輸入osql ?查看是否支持當前版本&#xff0c;如果是SQL Server 2005以上用Sqlcmd , 以下用Osql連接數據庫&#xff08;a&#xff09;Osql -S localhost -U username -P password(SQL Server身份驗證&#xff0c;需要用戶民和密碼)&#xff08;b&#xff09;Osql -S localhos…

微信小程序內訓筆記

2016年9月22日凌晨微信官方正式宣布“小程序”開始內測&#xff0c;有“微信之父”之稱、騰訊集團高級執行副總裁張小龍在2016年末對外宣布“小程序“應用將于2017年1月9日正式推出 這一次微信還是按照慣例&#xff0c;通過機器跑出的數據&#xff0c;首先將“小程序”開放給了…

python基礎代碼的含義_Python基礎學習篇

原標題&#xff1a;Python基礎學習篇 1、編碼 默認情況下&#xff0c;Python 3 源碼文件以 UTF-8 編碼&#xff0c;所有字符串都是unicode 字符串。 當然你也可以為源碼文件指定不同的編碼&#xff1a;# -*- coding: cp-1252 -*- 2、標識符 第一個字符必須是字母表中字母或下劃…

java面向對象super_【JavaSE】面向對象之super、final

一、super關鍵字它是一個指代變量&#xff0c;用于在子類中指代父類對象。1.作用指代父類對象區分子父類同名的成員變量&#xff0c;區分父類中成員變量和子類中同名的局部變量2.使用與this相同&#xff0c;調用父類成員變量和成員方法&#xff1a;super.xx super.xxx()調用父類…

Week_1_Physical Electronics and Semiconductors

Semiconductors Fundamentals Type of solids 轉載于:https://www.cnblogs.com/ronnielee/p/9579783.html

【Linux高頻命令專題(23)】tar

概述 通過SSH訪問服務器&#xff0c;難免會要用到壓縮&#xff0c;解壓縮&#xff0c;打包&#xff0c;解包等&#xff0c;這時候tar命令就是是必不可少的一個功能強大的工具。linux中最流行的tar是麻雀雖小&#xff0c;五臟俱全&#xff0c;功能強大。 tar命令可以為linux的文…

2. Add Two Numbers

直接用一個carry記錄進位就可以 1 //NEW2 class Solution {3 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {4 ListNode root new ListNode(0);5 return addTwoNumbers(l1, l2, root);6 }7 public ListNode addTwoNumbers(ListNode …

安裝Windows更新程序遇到錯誤:0x80070422

看看服務那里 windows update服務是不是被禁用了&#xff1f; 還有一個問題可能是由于Windows Modules Installer被禁用了。

談談對python的理解_淺談對python pandas中 inplace 參數的理解

這篇文章主要介紹了對python pandas中 inplace 參數的理解&#xff0c;具有很好的參考價值&#xff0c;希望對大家有所幫助。一起跟隨小編過來看看吧 pandas 中 inplace 參數在很多函數中都會有&#xff0c;它的作用是&#xff1a;是否在原對象基礎上進行修改 inplace True&am…

java中 hashset_Java中的HashSet

HashSet擴展AbstractSet并實現Set接口。它創建一個使用哈希表進行存儲的集合。哈希表通過使用稱為哈希的機制來存儲信息。在散列中&#xff0c;鍵的信息內容用于確定唯一值&#xff0c;稱為其散列碼。然后&#xff0c;將哈希碼用作存儲與鍵關聯的數據的索引。鍵到其哈希碼的轉換…

mac下的svn服務器建立

MAC下的SVN服務器建立: from : http://blog.csdn.net/q199109106q/article/details/8655204 在Windows環境中&#xff0c;我們一般使用TortoiseSVN來搭建svn環境。在Mac環境下&#xff0c;由于Mac自帶了svn的服務器端和客戶端功能&#xff0c;所以我們可以在不裝任何第三方軟件…