1. <?php
  2. /*
  3. +----------------------------------------------------------------------
  4. + Title : PHP微信开发 生成带参数的二维码 - 永久版
  5. + Author : 小黄牛
  6. + Version : 无
  7. + Initial-Time : 2016-10-29 09:01:00
  8. + Last-time : 2016-10-29 09:01:00 + 小黄牛
  9. + Desc : 这个接口跟微信支付一样重要,分销功能一定会用到,并且10个微网站,8个会用到
  10. + content:
  11. + 微信目前支持两种带参数的二维码
  12. + 第一种:临时二维码
  13. + 有过期时间,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量;临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景
  14. + 第二种:永久二维码
  15. + 无过期时间的,但数量较少(目前为最多10万个);永久二维码主要用于适用于帐号绑定、用户来源统计等场景,分销不用说,肯定得用这个了
  16. +
  17. + 生成带参数的二维码的过程包括两步:
  18. + 第一:首先创建二维码ticket
  19. + 第二:凭借urlencode(ticket)到指定URL换取二维码。
  20. +----------------------------------------------------------------------------------------------------------------------------------------------
  21. */
  22. # 注意,菜单更新有时差,为10分钟左右
  23. # 引入Access_Token更新文件
  24. require_once 'Access_Token.php';
  25. $AccessToken = new Access_Token();
  26. # 定义Access_Token常量
  27. define('ACCESS_TOKEN',$AccessToken->GetToken());
  28. $WeiXin = new WeiXin();
  29. $WeiXin->Temporary_QR();
  30. class WeiXin{
  31. # 生成永久二维码
  32. public function Temporary_QR(){
  33. # 请求这个连接获得ticket
  34. $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.ACCESS_TOKEN;
  35. # 设置二维码参数
  36. $data = array(
  37. 'action_name' => 'QR_LIMIT_SCENE',//二维码类型,QR_LIMIT_SCENE为永久
  38. # 场景参数
  39. 'action_info' => array(
  40. 'scene' => array(
  41. 'scene_id' => 456 // 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
  42. )
  43. )
  44. );
  45. $result = self::https_request($url,json_encode($data));//参数一定要转成JSON
  46. $this->Error_Log(array('ticket参数'=>$result),true);//记录日志,以防报错
  47. $res = json_decode($result,true);
  48. # $ticket存在数据库 ,要显示的时候访问下面的地址
  49. $ticket = $res['ticket'];
  50. # 使用ticket请求这个链接,获得二维码
  51. $url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.urlencode($ticket);
  52. $img = self::https_request($url);
  53. # 查看二维码
  54. echo "<img src='$url' />";
  55. }
  56. # 作者:焰哥 - 用于微信接口数据传输的万能函数
  57. private static function https_request($url, $data = null){
  58. # 初始化一个cURL会话
  59. $curl = curl_init();
  60. //设置请求选项, 包括具体的url
  61. curl_setopt($curl, CURLOPT_URL, $url);
  62. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); //禁用后cURL将终止从服务端进行验证
  63. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  64. if (!empty($data)){
  65. curl_setopt($curl, CURLOPT_POST, 1); //设置为post请求类型
  66. curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //设置具体的post数据
  67. }
  68. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  69. $response = curl_exec($curl); //执行一个cURL会话并且获取相关回复
  70. curl_close($curl); //释放cURL句柄,关闭一个cURL会话
  71. return $response;
  72. }
  73. /**
  74. * @Title : 记录错误信息与查看部分信息
  75. * @Author : 小黄牛
  76. * @param array : $Arr_Title 一个一维数组自定义内容
  77. * @param bool : $Arr_Error 是否插入系统错误信息
  78. * @param string : $File 日志名
  79. * @return : 无
  80. */
  81. private function Error_Log($Arr_Title,$Arr_Error=false,$File='Error_log.log'){
  82. # 不是数组中断程序
  83. if (!is_array($Arr_Title)) {return false;}
  84. # 定义一个空的变量,用于存放日志TXT实体
  85. $Error_TXT = "自定义信息如下:rn";
  86. # 解析Arr_Title 自定义日志内容
  87. foreach ($Arr_Title as $key=>$val){
  88. $Error_TXT .= $key.':'.$val."rn";
  89. }
  90. # 判断系统错误显示是否开启
  91. if ($Arr_Error === true) {
  92. # 获取刚发生的错误信息,并返回数组,无错返回null
  93. $Arr_Error = error_get_last();
  94. # 不为空则执行错误解析
  95. if (isset($Arr_Error)) {
  96. $Error_TXT .= "系统错误信息如下:rn";
  97. # 解析$Arr_Errore 系统错误信息
  98. foreach ($Arr_Title as $key=>$val){
  99. $Error_TXT .= $key.':'.$val."rn";
  100. }
  101. }
  102. }
  103. # 最后再写入两个换行符,以便追加查看
  104. $Error_TXT .= "rnrn";
  105. # 最后写入日志
  106. error_log($Error_TXT,3,$File);
  107. }
  108. }