微信小程序&PHP 生成小程序碼分享圖 并保存在手機(jī)相冊

注意:小程序端如果想保存成圖片或辖,需要用畫布瘾英,但是如果想把圖片放在畫布上,真機(jī)上需要先把圖片保存到本地颂暇。
解決方法:使用緩存文件H鼻础!s凹堋0曷浮榆骚!

小程序端:

.js 小程序前端數(shù)據(jù)處理

import util from '../../../utils/util' //下文貼出片拍,公共方法
var image = require('../../../utils/util.js'); 
//獲取全局變量
const app = getApp(); 
Page({
  data: {
    
    allthing: app.globalData,
  },
  onLoad: function (options) {
    var that = this;
    var imageSize = image.image()
 
    that.setData({
      imageWidth: imageSize.imageWidth,
      imageHeight: imageSize.imageHeight,
      chaWidth: imageSize.chaWidth,
      chaHeight: imageSize.chaHeight,
    })
 
    //獲取頭像
    that.getAvatarUrl(that.data.allthing.userInfo.avatarUrl)
 
    //獲取特定頁面的小程序碼
    that.getSpecialM()
 
    //獲取背景圖
    that.getBackground()
 
    //獲取頭像框
    that.getTouground()
 
    wx.showToast({
      title: '正在生成圖片',
      icon: 'loading',
      duration: 10000,
    })
    
    //延遲執(zhí)行,避免請(qǐng)求文件無效
    setTimeout(function () {           
      console.log("----Countdown----")
        //生成圖片
      that.createImg()
      wx.hideToast()
    }, 1000)
  },
 
  /**
   * 獲取特定頁面的小程序碼
   */
  getSpecialM:function(){
    var that = this
    //請(qǐng)求獲取小程序碼
    wx.request({
      method: 'GET',
      url: 'https://www.a******_code.php?sid=' + that.data.userInfo.subject_id,
      header: {
        'content-type': 'application/json'
      },
      success: function (res) {
        wx.downloadFile({
          url: res.data.data.url,
          success: function (res) {
            that.setData({
              icon4: res.tempFilePath,
            })
          },
          fail: function () {
            console.log('fail')
          }
        })
      }
  })
},
 
  /**
   * 獲取頭像
   */
  getAvatarUrl: function (avatarUrl){
    var that = this
    //保存頭像
    wx.downloadFile({
      url:avatarUrl,
      success: function (res) {
        that.setData({
          exam: res.tempFilePath,
        })
      },
      fail: function () {
        console.log('fail')
      }
    })
  },
 
  /**
   * 獲取背景
   */
  getBackground: function () {
    var that = this
    wx.downloadFile({
      url: 'https://app.c***answer/2.png',
      success: function (res) {
        that.setData({
          share: res.tempFilePath,
        })
      },
      fail: function () {
        console.log('fail')
      }
    })
  },
 
  /**
   * 獲取頭像框
   */
  getTouground: function () {
    var that = this
    wx.downloadFile({
      url: 'https://app.ci1*******er/phot.png',
      success: function (res) {
        that.setData({
          phot: res.tempFilePath,
        })
      },
      fail: function () {
        console.log('fail')
      }
    })
  },
 
  /**
   * 生成畫布
   */
  createImg:function(){
    var that  = this 
    var ctx = wx.createCanvasContext('myCanvas');
    ctx.setFillStyle('White')
    ctx.fillRect(0, 0, 300, 400)
    ctx.drawImage(that.data.icon4, 115 + that.data.chaWidth / 2, 153 + that.data.chaHeight / 2, 92, 92)
    ctx.drawImage(that.data.share, 0, 0, that.data.imageWidth, that.data.imageHeight)
    ctx.drawImage(that.data.exam, 138 + that.data.chaWidth / 2, 10 , 50, 50)
    ctx.drawImage(that.data.phot, 138 + that.data.chaWidth / 2, 10, 50, 50)
    ctx.draw();
  },
 
    //保存圖片觸發(fā)事件
  savePic: function () {       
    var that = this
    wx.canvasToTempFilePath({
      width: that.data.imageWidth,
      height: that.data.imageHeight,
      canvasId: 'myCanvas',
      success: function (res) {
        util.savePicToAlbum(res.tempFilePath)
      }
    })
    setTimeout(function () {
      console.log("----Countdown----")
      wx.redirectTo({
        url: '/pages/my/my/my',
      })
    }, 1000)
   
  }
})

.wxml 前端展現(xiàn)形式

