情景
关于微信端的操作,经常会遇见,要生成菊花二维码,邀请好友助力,或者参团之类的业务操作,这时,就需要生成一个二维码,给到前端,那么,怎么用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函数的使用,以及图片文件的处理。掌握了这三点,生成微信二维码就没有什么难的了!总而言之,编程这条路,就是得多练、多想、多总结,这样,才能不断进步!任重道远,上下求索!