技术饭
PHP获取微信小程序二维码、商品二维码、页面二维码
copylian
0 评论
25736 浏览
2019.01.21
获取二维码
通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面,所有生成的二维码永久有效,可放心使用。目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所示:
可以使用开发工具 1.02.1803130 及以后版本通过二维码编译功能调试所获得的二维码
为满足不同需求和场景,这里提供了三个接口,开发者可挑选适合自己的接口。
生成小程序码,可接受 path 参数较长,生成个数受限,数量限制见 注意事项,请谨慎使用。
生成小程序码,可接受页面参数较短,生成个数不受限。
生成二维码,可接受 path 参数较长,生成个数受限,数量限制见 注意事项。
我们推荐生成并使用小程序码,它具有更好的辨识度。
注意事项
接口只能生成已发布的小程序的二维码接口 A 加上接口 C,总共生成的码数量限制为 100,000,请谨慎调用。接口 B 调用分钟频率受限(5000次/分钟),如需大量小程序码,建议预生成。
正常使用接口B:https://developers.weixin.qq.com/miniprogram/dev/api/getWXACodeUnlimit.html
这个接口需要注意的是参数page而不是path,其他两个接口是path,而且请认真阅读page参数的说明。
PHP部分:
/** * [getCode 获取分享二维码] */ public function getCode(){ //当前用户ID $this->member_id = 100; //文章ID $article_id = $this->request->post('article_id',0); //商品ID $shop_product_id = $this->request->post('shop_product_id',0); //小程序跳转路径 $sharePath = $this->request->post('path',''); //类型:1-文章,2-商品 $share_type = $this->request->post('share_type',1); //回调参数,结合path使用,比如:2-5,第一个2表示:用户ID,第二个参数表示:文章或者商品ID,微信扫码之后会把这个参数带回来 $share_scene = $this->request->post('share_scene',''); if ($share_type == 1){ //文章分享二维码 $shareFilePath = 'article'; } elseif ($share_type == 2) { //商城分享二维码 $shareFilePath = 'shop'; } //处理path,去除小程序路径前的 / 符号 $sharePath = preg_replace('/\/pages/', 'pages', $sharePath); //生成二维码可重复,所以将图片生成之后存到服务器中 $mkdir = 'static/upload/wxCode/'.$shareFilePath; $filePath = $mkdir.'/wxCode_' . $this->member_id .'_'.$share_scene. '.jpg'; if(!file_exists($filePath)){ $wxCode = new WxCode(); $appid = '小程序AppID'; $appsecret = '小程序AppSecret'; $code = $wxCode->getXcxCode($appid, $appsecret ,$share_scene, $sharePath); //判断是否生成二维码错误 $resdata = json_decode($code); if(is_array($resdata) && isset($resdata['errcode'])){ file_put_contents('1.txt', $resdata, FILE_APPEND); } //创建目录 if(!is_dir($mkdir)){ mkdir($mkdir, 0777, 1); } //将二级制图片存入服务器,file_put_contents() 方法可能有欠缺 file_put_contents($filePath,$code); } //生成图片地址给前端 $codePath = $this->request->domain() . '/' . $mkdir . '/wxCode_' . $this->member_id.'_'.$share_scene. '.jpg'; $res = [ 'codePath' => $codePath, 'member_avatarUrl' => $member['member_avatarUrl'], //'member_avatarUrl' => url('base/getRouteImg',['url'=>encode($member['member_avatarUrl'])],false,true), 'member_nickname' => $member['member_nickname'] ]; return json($res); }
<?php /** * Author [ CopyLian ] * Date: [ 2018.11.10 ] * Email: [ copylian@aikehou.com ] * Site: [ https://www.copylian.com/ ] * Description: [ 小程序二维码生成 ] */ namespace wechat; class WxCode { public function getXcxCode($appid,$appsecret,$id,$path = 'pages/index/index',$width = 120) { $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" . $this->_getAccessToken($appid,$appsecret); $data = [ 'width' => $width, 'auto_color' => false, 'page' => $path, 'is_hyaline' => true, 'scene' => $id ]; $data = json_encode($data); //file_put_contents('1.txt',$data, FILE_APPEND); $result = $this->_requestPost($url,$data); return $result; } /** * 获取 access_tonken * @param string $token_file 用来存储token的临时文件 */ private function _getAccessToken($appid,$appsecret) { $cacheKey = 'access_token_appid_' . $appid; if(cache($cacheKey)) { return cache($cacheKey); } // 目标URL: $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $appsecret; //向该URL,发送GET请求 $result = $this->_requestGet($url); if(!$result) { return false; } // 存在返回响应结果 $result_obj = json_decode($result); // 写入 cache($cacheKey,$result_obj->access_token,7000); return $result_obj->access_token; } /** * 发送GET请求的方法 * @param string $url URL * @param bool $ssl 是否为https协议 * @return string 响应主体Content */ protected function _requestGet($url,$ssl = true) { // curl完成 $curl = curl_init(); //设置curl选项 curl_setopt($curl,CURLOPT_URL,$url);//URL $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4'; curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);//user_agent,请求代理信息 curl_setopt($curl,CURLOPT_AUTOREFERER,true);//referer头,请求来源 curl_setopt($curl,CURLOPT_TIMEOUT,30);//设置超时时间 //SSL相关 if($ssl) { curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证 curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);//检查服务器SSL证书中是否存在一个公用名(common name)。 } curl_setopt($curl,CURLOPT_HEADER,false);//是否处理响应头 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);//curl_exec()是否返回响应结果 // 发出请求 $response = curl_exec($curl); if(false === $response) { echo '<br>',curl_error($curl),'<br>'; return false; } curl_close($curl); return $response; } /** * 发送GET请求的方法 * @param string $url URL * @param bool $ssl 是否为https协议 * @return string 响应主体Content */ protected function _requestPost($url,$data,$ssl = true) { //curl完成 $curl = curl_init(); //设置curl选项 curl_setopt($curl,CURLOPT_URL,$url);//URL $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4'; curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);//user_agent,请求代理信息 curl_setopt($curl,CURLOPT_AUTOREFERER,true);//referer头,请求来源 curl_setopt($curl,CURLOPT_TIMEOUT,30);//设置超时时间 //SSL相关 if($ssl) { curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证 curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);//检查服务器SSL证书中是否存在一个公用名(common name)。 } // 处理post相关选项 curl_setopt($curl,CURLOPT_POST,true);// 是否为POST请求 curl_setopt($curl,CURLOPT_POSTFIELDS,$data);// 处理请求数据 // 处理响应结果 curl_setopt($curl,CURLOPT_HEADER,false);//是否处理响应头 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);//curl_exec()是否返回响应结果 // 发出请求 $response = curl_exec($curl); if(false === $response) { echo '<br>',curl_error($curl),'<br>'; return false; } curl_close($curl); return $response; } }
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
文明上网理性发言!