微信公众号开发(八)生成带参数二维码,以及将二维码下载至本地

1,616 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第35天,点击查看活动详情

微信的二维码真是个神奇的东西。在我们开发中,应用也是很多~

用户扫描带场景值(参数)二维码时,可能推送以下两种事件:

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。

获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。

以上这部分是官方给我们的扫描带参数二维码的一个解释……嗯,很官方。看着感觉好难的样子,其实就那样。

逻辑部分,官方已经给出,我就不赘述了,读懂上边官方文档中的那段话的逻辑就好。

下边,有我在实际项目中应用的创建带参数二维码并且,在创建成功之后下载到本地的一个方法,具体的,代码中都有注释。

/**
     * @name: 创建签到/签出/学生二维码
     * @desc: 描述
     * @author: camellia
     * @date: 20201201
* @email: guanchao_gc@qq.com
     * @param:  $open_id    string  1234@@@sign_in  1234@@@sign_out  1234@@@scan_add
     */
    public function createQrCode($open_id)
{
    // 获取 access_token 代码
        $access_token $this->access_token();
        $ch curl_init("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=$access_token");
        $jsondata['expire_seconds'] = 86400;
        $jsondata['action_name'] = 'QR_STR_SCENE';
        $jsondata['action_info']['scene']['scene_str'] = $open_id;
        $jsondata['action_info']['scene']['scene_sign'] = 'sign_in';
        $data json_encode($jsondata);
 
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $res curl_exec($ch);
        $tickarr json_decode($restrue);
        $url $this->createQrCodeByTick($tickarr['ticket']);
        return $url;
    }
 
    /**
     * @name: 创建签到/签出/学生二维码
     * @desc: 描述
     * @author: camellia
     * @date: 20210917
      * @email: guanchao_gc@qq.com
     * @param:  $ticket string  唯一字符串
     */
    public function createQrCodeByTick($ticket)
    {
        $url "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" . urlencode($ticket);
        $imageInfo $this->downLoadWeiXinQrcode($url);
        $filename 'qrcode_' . date("Y-m-d_H_i_s") . '.jpg';
        $filepath './uploads/openQrcode/' . $filename;
        $local_file fopen($filepath'w');
        if (false !== $local_file) {
            if (false !== fwrite($local_file$imageInfo['body'])) {
                fclose($local_file);
            }
        }
        $url getenv('APP_URL') . "/xxxxxx/xxx/xxxxxxxxx/public/ " . $filename;
        return $url;
    }
 
    /**
     * @name: 下载微信生成的二维码
     * @author: camellia
     * @date: 2021-12-08
* @email: guanchao_gc@qq.com
     * @param:  $url    string  二维码链接
     */
    public function downLoadWeiXinQrcode($url)
    {
        $ch curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_NOBODY, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $package curl_exec($ch);
        $httpinfo curl_getinfo($ch);
        curl_close($ch);
        return array_merge(
            array('body' => $package),
            array('header' => $httpinfo)
        );
    }

上边的代码中,获取access_token的方法使用的是我封装的公共方法,详情请移步《微信公众号开发(二)微信公众号的access_token

除了这部分,其他的应该不需要做太多的修改就可以使用了。

有好的建议吗,请在下方输入你的评论。

欢迎访问个人博客 guanchao.site

欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”