PHP之 生成"菊花状"的二维码图片代码

情景

关于微信端的操作,经常会遇见,要生成菊花二维码,邀请好友助力,或者参团之类的业务操作,这时,就需要生成一个二维码,给到前端,那么,怎么用PHP如何生成呢?操作如下:

第一步:生成 access_token,做好准备工作

/**
 * 获取access_token值
 * @return string $access_token
 */
public function get_access_token()
{
    $appConfig = [
        'app_id' => 'wxd92dsdfsdfec5efc',
        'secret' => 'ec18798a8dsdfsdfsdfa7d29106'
    ];
    $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appConfig['app_id'].'&secret='.$appConfig['secret'];
    $ch = curl_init(); // 创建句柄
    curl_setopt($ch, CURLOPT_URL, $url); // 通过url获取数据
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书验证
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是
    $output = json_decode(curl_exec($ch));
    $access_token = $output->access_token;
    curl_close($ch);
    return $access_token;
}

第二步:业务操作,需相关的业务参数,带进生成“二维码图片中”

/**
 * 生成【邀请好友入团的 | 帮好友助力的】二维码
 * @param $type
 * @param $userid
 * @param $usg_id
 * @return array
 */
public function product_step_active_QRcode($type, $userid, $usg_id)
{
    // 获取 redis中的 redis_access_token 值
    $this->load->service('order_service');
    $access_token = $this->get_access_token();
    if(!$access_token){
        $result['data'] = [];
        return $result;
    }
    // 关键参数
    $scene = $usg_id.'_'.$userid.'_'.$type;
    // 图片名称
    $imgName = 'step_active_QRcode_'.$scene;
    // 请求图片地址
    $url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='.$access_token;
    // 请求参数
    $request = [];
    $request['scene'] = $scene;
    $request['page'] = 'pages/septemberActivity/index'; // 扫码跳转页面
    $request['width'] = 280; //小程序大小设置 px
    $request['is_hyaline'] = TRUE; //是否需要透明底色
    // 从微信端请求数据
    $Qr_code = $this->curl_post_weixin($url, $request);
    // 将获得的数据读到一个临时图片里
    file_put_contents('/tmp/'.$imgName.'.png', $Qr_code);
    // 将图片文件转化为base64
    $img_string = $this->fileToBase64('/tmp/'.$imgName.'.png');
    // 删除临时文件
    unlink('/tmp/'.$imgName.'.png');
    // 返回数据
    $result['data'] = $img_string;
    return $result;
}

第三步:需要通过cURL方式,将业务参数通过请求图片地址给到微信端,返回二维码的数据

/**
 * cURL方式POST数据到微信
 * @param string $url 请求地址
 * @param array $data 发送数据
 * @return resource
 */
public function curl_post_weixin($url, $data)
{
    if($url && count($data)){
        $headers = ['Content-Type:application/json'];
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 关键点
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        $res = curl_exec($ch);
        curl_close($ch);
        return $res;
    }
}

第四步:将微信端返回并保存到本地临时文件的图片,转换为64位码(方便给到前端)

/**
 * 本地文件转base64
 * @param $image_file
 * @return mixed
 */
function fileToBase64 ($image_file) {
    $base64_image = '';
    $image_info = getimagesize($image_file);
    $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
    $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
    return $base64_image;
}

总结

生成微信二维码图片,关键点在于:微信常见业务代码流程的熟悉度,cURL函数的使用,以及图片文件的处理。掌握了这三点,生成微信二维码就没有什么难的了!总而言之,编程这条路,就是得多练、多想、多总结,这样,才能不断进步!任重道远,上下求索!
发布了59 篇原创文章 · 获赞 2 · 访问量 5584

猜你喜欢

转载自blog.csdn.net/LDR1109/article/details/100945658