技术饭

PHP获取微信小程序二维码、商品二维码、页面二维码

copylian    0 评论    23799 浏览    2019.01.21

获取二维码

通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面,所有生成的二维码永久有效,可放心使用。目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所示:

qrcode.png


可以使用开发工具 1.02.1803130 及以后版本通过二维码编译功能调试所获得的二维码


qrcodecompile.png


为满足不同需求和场景,这里提供了三个接口,开发者可挑选适合自己的接口。

接口 A: 适用于需要的码数量较少的业务场景

生成小程序码,可接受 path 参数较长,生成个数受限,数量限制见 注意事项,请谨慎使用。

接口 B:适用于需要的码数量极多的业务场景

生成小程序码,可接受页面参数较短,生成个数不受限。

接口 C:适用于需要的码数量较少的业务场景

生成二维码,可接受 path 参数较长,生成个数受限,数量限制见 注意事项。

我们推荐生成并使用小程序码,它具有更好的辨识度。

注意事项

接口只能生成已发布的小程序的二维码接口 A 加上接口 C,总共生成的码数量限制为 100,000,请谨慎调用。接口 B 调用分钟频率受限(5000次/分钟),如需大量小程序码,建议预生成。

正常使用接口B:https://developers.weixin.qq.com/miniprogram/dev/api/getWXACodeUnlimit.html

1548035182(1).png

这个接口需要注意的是参数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;
    }

}
只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!

  • 还没有评论,沙发等你来抢