前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信小程序之生成指定页面的太阳码

微信小程序之生成指定页面的太阳码

作者头像
桑先生
发布2019-12-18 11:06:57
7.6K0
发布2019-12-18 11:06:57
举报
文章被收录于专栏:桑先生的专栏桑先生的专栏

最近的项目中也是需要生成小程序的邀请太阳码.一开始生成的是个二维码.但是小程序的客户扫了之后总不能让人家跳到H5页面.所以也是研究了一下.一路上也是坎坎坷坷.这里总结下.顺当分享下自己写的代码.哪里写的不好.多多指教下.

首先.官方也是给出了最直接了当的解决办法.这里也是一路摸着石头过河.有问题查文档,翻手册.我觉的这可能是从无到有最快的解决办法了.

首先看下官方给出生成程序码的例子:

获取小程序码通过该接口生成的小程序码,永久有效,数量暂无限制。

补充下小程序生成太阳码的错误码

41030  接口所传page页面不存在,或者小程序没有发布

47001  请求的数据不是json格式

40001  失效的access_token  token两个小时的有效期,需要注意下.这里官方给出的是两小时,但很有可能提前失效.

待补充…

除去可选参数,我们需要传递的有access_token 这里的scebe写着必填,但是有没有说怎么传递.这里我也是困扰了好久.后来才发现这个是用来传递参数的.-_-||

大概流程就是拿access_token去请求这个接口.这里他返回的是一个base64格式的图片.刚开始以为是乱码.就像解决二维码那样没有效果.眉头一皱,发现事情没有这么简单.原来是个bse64的图片.这里我的处理方式也是直接将他输出到了服务器的根目录下.这里也是经历了暴风雨式的微信报错.才算跑通.

代码语言:javascript
复制
<?php

/**
 * Class WxQrcode
 * 小程序生成太阳码
 */
class WxQrcode{

    /**
     * @param $appid
     * @param $appsecret
     * @return mixed
     * 获取accessToken
     */
    public function getAccessToken($appid,$appsecret)
    {
        $tokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        $getArr=array();
        $tokenArr=json_decode($this->send_post($tokenUrl,$getArr,"GET"));
        $access_token=$tokenArr->access_token;
        return $access_token;
    }

    /**
     * 验证access_token是否有效
     * 这里调用微信接口如果失效则获取新的验证access_token是否有效 或者 将验证access_token是否有效存入数据库做判断也可以
     */
    protected function checkWXToken($access_token){
        //请求微信不限制调用次数的接口
        $ipurl = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$access_token;
        $ipresult = $this->getSSLPage($ipurl);
        $ipdata = json_decode($ipresult,true);

        if($ipdata['errcode'] == '40001'){
            file_put_contents('access_token.txt',date('Y-m-d H:i:s').' access_token提前失效,进入二次获取token'.PHP_EOL,FILE_APPEND);
            $access_token = $this->getAccessToken();
        }
        return $access_token;
    }

    /**
     * @return string
     * 生成小程序太阳码
     */
    public function getQrcode()
    {

        $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$this->getAccessToken();
        //生成二维码图片
        $da['page'] = 'pages/detail/detail'; //小程序路径地址,不写默认跳首页
        $da['width']=430;  //二维码大小
        $da['scene']="name=123"; //页面传参
        //{"errcode":47001,"errmsg":"data format error hint: [WqXQEA06804522]"}   josn格式不正确索性直接转成json
        /* $post_data='{"path":"'. $data['path'].'",
                      "width":'.$data['width'].',
                      "scene":'.$data['scene'].'
                      }';*/
        $post_data = json_encode($da);
        //这里会直接生成base64图片.直接写成文件就可以 打印会显示乱码
        $result=$this->api_notice_increment($url,$post_data);
        // dump($result);die;
        $dir = 'qrcode/';
        //判断目录是否存在
        if(is_dir($dir))
        {
            $filename =  $dir.uniqid().'.png';
        } else {
            mkdir($dir);
            $filename =  $dir.uniqid().'.png';
        }
        //生成唯一文件名
        $file =uniqid().'.png';
        //写入文件
        file_put_contents('qrcode/'.$file,$result);
        return $filename;
    }

    /**
     * @param $file
     * 删除文件
     */
    public function delQrcode($file)
    {
        //这里传入的$file 是我这边存入数据库的图片.调用unlink函数删除服务器上的图片文件
        $path = ROOT_PATH .'public'.$file;
        if (file_exists($path)) {
            unlink ($path);
        };
    }

    /**
     * @param $url
     * @param $data
     * @return bool|string
     */
    protected function api_notice_increment($url, $data){

        $ch = curl_init();

        $header = "Accept-Charset: utf-8";

        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);

        if (curl_errno($ch)) {
            return false;
        }else{
            return $tmpInfo;die;
        }

    }

    /**
     * @param $url
     * @param $post_data
     * @param string $method
     * @return false|string
     * 发送post请求
     */
    protected function send_post($url, $post_data,$method='POST') {

        $postdata = http_build_query($post_data);

        $options = array(

            'http' => array(

                'method' => $method, //or GET

                'header' => 'Content-type:application/x-www-form-urlencoded',

                'content' => $postdata,

                'timeout' => 15 * 60 // 超时时间(单位:s)

            )

        );

        $context = stream_context_create($options);

        $result = file_get_contents($url, false, $context);

        return $result;

    }

    /**
     * @param $url
     * @return bool|string
     *
     */
    protected function getSSLPage($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSLVERSION, 30);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }



}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档