OkHttp調(diào)用微信小程序二維碼接口照片是黑屏

使用OkHttp對接微信小程序接口,獲取到小程序返回的二維碼照片信息后保存到騰訊云COS進行存儲喜爷。

對接文檔:小程序碼wxacode.getUnlimited

1. 問題描述:

上傳到騰訊云顯示的照片.png

最終上傳到騰訊云的照片打開是黑屏的(問題的原因就是照片損壞)琳水。

但是:調(diào)用原生微信接口是可以獲取到小程序碼向臀。

問題就是出在自己的業(yè)務(wù)代碼芥吟。

image.png

注意點:當微信返回異常時获列,不會返回照片byte[]逗爹,返回的JSON格式的byte[]亡嫌,不能轉(zhuǎn)換為Base64后上傳到騰訊云COS,否則就會出現(xiàn)照片“黑屏”的情況掘而。

但是:微信接口能正常返回小程序碼挟冠。所以不是上面的情況。

2. 問題定位:

原因是微信小程序接口返回的body的source字段本身就是照片流袍睡,將其轉(zhuǎn)換字符串知染,然后獲取字符串的流,導(dǎo)致文件損壞斑胜,出現(xiàn)黑屏現(xiàn)象控淡。

image.png
image.png

正確代碼:

public class WxQrCodeServiceImpl implements WxQrCodeService {

    private Logger logger = LoggerFactory.getLogger(WxQrCodeServiceImpl.class);

    public static final String IMAGE_GIF_VALUE = "image/gif";
    public static final String IMAGE_JPEG_VALUE = "image/jpeg";
    public static final String IMAGE_PNG_VALUE = "image/png";


    @Override
    public WxQrCode getWxQrCode(String accessToken, QrCodeDTO qrCodeDTO) {
        if (Objects.isNull(accessToken) || Objects.isNull(qrCodeDTO.getScene()) || qrCodeDTO.getScene().length() > SCENE_MAX_LENGTH) {
            throw new IllegalArgumentException("參數(shù)不正確");
        }
        //使用OkHttp調(diào)用微信接口返回Response對象
        Response response = OkHttpUtil.postForResponse(String.format(GET_QR_CODE_URL, accessToken), null, GSON.toJson(qrCodeDTO));
        if (Objects.nonNull(response) && response.isSuccessful() && Objects.nonNull(response.body())) {
            try {
                WxQrCode wxQrCode = new WxQrCode();
                Optional.ofNullable(response.body().contentType()).ifPresent(s -> wxQrCode.setContentType(s.toString()));
                wxQrCode.setContentLength(response.body().contentLength());
                //圖片類型轉(zhuǎn)換為Base64
                if (isImg(wxQrCode.getContentType())) {
                    wxQrCode.setCode(new String(Base64.getEncoder().encode(response.body().bytes())));
                } else {
                    //非圖片類型直接拋出異常
                    throw new RuntimeException("獲取微信二維碼接口失敗:" + response.body().string());
                }
                return wxQrCode;
            } catch (Exception e) {
                logger.error("獲取二維碼系統(tǒng)失敗", e);
            }
        }
        return null;
    }

    /**
     * 判斷是否是照片類型
     * @param type 請求的content-type
     * @return true:照片類型止潘,false:非照片類型
     */
    private boolean isImg(String type) {
        // 返回的類型若為圖片掺炭,則成功
        if (type != null && (type.equals(IMAGE_GIF_VALUE)
                || type.equals(IMAGE_JPEG_VALUE)
                || type.equals(IMAGE_PNG_VALUE))) {
            return true;
        }
        return false;
    }

}

3. 擴展—讀取照片轉(zhuǎn)換為Base64的方式


import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Base64;


public class Imagebase64 {

    /**
     * base64照片的前綴
     */
    public static String BASE64_PREFIX = "data:image/png;base64,";


    public static void main(String[] args) {
        //獲取到Base64
        String imageBinary = getImageBinary();
        base64StringToImage(imageBinary);
    }

    /**
     * 讀取照片獲取base64
     * @return
     */
    static String getImageBinary() {
        File f = new File("/Users/xxx/Downloads/input.png");
        try {
            BufferedImage bi = ImageIO.read(f);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(bi, "jpg", baos);
            //讀出的是流
            byte[] bytes = baos.toByteArray();
            //轉(zhuǎn)換為base64
            return BASE64_PREFIX + new String(Base64.getEncoder().encode(bytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    static void base64StringToImage(String base64String) {
        try {
            //截取base64照片的前綴
            String[] d = base64String.split("base64,");
            //原始照片流
            String base64 = d[1];
            //base64轉(zhuǎn)換為數(shù)組
            byte[] decode = Base64.getDecoder().decode(base64);
            //IO讀取到本地
            ByteArrayInputStream bais = new ByteArrayInputStream(decode);
            BufferedImage bi1 = ImageIO.read(bais);
            File f1 = new File("/Users/xxx/Downloads/out.jpg");
            ImageIO.write(bi1, "jpg", f1);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凭戴,隨后出現(xiàn)的幾起案子涧狮,更是在濱河造成了極大的恐慌,老刑警劉巖么夫,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件者冤,死亡現(xiàn)場離奇詭異,居然都是意外死亡档痪,警方通過查閱死者的電腦和手機涉枫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腐螟,“玉大人愿汰,你說我怎么就攤上這事困后。” “怎么了尼桶?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵操灿,是天一觀的道長。 經(jīng)常有香客問我泵督,道長趾盐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任小腊,我火速辦了婚禮救鲤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秩冈。我一直安慰自己本缠,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布入问。 她就那樣靜靜地躺著丹锹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芬失。 梳的紋絲不亂的頭發(fā)上楣黍,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音棱烂,去河邊找鬼租漂。 笑死,一個胖子當著我的面吹牛颊糜,可吹牛的內(nèi)容都是我干的哩治。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼衬鱼,長吁一口氣:“原來是場噩夢啊……” “哼业筏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸟赫,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蒜胖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惯疙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡妖啥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年霉颠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荆虱。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒿偎,死狀恐怖朽们,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诉位,我是刑警寧澤骑脱,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站苍糠,受9級特大地震影響叁丧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岳瞭,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一拥娄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞳筏,春花似錦稚瘾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柱宦,卻和暖如春些椒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捷沸。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工摊沉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痒给。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓说墨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苍柏。 傳聞我的和親對象是個殘疾皇子尼斧,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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