官方文档入口

一、首先要先获取 access_token,把拿到的token存放在redis中

 a.php文件

/*** 获取小程序全局唯一后台接口调用凭据  accessToken* access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;* @param appid 小程序appid* @param appsecret 小程序公众号秘钥*/
public static function getAccessToken($appid, $appsecret)
{$redis = new Redis();$redis->connect('127.0.0.1', 6379);// 如果accessToken 不存在或者已过期,则重新去生成一个$token = $redis->get("jw_applet_accessToken");if (!$token) {$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $appsecret;$html = file_get_contents($url);$output = json_decode($html, true);$access_token = $output['access_token'];/*** 微信平台会保证 在5分钟内,新老 access_token 都可用,所以需要提前去刷新,这里设置提前4分钟进行刷新* 创建一个具有时间限制的键值,过期则删除,秒为单位,成功返回true*/$redis->setex('jw_applet_accessToken', $output['expires_in'] - 240, $access_token);return $access_token;}return $token;
}

二、生成小程序码

 a.php文件

/*** 获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制* @param appid 小程序appid* @param appsecret 小程序公众号秘钥* @param scene 进入小程序时的参数 示例:a=1 最大32个可见字符 (必填参数 不能为空,不传会报错)* @param page 必须是已经发布的小程序存在的页面(否则报错) 根路径前不要加 /,如:pages/index/index  如果不填写这个字段,默认跳主页面* @param width 二维码的宽度,默认值:430  单位 px,最小 280px,最大 1280px* @param autoColor 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false* @param line_color auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十进制表示* @param is_hyaline 是否需要透明底色,为 true 时,生成透明底色的小程序*/
public static function createQRCode($appid, $appsecret, $scene = 'a=1', $page = '', $width = 430, $autoColor = false, $lineColor = [], $isHyaline = false)
{$url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' . self::getAccessToken($appid, $appsecret);$lineColor = $lineColor ?? ["r" => "0", "g" => "0", "b" => "0"];$params = ['scene' => $scene ?? 'NoParameters','page' => $page,'width' => intval($width),'auto_color' => $autoColor,'is_hyaline' => $isHyaline];$result = self::post($url, json_encode($params));// 判断是否是 json格式, 如果请求失败,会返回 JSON 格式的数据。if (is_null(json_decode($result))) {/*** 不是json格式的数据   说明有数据流  json_decode($result)返回值是为 null* 这里返回的图片 Buffer*/return ['code' => 0, 'data' => $result, 'msg' => 'success'];} else {$res = json_decode($result, true);return $res;}
}/*** 发送POST请求* @param url  请求的地址* @param data 请求的参数*/
public static function post($url, $data)
{$curl = curl_init($url);$upload = false;if (is_array($data)) {foreach ($data as $key => $rs) {if (is_object($rs)) {$upload = true;}}if (!$upload) {$data = http_build_query($data);}}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_USERAGENT, self::$user_agent);curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, self::$conn_time_out);curl_setopt($curl, CURLOPT_TIMEOUT, self::$time_out);curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);if (!is_null(self::$referer_path)) {curl_setopt($curl, CURLOPT_REFERER, self::$referer_path);}if (!is_null(self::$cookie_str)) {curl_setopt($curl, CURLOPT_COOKIE, self::$cookie_str);}if (!is_null(self::$cookie_path)) {curl_setopt($curl, CURLOPT_COOKIEFILE, self::$cookie_path);if (self::$cookie_save) {curl_setopt($curl, CURLOPT_COOKIEJAR, self::$cookie_path);}}if (!empty(self::$header)) {$headers = array();foreach (self::$header as $key => $val) {$headers[] = $key . ': ' . $val;}curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);}$return = curl_exec($curl);curl_close($curl);return $return;
}

接下来贴一段我调用前面方法的代码片段,把图片保存到本地服务器上,这边只是给出具体的思路,不能完全照抄,要看清楚哈!!!

因为我需要生成带参数的小程序码,而且参数是很长的一大串字符,已经超过了微信限制的最大长度32位字符,所以这边给参数使用md5加密,让长度永远固定在32位

b.php文件

