一、前言
1、官方开发文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html
2、项目要上线才可以生成哦
二、生成二维码方法(Tp5.0版)
//生成企业二维码
public function createCompanyEwm(){
$post =input();
if(!isset($post[\'id\'])||empty($post[\'token\'])){
$param = array(
\'code\' => 0,
\'msg\' =>\'参数错误!\',
);
return json($param);
}
$peizhi = [];
//获取配置
$peizhi[\'appid\']=Db::name(\'config\')->where([\'name\'=>\'appid\'])->value(\'value\');
$peizhi[\'appsecret\']=Db::name(\'config\')->where([\'name\'=>\'appsercet\'])->value(\'value\');
$peizhi[\'qn_domain\']=Db::name(\'config\')->where([\'name\'=>\'qn_domain\'])->value(\'value\');
$token_content=file_get_contents("common_token.txt");//用于存储access_token
if($token_content==\'\'){//获取新的access_token
$token_result=$this ->get_new_token($peizhi);
$res= $token_result[\'res\'];
$new = $token_result[\'new\'];
//判断失败
if(!$new[\'access_token\']){
$param = array(
\'code\' => 0,
\'msg\' =>\'获取token失败!\',
\'new\'=>$new
);
return json($param);
}
$access_token=$new[\'access_token\'];
//更新token缓存
$maxTime=time()+intval($new[\'expires_in\']);
$access_arr=str_replace(\'}\', ",\"maxTime\":".$maxTime."}", $res);
file_put_contents("common_token.txt",$access_arr);
}else{
$token_arr=json_decode($token_content,true);
if(intval($token_arr[\'maxTime\'])<time()){
$token_result=$this ->get_new_token($peizhi);
$res= $token_result[\'res\'];
$new = $token_result[\'new\'];
if(!$new[\'access_token\']){
$param = array(
\'code\' => 0,
\'msg\' =>\'获取token失败!\',
\'errcode\'=>$new[\'errcode\']
);
return json($param);
}
$access_token=$new[\'access_token\'];
$maxTime=time()+intval($new[\'expires_in\']);
$access_arr=str_replace(\'}\', ",\"maxTime\":".$maxTime."}", $res);
file_put_contents("common_token.txt",$access_arr);
}else{
$access_token=$token_arr[\'access_token\'];
}
}
if($access_token==\'\'||strlen($access_token)<10){
$param = array(
\'code\' => 0,
\'msg\' =>\'获取token失败!\',
);
return json($param);
}
$url="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$access_token;
$data=array(
\'scene\'=>intval($post[\'id\']).\',\'.trim($post[\'token\']),
\'page\'=>\'pages/details/details\',
\'width\'=>430,
\'auto_color\'=>true,
\'is_hyaline\'=>false
);
//header("Content-type: image/jpg");
$ewm_res= $this->api_notice_increment($url,json_encode($data));
$dejson_ewm_res=json_decode($ewm_res,1);
if($dejson_ewm_res[\'errcode\']==41030){
$param = array(
\'code\' => 0,
\'msg\' =>\'所传page页面不存在,或者小程序没有发布\',
\'dejson_ewm_res\'=>$dejson_ewm_res
);
return json($param);
}
if($dejson_ewm_res[\'errcode\']==45009){
$param = array(
\'code\' => 0,
\'msg\' =>\'调用分钟频率受限(目前5000次/分钟,会调整),如需大量小程序码,建议预生成。\',
\'dejson_ewm_res\'=>$dejson_ewm_res
);
return json($param);
}
if($dejson_ewm_res[\'errcode\']==40001){//token无效
$token_result=$this ->get_new_token($peizhi);
$res= $token_result[\'res\'];
$new = $token_result[\'new\'];
$access_token=$new[\'access_token\'];
$maxTime=time()+intval($new[\'expires_in\']);
$access_arr=str_replace(\'}\', ",\"maxTime\":".$maxTime."}", $res);
file_put_contents("common_token.txt",$access_arr);
$url="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$access_token;
//header("Content-type: image/jpg");
$ewm_res= $this->api_notice_increment($url,json_encode($data));
}
$img=$this->change_picture($ewm_res);
$base64_img=$this->base64EncodeImage($img);
$this->delDirAndFile(\'./public/uploads/temporary/\');
error_reporting(0);
//上传到七牛
$Qiniu=new Qiniu();
$data=json_decode($Qiniu->liuUpload($base64_img),true);
$data[\'url\']=\'http://\'.$peizhi[\'qn_domain\'].\'/\'.$data[\'hash\'];
$file_exists=file_exists_get($data[\'url\']);
if(!$file_exists){
return json([\'code\'=>0,\'msg\'=>\'生成失败!\']);
}
//数据存入数据库
$companyObj = new CompanyModel();
$flag = $companyObj->editCompany([\'id\'=>$post[\'id\'],\'ewm\'=>$data[\'url\'],\'addtime\'=>time()]);
$param = array(
\'code\' => 1,
\'msg\' =>\'获取成功\',
\'data\'=>$data,
);
return json($param);
}
//获取新的token
function get_new_token($peizhi){
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$peizhi[\'appid\']."&secret=".$peizhi[\'appsecret\'];
$res= httpRequest($url);
$new = json_decode($res,1);
$result=array(\'res\'=>$res,\'new\'=>$new);
return $result;
}
//网络requst
function httpRequest($url,$data = null){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//执行
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
/**
* 网络请求-用于获取二维码函数
* @param [type] $url [description]
* @param [type] $data [description]
* @return [type] [description]
*/
function api_notice_increment($url, $data){
$ch = curl_init();
$header = ["Content-type: image/jpg"];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, \'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)\');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
curl_close($ch);
return $tmpInfo;
}
//二进制二维码图片buffer,保存为临时图片
public function change_picture($imgs){
$path="./public/uploads/temporary/";
if(!is_dir($path)){
mkdir($path);
}
$new_file = "./public/uploads/temporary/" .\'ewm\'.date(\'Y-m-d\',time()).getRandomString(8).".jpg"; //生成图片的名字
if(!empty($imgs)){
$file = fopen($new_file,"w");//打开文件准备写入
fwrite($file,$imgs);//写入
fclose($file);//关闭
}
return $new_file;
}
3、小程序获取参数
Page({
onLoad(query) {
// scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
const scene = decodeURIComponent(query.scene)
}
})