微信公众号开发之上传图片(附AccessToken获取和处理)

封面

最近看卡券功能的时候,创建卡券的时候涉及到上传图片的操作,但官方文档里面描述似乎有一点问题,在这里做一个记录。AccessToken的获取和处理放后面。

开发语言用的是PHP 7.0,使用CodeIgniter框架。

官方文档:上传卡券图片素材

上传图片

请求地址说明:

HTTP请求方式: POST/FROMURL:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN

文档里参数是bufferaccess_token,但实际测试下来是不行的,后来网上搜索和查看素材管理相关信息后,发现需要参数为mediaaccess_tokentype

代码如下:

// access_token和type参数
$params = [];

// getAccessToken获取access_token的函数,如何获取查看官方文档
$params['access_token'] = $this->getAccessToken();
$params['type'] = "image";
$url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg";

// 拼接后为 url?access_token=xxx&type=image
$url = $url.'?'.http_build_query($params);

// 相对于网站的图片的绝对路径
$filename = "/path/sample.png";

// 图片在服务器上的真是路径,如果是前端上传的,可以另行获取,这里使用的是网站上的图片作为测试
$real_path = $_SERVER['DOCUMENT_ROOT'].$filename;

// 图片data
$file_data = array("media"=> new \CURLFile($real_path));

// 发送请求
$res = $this->post($url, $file_data, false);
var_dump($res);

如果不出错最后返回的信息为:

array(1) {
  ["url"]=>
  string(125) "xxxxx"
}

post函数:

private function post($url, $data = [], $json_encode=true) {
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
    if ($data != null) {
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        // curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
        if(gettype($data)==="string") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        else {
            if ($json_encode) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
            } else {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
        }
    }
    curl_setopt($curl, CURLOPT_TIMEOUT, 300); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    $res = curl_exec($curl); // 执行操作
    curl_close($curl);

    $data = json_decode($res, true);
    if($data==NULL) {
        return $res;
    }
    else {
        return $data;
    }
}

json_encodefalse的话,就不会进行json_encode。比如上面上传图片传入的是一个CURLFile,如果json_encode就会上传失败。

AccessToken的获取和处理

官方文档:获取access_token

官方文档中建议建立一个刷新机制,不要每次使用access_token的时候都去重新获取,详情请仔细阅读官方文档。

请求地址说明:

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数为grant_typeappidsecret,具体信息可查看官方文档。

accessToken处理示意图

代码:
设置cache和相关信息:

public function __construct() {
    parent::__construct();
    
    $this->load->driver(
        'cache',
        array('adapter' => 'apc', 'backup' => 'file', 'key_prefix' => 'wechat_')
    );

    // 公众号appid 和 appsecrect
    $this->appid = 'xxx';
    $this->secret = 'xxx';
}

获取accessToken:

private function getAccessToken() {
    $appid = $this->appid;
    $secret = $this->secret;

    // 设置cache key,这里是 wechat_[appid]_access_token,保存成功可以到/webpath/application/cache查看
    // 如果想用其他方式保存也可以做相应更改
    $key = $this->appid.'_access_token';

    // 如果cache中没有accessToken或者已过期,重新获取或刷新
    if (!$accessToken = $this->cache->get($key)) {
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";

        $res = $this->post($url);

        $accessToken = $res['access_token'];

        // 保存accessToken
        $this->cache->save($key, $accessToken, $res['expires_in']);
    }

    return $accessToken;
}

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 1、开启公众号开发者模式 公众平台的技术文档目的为了简明扼要的交代接口的使用,语句难免苦涩难懂,甚至对于不同的读者...
    good7758阅读 1,505评论 0 1
  • 很早前就想了解下微信公众号开发,懒和拖延症让这计划迟迟没落实,正巧新项目有了微信公众号的业务,我心中没数地回应,我...
    英文名叫夏天阅读 4,402评论 1 4
  • 微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理...
    伍华聪_开发框架阅读 1,576评论 0 51
  • 玉溪佳人来,携君仙湖呆。 晚晴同舟渡,云天共徘徊。 生活怎能没有诗意,可以独行千里纵观山川之美、原野之旷、大地之博...
    窗花阅读 198评论 0 1
  • 秋叶,不是非要看金杏红枫,随便一树都充满诗情画意。不知为什么有那么多伤春悲秋的文字,秋天明明是一个明丽多彩、果实累...
    xhy0606阅读 454评论 2 6