生成小程式二維碼(二進位制資料流轉圖片儲存上傳七牛)

SanXiao發表於2021-12-01

公司專案小程式分享海報需要太陽碼、基於這一點去看了下小程式碼文件
文件提供了三個方法,可根據專案場景選擇適合的。

一. 小程式碼

1、生成小程式碼的前提需要拿到 access_token
官方給的介面:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;

2、 生成小程式碼:POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

透過上面的方法會直接返回圖片二進位制內容,但是前端如果需要處理成海報那就不太友好了,所以需要後端處理一下,最好返回一個靜態資源地址。
下面具體說一下怎麼處理這個二進位制圖片,下面封裝的程式碼我也會貼出來。

二. 處理二進位制

1、二進位制轉base64
/* 二進位制轉圖片image/png*/
    //$contents 二進位制圖片   $mime  'image/jpeg'
    public  function data_uri($contents, $mime)
    {
        $base64 = base64_encode($contents);
        return 'data:' . $mime . ';base64,' . $base64;
    }
2、上傳七牛雲(二進位制檔案生成本地檔案:base64Upload,由本地上傳到七牛雲)
 public  function base64ToOss($base64){
        $result = $this->base64Upload($base64);
        if ($result['code'] != 200) {
            return ['code' => $result['code'], 'msg' => $result['msg']];
        }
        $fileResult  = &$result['data'];
        $filePath    = '/upload/image/' . $fileResult['name'];
//        $filePath =  $fileResult['path'] . $fileResult['name'];
        $ossFileName = implode('/', ['upload/image', $fileResult['name']]);
        try {
            //上傳七牛
             $arr = $this->uploadQiniu($ossFileName,$filePath);
        } catch (\Exception $e) {
            return ['code' => 400, 'msg' => $e->getMessage()];
        } finally {
            unlink('.'.$filePath);
        }
        return ['code' => 200, 'info' => $arr];
    }

下面是生成本地檔案的方法

public  function base64Upload($base64, $path = '')
    {
//        dd($base64);;
        $data = explode(',', $base64);
        unset($base64);
        if (count($data) !== 2) {
            return ['code' => 400, 'msg' => '檔案格式錯誤'];
        }
        if (preg_match('/^(data:\s*image\/(\w+);base64)/', $data[0], $result)) {
            $type = $result[2];
            if (!in_array($type, array('jpeg', 'jpg', 'gif', 'bmp', 'png'))) {
                return ['code' => 400, 'msg' => '檔案格式不在允許範圍內'];
            }
            $image_name = md5(uniqid()) . '.' . $result[2];
            $image_path = "./upload/image/";
            $image_file = $image_path . $image_name;
            if (!file_exists($image_path)) {
                mkdir($image_path, 777, true);
            }
            //伺服器檔案儲存路徑
                if (file_put_contents($image_file, base64_decode($data[1])) == true)  {
                    return ['code' => 200, 'msg' => '成功', 'data' => ['name' => $image_name, 'path' => $image_path]];
                } else {
                    return ['code' => 400, 'msg' => '檔案儲存失敗'];
                }
        }
        return ['code' => 400, 'msg' => '檔案格式錯誤'];
    }

以及傳七牛的方法
前提是你需要先執行:

composer require zgldh/qiniu-laravel-storage
public function uploadQiniu( $img,  $filename)
    {
        $disk = QiniuStorage::disk('qiniu'); //使用七牛雲上傳
        $res = $disk->put($filename, file_get_contents($img));//上傳
        \Log::info('二維碼 七牛上傳', [$res]);
        $filepath = env('QINIU_DOMAIN', 'http://qiniu-photo.jinshouping.com') .$filename;
        return $filepath;
    }

以上就是拿到小程式太陽碼生成靜態地址的方法。多多交流。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
過去心不可得,現在心不可得,未來心不可得

相關文章