<view>  
    <canvas style="width:{{imageWidth}}px;height:{{imageHeight}}px" canvas-id="myCanvas" class='canvas'></canvas>  
    <!--測試按鈕-->  
    <view class="edit-footer">  
        <button class="button-done" type="primary" bindtap="savePic">保存圖片</button>  
    </view>  
</view>  

util.js 公用方法

function savePicToAlbum(tempFilePath) {  
  let that = this;  
  wx.getSetting({  
    success(res) {  
      if (!res.authSetting['scope.writePhotosAlbum']) {  
        wx.authorize({  
          scope: 'scope.writePhotosAlbum',  
          success() {  
            wx.saveImageToPhotosAlbum({  
              filePath: tempFilePath,  
              success(res) {  
                wx.showToast({  
                  title: '保存成功'  
                });  
              },  
              fail(res) {  
                console.log(res);  
              }  
            })  
          },  
          fail() {  
            // 用戶拒絕授權(quán),打開設(shè)置頁面  
            wx.openSetting({  
              success: function (data) {  
                console.log("openSetting: success");  
              },  
              fail: function (data) {  
                console.log("openSetting: fail");  
              }  
            });  
          }  
        })  
      } else {  
        wx.saveImageToPhotosAlbum({  
          filePath: tempFilePath,  
          success(res) {  
            wx.showToast({  
              title: '保存成功',  
            });  
          },  
          fail(res) {  
            console.log(res);  
          }  
        })  
      }  
    },  
    fail(res) {  
      console.log(res);  
    }  
  })  
}  
function image() {  
  var imageSize = {};  
  var originalScale = 0.2;//圖片高寬比    
  //獲取屏幕寬高    
  wx.getSystemInfo({  
    success: function (res) {  
      var windowWidth = res.windowWidth;  
      var windowHeight = res.windowHeight;  
      var windowscale = windowHeight / windowWidth;//屏幕高寬比    
      console.log('windowWidth: ' + windowWidth)  
      console.log('windowHeight: ' + windowHeight)  
      if (originalScale < windowscale) {//圖片高寬比小于屏幕高寬比    
        //圖片縮放后的寬為屏幕寬    
        imageSize.imageWidth = windowWidth;  
        imageSize.imageHeight = (windowWidth * 400) / 320;  
        imageSize.chaWidth = windowWidth-320;   
        imageSize.chaHeight = (windowWidth * 400) / 320 - 400;   
      } else {//圖片高寬比大于屏幕高寬比    
        //圖片縮放后的高為屏幕高    
        imageSize.imageHeight = windowHeight;  
        imageSize.imageWidth = (windowHeight * 320) / 400;  
        imageSize.chaWidth = windowWidth - 320;  
        imageSize.chaHeight = (windowWidth * 400) / 320 - 400;   
      }  
  
    }  
  })  
  console.log('縮放后的寬: ' + imageSize.imageWidth)  
  console.log('縮放后的高: ' + imageSize.imageHeight)  
  return imageSize;  
}  
module.exports = {  
  formatTime: formatTime,  
  savePicToAlbum: savePicToAlbum,  
  image:image  
}  

服務(wù)器端

create_wxa_code.php 發(fā)起請(qǐng)求獲取頁面小程序碼并保存到服務(wù)器妓肢,返回網(wǎng)絡(luò)地址捌省。

<?php  
include_once('/opt*****/function.php');  
include_once('/opt*****n/config.php');//$appid和$secret保存其中  
$sid = addslashes($_GET['sid']);  
//token存在緩存中  
$access_token=M::Get('q*******en_'.$appid);  
if(!$access_token){  
        $url_access_token = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;  
        $json_access_token = sendCmd($url_access_token,array());  
        //access_token加緩存  
        $arr_access_token = json_decode($json_access_token,true);  
        $access_token = $arr_access_token['access_token'];  
        M::Set('q******ken_'.$appid,$access_token,3600);  
}  
if(!empty($access_token)) {  
    $url = 'https://api.weixin.qq.com/wxa/getwxacode?access_token='.$access_token;      
    $data = '{"path": "/pages/a*****/index?id='.$sid.'", "width":430}';  
        $result = sendCmd($url,$data);  
  
    $dir = "/opt/c******wxaapp/";  
    $path = $dir.date("Y/m/d/")."/".rand(1,50)."/";  
    create_dirs($path,0777);  
    $file_name = time().".png";  
          
    file_put_contents($path.$file_name,$result);  
    $url = 'https://www.q****om/'.str_replace('/op*****baby/','',$path.$file_name);  
  
    $arr = array('ret'=>1,  
        'msg'=>'success',  
        'data'=>array('url'=>$url),   //返回保存在服務(wù)器中小程序碼的地址  
        );  
} else {  
    $arr = array('ret'=>0,'msg'=>'ACCESS TOKEN為空!');  
}  
    echo json_encode($arr);  
  
  