<?phpclass B
{/*** 生成小程序码* 因为我需要生成带参数的小程序码,而且参数是很长的一大串字符,已经超过了微信限制的最大长度32位字符,所以这边给参数使用md5加密,让长度永远固定在32位*/public function createQRCode($parameter = ''){// 获取前端传来的参数,具体你们可以按照你项目框架获取参数的方法,这段不用参考哈~~~~~        $bh = $parameter->bh;$pagePath = $parameter->pagePath;$isShare = $parameter->isShare;$sharerPhone = $parameter->sharerPhone;$openid = $parameter->openid;$fangtype = $parameter->fangtype;// 小程序码上页面路径的参数 如:bh=123asd45sd812$scene = 'bh=' . $bh . '&isShare=' . $isShare . '&sharerPhone=' . $sharerPhone . '&openid=' . $openid . '&fangtype=' . $fangtype;// 因受微信限制 scene 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符, 所以需要加密处理$code_key = md5($scene);/*** 这边可以把加密后的值存放在数据库中* code_key就是加密后的值,code_value是完整的参数,在我这边这个demo中也就是这个scene* 还可以把生成后的小程序码的图片地址也存放到表中* 这样通过小程序码进入后的拿到参数的就是这个code_key,可以把这个code_key和数据库中的存放的code_key进行比对,有找到的话,就可以解码出当前扫码进入小程序页面的完这整参数了*/// 这是查询数据库的方法,具体你们可以按照你项目框架查询数据库的方法,这段不用参考哈~~~~~// 判断之前是否已经生成过 当前用户分享过当前详情页的小程序码$sql = "select code_value, imgUrl from wxqrcode where code_key = '$code_key'";$resultObj = JW_DBHelper::getDataEx($dbInfo, $sql);// 已生成过,直接返回小程序码的图片地址if (count($resultObj['result']) > 0) {return self::send(0, '已生成过当前编号的小程序码', $resultObj['result'][0]['imgUrl']);} else {// 还未生成过require_once 'a.php';$res = a::createQRCode('这里填你的小程序的appid', '这里填你的小程序密钥secret', $code_key, '这里填你的小程序的页面路径,不传默认是跳转到首页');if (isset($res['code']) && $res['msg'] == 'success') {/*** 得到图片的 Buffer: $res['data']* 创建文件准备写入* 这时可以把图片存放在本地服务器上 或者 阿里云OSS等第三方的平台上*/// 这是小程序码的图片 保存在服务器上的具体路径地址$filePath = 'D:/wwwroot/appweb/upload/wxQRcode/' . $bh . '.png';$file = fopen($filePath, 'w');fwrite($file, $res['data']);fclose($file);// 这是小程序码外网可访问的地址$imgUrl = 'https://www.xxx.com/upload/wxQRcode/' . $bh . '.png';// 插入到表中,保存起来$sql = "INSERT INTO wxqrcode(code_key, code_value, 'imgUrl') value('$code_key', '$scene', '$imgUrl')";$resultObj = JW_DBHelper::executeSql($dbInfo, $sql);return self::send(0, '生成小程序码成功', $imgUrl);}// 调用微信api接口 生成小程序码失败return self::send($res['errcode'], $res['errmsg']);}}/*** 这方法是扫码进入小程序页面后,调用的(可供你们参考用~)* 根据 加密后的key 读取小程序码参数加密表中的值* @param code_key 小程序码scene参数的值(md5后加密的值)*/public function getWxqrcodeValue($parameter = ''){// 获取前端传来的参数$code_key = $parameter->code_key;if (!isset($code_key) || strlen($code_key) == 0) return self::send(4000, 'scene参数不能为空');$sql = "select code_value from wxqrcode where code_key = '$code_key'";$resultObj = JW_DBHelper::getDataEx($dbInfo, $sql);// 有查询到if (count($resultObj['result']) > 0) {$code_value = $resultObj['result'][0]['code_value'];return self::send(0, '获取成功', $code_value);} else {return self::send(400, 'code_key匹配不到scene参数');}}/*** 接口返回数据* @param $code  int     0:表示成功,非0表示失败* @param $msg   string  返回的提示消息* @param $data  string/array  返回的数据*/public static function send($code = 0, $msg = '', $data = null){$resultObj['code'] = $code;$resultObj['msg'] = $msg;$resultObj['data'] = $data;return $resultObj;}
}

好了,到此整个流程就几乎可以了~

php 生成微信小程序码(可携带参数) 永久有效,数量暂无限制相关推荐

  1. 生成微信小程序码、URL Scheme和URL Link

    通用第一步,获取access_token,需要服务端去获取并缓存 (APPID和APPSECRET在微信小程序后台查看获取) https://api.weixin.qq.com/cgi-bin/tok ...

  2. 获取微信小程序码传递的参数 / 微信开发者工具模拟扫描小程序码调试

    本文主要介绍如何在微信开发者工具中,模拟微信扫描小程序码打开小程序的场景,进行调试. 二维码调试可以看这篇文章:微信开发者工具模拟扫描二维码调试 添加编译模式 添加一个咱们自定义的编译模式 输入模式名 ...

  3. PHP生成微信小程序码

    直接上代码 <?php$APPID = '微信平台的APPID'; $APPSECRET = '和APPID相匹配的APPSECRET'; //生成access_token $url= &quo ...

  4. 微信小程序 wx.navigateBack() 携带参数返回

    要实现的功能如下图点击关闭界面把值返回到上一层界面 wx.navigateBack(Object object) 在路由里面讲的看下文档 实现方法: 首先大打印下传值 click:function(e ...

  5. 微信小程序 页面A携带参数跳转到页面B,页面B获取页面A传来的参数并且存到data里面,在页面B中渲染成功

    页面A的wxml <view class="tuijian-food-box" ><view class="tuijian-food" wx: ...

  6. 微信小程序分享获取携带参数以及参数接收

    参考文章 onLoad(req) {_self=this;_globalData=getApp().globalData;this.webUrl=_globalData.PageWebUrl; if( ...

  7. 关于.NET HttpClient方式获取微信小程序码(二维码

    随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求--要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档,以及网上的例子,未看到多少 ...

  8. 生成微信小程序二维码(携带参数跳转指定页面)

    需求:生成微信小程序二维码并携带参数,扫码跳转指定页面 获取WxMaService对象 WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl ...

  9. c# 生成微信小程序二维码

    二维码生成 CreateWxCode("id=117", "pages/bookcheck/bookchecktime/bookchecktime", &quo ...

最新文章

  1. 《Microduino实战》——第2章 Microduino
  2. 如何修复GIT错误:目标文件为空?
  3. Spring boot的Spring MVC自动配置原理
  4. 前端学习(2169):vue-router安装和配置方式
  5. 百度APP月活跃用户达5.6亿,日登录用户占比超75%
  6. 【Hbase】 Region Server 各种意外退出
  7. 车险对方全责理赔要自己垫付吗?
  8. Android异步加载全解析之引入二级缓存
  9. Java Web 开发的目录结构
  10. Excel单元格锁定与数据隐藏
  11. python爬取豆瓣电影250_python爬取豆瓣电影top250数据存入数据库
  12. 青云志鸿蒙争霸位置,青云志手游万剑一抽取方法攻略
  13. 关于linux的filp->private_data解释
  14. qt.modbus: (RTU client) Discarding response with wrong CRC, received: 16448 , calculated CRC: 49303
  15. 各个击破!高效解决游戏开发8大痛点
  16. 微信小程序实现图片预览的功能
  17. 拉拉米抢单发单源码 二开ui 带视频介绍 放量功能
  18. 品优购电商系统开发 第5章 商品录入【1】
  19. iconfont的使用,阿里矢量图库的引用,配置,改变图标大小和图标颜色
  20. MOS管基本认识(快速入门)

热门文章

  1. 日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?
  2. matlab查看hdf头文件,基于Matlab的HDF文件读取方法
  3. 7-112 斐波那契数列 (10 分)
  4. 逢7必过或拍7游戏(七的倍数、带7的)用C语言实现
  5. 南京小米二面 全程58分钟
  6. 计算机网络实验报告三
  7. MySQL实现连表查询
  8. nbu客户端卸载_NBU卸载(Linux环境)
  9. vs2013中带命令行参数的调试方法
  10. 修改虚拟机的ip地址步骤