最近的项目中也是需要生成小程序的邀请太阳码.一开始生成的是个二维码.但是小程序的客户扫了之后总不能让人家跳到H5页面.所以也是研究了一下.一路上也是坎坎坷坷.这里总结下.顺当分享下自己写的代码.哪里写的不好.多多指教下.
首先.官方也是给出了最直接了当的解决办法.这里也是一路摸着石头过河.有问题查文档,翻手册.我觉的这可能是从无到有最快的解决办法了.
首先看下官方给出生成程序码的例子:
获取小程序码。通过该接口生成的小程序码,永久有效,数量暂无限制。
补充下小程序生成太阳码的错误码
41030 接口所传page页面不存在,或者小程序没有发布
47001 请求的数据不是json格式
40001 失效的access_token token两个小时的有效期,需要注意下.这里官方给出的是两小时,但很有可能提前失效.
待补充…
除去可选参数,我们需要传递的有access_token 这里的scebe写着必填,但是有没有说怎么传递.这里我也是困扰了好久.后来才发现这个是用来传递参数的.-_-||
大概流程就是拿access_token去请求这个接口.这里他返回的是一个base64格式的图片.刚开始以为是乱码.就像解决二维码那样没有效果.眉头一皱,发现事情没有这么简单.原来是个bse64的图片.这里我的处理方式也是直接将他输出到了服务器的根目录下.这里也是经历了暴风雨式的微信报错.才算跑通.
<?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;
}
}