/** 
 * 發(fā)起請(qǐng)求 
 * @param  string $url  請(qǐng)求地址 
 * @param  string $data 請(qǐng)求數(shù)據(jù)包 
 * @return   string      請(qǐng)求返回?cái)?shù)據(jù) 
 */  
function sendCmd($url,$data)  
{  
    $curl = curl_init(); // 啟動(dòng)一個(gè)CURL會(huì)話        
    curl_setopt($curl, CURLOPT_URL, $url); // 要訪問的地址                    
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 對(duì)認(rèn)證證書來源的檢測      
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 從證書中檢查SSL加密算法是否存在        
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:')); //解決數(shù)據(jù)包大不能提交       
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自動(dòng)跳轉(zhuǎn)        
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自動(dòng)設(shè)置Referer        
    curl_setopt($curl, CURLOPT_POST, 1); // 發(fā)送一個(gè)常規(guī)的Post請(qǐng)求        
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的數(shù)據(jù)包        
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 設(shè)置超時(shí)限制防止死循       
    curl_setopt($curl, CURLOPT_HEADER, 0); // 顯示返回的Header區(qū)域內(nèi)容        
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 獲取的信息以文件流的形式返回   
             
    $tmpInfo = curl_exec($curl); // 執(zhí)行操作        
    if (curl_errno($curl)) {        
       echo 'Errno'.curl_error($curl);        
    }        
    curl_close($curl); // 關(guān)鍵CURL會(huì)話        
    return $tmpInfo; // 返回?cái)?shù)據(jù)        
}  
?> 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碉钠,一起剝皮案震驚了整個(gè)濱河市纲缓,隨后出現(xiàn)的幾起案子卷拘,更是在濱河造成了極大的恐慌,老刑警劉巖祝高,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栗弟,死亡現(xiàn)場離奇詭異,居然都是意外死亡工闺,警方通過查閱死者的電腦和手機(jī)乍赫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陆蟆,“玉大人雷厂,你說我怎么就攤上這事〉螅” “怎么了改鲫?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長林束。 經(jīng)常有香客問我像棘,道長,這世上最難降的妖魔是什么诊县? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任讲弄,我火速辦了婚禮,結(jié)果婚禮上依痊,老公的妹妹穿的比我還像新娘避除。我一直安慰自己,他們只是感情好胸嘁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布瓶摆。 她就那樣靜靜地躺著,像睡著了一般性宏。 火紅的嫁衣襯著肌膚如雪群井。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天毫胜,我揣著相機(jī)與錄音书斜,去河邊找鬼。 笑死酵使,一個(gè)胖子當(dāng)著我的面吹牛荐吉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播口渔,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼样屠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痪欲,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤悦穿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后业踢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栗柒,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年知举,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了傍衡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡负蠕,死狀恐怖蛙埂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遮糖,我是刑警寧澤绣的,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站欲账,受9級(jí)特大地震影響屡江,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赛不,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一惩嘉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踢故,春花似錦文黎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淋纲,卻和暖如春劳闹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洽瞬。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工本涕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伙窃。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓菩颖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親对供。 傳聞我的和親對(duì)象是個(gè)殘疾皇子位他,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,787評(píng)論 25 707
  • 轉(zhuǎn)載鏈接 注:本文轉(zhuǎn)載知乎上的回答 作者:初雪 鏈接:https://www.zhihu.com/question...
    pengshuangta閱讀 28,504評(píng)論 9 295
  • 11月24日晚鲤拿,在浙江省人民大會(huì)堂添瓷,看了一場經(jīng)常的話劇演出——《獨(dú)自溫暖》。 全劇主要演員四人廓八,從德國歸來的老婦人...
    慢慢慢慢二拍姐閱讀 342評(píng)論 0 0
  • 你的名字京景,我的心事窿冯。 前幾天剛剛和朋友一起看過《你的名字》,一陣感動(dòng)确徙。恰巧進(jìn)電影院之前天氣灰蒙蒙的醒串,出來的時(shí)候一片...
    天空吥會(huì)掉眼淚閱讀 269評(píng)論 0 0
  • 每當(dāng)夜晚,黑暗覆蓋我的眼睛 夢想的花蕾隨即含苞待放 一幅幅成功 一幕幕風(fēng)光 都會(huì)讓我勾起嘴角 理想的生活鄙皇,不遠(yuǎn)了嗎...
    _秋千qiuqian閱讀 179評(píng)論 0 1