PHP微信开发之二维码生成类


Posted in PHP onJune 26, 2015
<?php
/**
 * Created by PhpStorm.
 * User: bin
 * Date: 15-1-16
 * Time: 上午9:48
 */
namespace Home\Common;

// 微信处理类
set_time_limit(30);
class Weixin{
  //构造方法
  static $qrcode_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?";
  static $token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";
  static $qrcode_get_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?";

  //生成二维码
  public function getEwm($wechatid,$fqid,$type = 1){
    $wechat = M('Member_public')->where(array('id'=> $wechatid))->find();
    $appid = $wechat['appid'];
    $secret = $wechat['secret'];
    $ACCESS_TOKEN = $this->getToken($appid,$secret);
    $url = $this->getQrcodeurl($ACCESS_TOKEN,$fqid,1);
    return DownLoadQr($url,time());
  }
  protected function getQrcodeurl($ACCESS_TOKEN,$fqid,$type = 1){
    $url = self::$qrcode_url.'access_token='.$ACCESS_TOKEN;
    if($type == 1){
      //生成永久二维码
      $qrcode= '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": '.$fqid.'}}}';
    }else{
      //生成临时二维码
      $qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$fqid.'}}}';
    }
    $result = $this->http_post_data($url,$qrcode);
    $oo = json_decode($result[1]);
    if(!$oo->ticket){
      $this->ErrorLogger('getQrcodeurl falied. Error Info: getQrcodeurl get failed');
      exit();
    }
    $url = self::$qrcode_get_url.'ticket='.$oo->ticket.'';
    return $url;

  }

  protected function getToken($appid,$secret){
    $ACCESS_TOKEN = file_get_contents(self::$token_url."appid=$appid&secret=$secret");
    $ACCESS_TOKEN = json_decode($ACCESS_TOKEN);
    $ACCESS_TOKEN = $ACCESS_TOKEN->access_token;
    return $ACCESS_TOKEN;
  }
  protected function http_post_data($url, $data_string) {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charset=utf-8',
        'Content-Length: ' . strlen($data_string))
    );
    ob_start();
    curl_exec($ch);
    if (curl_errno($ch)) {
      $this->ErrorLogger('curl falied. Error Info: '.curl_error($ch));
    }
    $return_content = ob_get_contents();
    ob_end_clean();
    $return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    return array($return_code, $return_content);
  }
  //下载二维码到服务器
  protected function DownLoadQr($url,$filestring){
    if($url == ""){
      return false;
    }
    $filename = $filestring.'.jpg';
    ob_start();
    readfile($url);
    $img=ob_get_contents();
    ob_end_clean();
    $size=strlen($img);
    $fp2=fopen('./Uploads/qrcode/'.$filename,"a");
    if(fwrite($fp2,$img) === false){
      $this->ErrorLogger('dolwload image falied. Error Info: 无法写入图片');
      exit();
    }
    fclose($fp2);
    return './Uploads/qrcode/'.$filename;
  }

  private function ErrorLogger($errMsg){
    $logger = fopen('./ErrorLog.txt', 'a+');
    fwrite($logger, date('Y-m-d H:i:s')." Error Info : ".$errMsg."\r\n");
  }

}
PHP 相关文章推荐
扩展你的 PHP 之入门篇
Dec 04 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php实现图片缩略图的方法
Mar 29 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
php微信开发之百度天气预报
Nov 18 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
Thinkphp关闭缓存的方法
Jun 26 #PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 #PHP
php header函数的常用http头设置
Jun 25 #PHP
PHP里的单例类写法实例
Jun 25 #PHP
PHP合并数组+号和array_merge的区别
Jun 25 #PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 #PHP
php计算多维数组中所有值总和的方法
Jun 24 #PHP
You might like
自己动手做一个SQL解释器
2006/10/09 PHP
隐性调用php程序的方法
2009/03/09 PHP
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
解除劳动合同协议书范本
2014/09/13 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
golang json数组拼接的实例
2021/04/28 Golang
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript
关于Redis的主从复制及哨兵问题
2022/06/16 Redis