php 开启微信公众号开发者模式

php 开启微信公众号开发者模式

<?php
/**
  * wechat php test
  */
header('Content-type:text');
//define your token
//定义TOKEN密钥
define("TOKEN", "weixin");
//实例化微信对象
$wechatObj = new wechatCallbackapiTest();
//验证成功后注释掉valid方法
$wechatObj->valid();
//开启自动回复功能
$wechatObj->responseMsg();
//定义类文件
class wechatCallbackapiTest
{
    //实现valid验证方法:实现对接微信公众平台
    public function valid()
    {
        //通过GET请求接收随机字符串
        $echoStr = $_GET["echostr"];
        //调用checkSignature方法进行用户(开发者)数字签名验证
        //valid signature , option
        if($this->checkSignature()){
            //如果成功,则返回接收到的随机字符串
            echo $echoStr;
            //并退出
            exit;
        }
    }

    public function responseMsg()
    {
        //get post data, May be due to the different environments
        //接收用户端(客户)发送过来的XML数据
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

          //extract post data
        //判断XML数据是否为空
        if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
                //通过simplexml进行xml解析     PHP中有两大类可以完成对XML的解析,1.PHP的Dom模型2.通过simplexml模型
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                //手机端
                $fromUsername = $postObj->FromUserName;
                //微信公众平台
                $toUsername = $postObj->ToUserName;
                //接收用户发送的关键词
                $keyword = trim($postObj->Content);
                //时间戳
                $time = time();
                //文本发送模板
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";   
                //判断用户发送关键词是否为空
                if(!empty( $keyword ))
                {
                    //回复类型,如果为"text",代表文本类型
                      $msgType = "text";
                    //回复内容
                    $contentStr = "Welcome to wechat world!";
                    //格式化字符串(对xml进行格式化操作,把里面相关的变量格式化成字符串)
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    //把XML数据返回给手机端
                    echo $resultStr;
                }
                //如果用户发送的关键词为空,则返回下列字符串
                else{
                    echo "Input something...";
                }

        }else {
            echo "";
            exit;
        }
    }
    
    //定义checkSignature方法
    private function checkSignature()
    {
        // you must define TOKEN by yourself
        
        //判断TOKEN密钥是否定义
        if (!defined("TOKEN")) {
            //如果没有定义则抛出异常,返回'TOKEN is not defined!'字符串
            throw new Exception('TOKEN is not defined!');
        }
        //接收微信加密签名
        $signature = $_GET["signature"];
        //接收时间戳信息
        $timestamp = $_GET["timestamp"];
        //接收随机数
        $nonce = $_GET["nonce"];
        //把TOKEN常量赋值给$token变量    
        $token = TOKEN;
        //把相关参数组装为数组(密钥文件、时间戳、随机数)
        $tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
        //通过字典法进行排序
        sort($tmpArr, SORT_STRING);
        //把排序后的数组转化为字符串
        $tmpStr = implode( $tmpArr );
        //通过哈希算法对字符串进行加密操作
        $tmpStr = sha1( $tmpStr );
        //与加密签名进行对比
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

?>

1 TOKEN要跟微信公众号后台的TOKEN对应就行
2 $wechatObj->valid(); 微信公众号后台验证完就可以注释掉

php ffmpeg视频和序列帧转化

php ffmpeg视频和序列帧转化

$cmd=shell_exec("ffmpeg -i ".__DIR__ . "/shipin1.mp4 -r 25 -q:v 2   ".__DIR__ . "/testxulie/%03d.jpg");
        print_r($cmd);
        exit();
       $cmd = shell_exec("ffmpeg -i ".__DIR__ . "/testxulie/%03d.jpg -c:v copy -c:a copy  ".__DIR__ . "/testxulie/1.mp4");
        print_r($cmd);
        exit();

ps:-c:v copy -c:a这个是保证无损压缩的 -q:v 2保证无损导出图片 如果导出图片无损 一般图片很大 最终图片再拼成视频都要压缩

php imagick蒙版做法

php imagick蒙版做法

   $image = new \Imagick();
        $image->readImage(__DIR__ . '/mengban.png');
        $watermark = new \Imagick();
        $watermark->readImage(__DIR__ . '/testmengban.jpg');
        /*$watermark->scaleImage(750, 1206); *///放到等比例按照宽度缩小图片 按照
        $image->compositeImage($watermark, \imagick::COMPOSITE_ATOP, 0, 0);
        $image->writeImage(__DIR__ . '/mengbanresult.png');

ps:注意蒙版和最终生成的图片都要png

这个是imagick 其他一些的教程 http://www.netingcn.com/category/imagemagick

php debug_backtrace方法跟踪代码调用

php debug_backtrace方法跟踪代码调用

function    string  当前的函数名,参见: __FUNCTION__。
line        integer 当前的行号。参见: __LINE__。
file        string  当前的文件名。参见: __FILE__。
class       string  当前 class 的名称。参见 __CLASS__
object      object  当前的 object。
type        string  当前调用的类型。如果是一个方法,会返回 "->"。如果是一个静态方法,会返回 "::"。 如果是一个函数调用,则返回空。
args        array   如果在一个函数里,这会列出函数的参数。 如果是在一个被包含的文件里,会列出包含的文件名。

index.php

<?php
require 'order.php';

// 获取用户订单资料
$order_id = 1000000;

$oOrder = new Order;
$order_info = $oOrder->get_order($order_id);
?>

order.php

<?php
require 'user.php';

// 订单资料
class Order{

    // 获取订单资料
    function get_order($order_id){

        $user_id = 1001;

        // 获取用户资料
        $oUser = new User;
        $user_info = $oUser->get_user($user_id);

        // 订单资料
        $order_info = array(
            'order_id' => $order_id,
            'order_name' => 'my order',
            'user_info' => $user_info,
        );

        return $order_info;

    }

}
?>

user.php

<?php
require 'message.php';

// 用户资料
class User{

    // 获取用户资料
    function get_user($user_id){

        // 获取用户讯息
        $oMessage = new Message;
        $user_message = $oMessage->get_message($user_id);

        $user_info = array(
                'user_id' => $user_id,
                'name' => 'fdipzone',
                'message' => $user_message
        );

        return $user_info;

    }

}
?>

message.php

<?php
// 用户讯息
class Message{

    // 获取用户讯息
    function get_message($user_id){

        $message = array(
            array('id'=>1, 'title'=>'message1'),
            array('id'=>2, 'title'=>'message2'),
        );

        // 加入跟踪调试
        $backtrace = debug_backtrace();
        var_dump($backtrace);

        return $message;

    }

}
?>
/message.php:15:
array (size=3)
  0 => 
    array (size=7)
      'file' => string '/user.php' (length=9)
      'line' => int 12
      'function' => string 'get_message' (length=11)
      'class' => string 'Message' (length=7)
      'object' => 
        object(Message)[3]
      'type' => string '->' (length=2)
      'args' => 
        array (size=1)
          0 => int 1001
  1 => 
    array (size=7)
      'file' => string '/order.php' (length=10)
      'line' => int 14
      'function' => string 'get_user' (length=8)
      'class' => string 'User' (length=4)
      'object' => 
        object(User)[2]
      'type' => string '->' (length=2)
      'args' => 
        array (size=1)
          0 => int 1001
  2 => 
    array (size=7)
      'file' => string '/index.php' (length=9)
      'line' => int 8
      'function' => string 'get_order' (length=9)
      'class' => string 'Order' (length=5)
      'object' => 
        object(Order)[1]
      'type' => string '->' (length=2)
      'args' => 
        array (size=1)
          0 => int 1000000

可以看到调用过程是

1.index.php 
line 8 
class Order 
function get_order 
args int 1000000

2.order.php 
line 14 
class User 
function get_user 
args int 1001

3.user.php 
line 12 
class Message 
function get_message 
args int 1001

这个方法主要看 某个函数是调用方式是怎么样的 来解决问题的

php imagick svg转成jpg

php imagick svg转成jpg

  public function svgtojpg()
    {
        $image    = '<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="400" height="300" viewBox="0,0,40,30" style="border:1px solid #cd0000;" version="1.1"
xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width="40" height="30" fill="#cd0000"/>

</svg>
';
        $filename = 'ef.jpg';
        /*  $image    = stripslashes($_POST['json']);
        $filename = $_POST['filename'];*/
        $unique = time();
        $im     = new \Imagick();
        $im->readImageBlob($image);
        $res     = $im->getImageResolution();
        $x_ratio = $res['x'] / $im->getImageWidth();
        $y_ratio = $res['y'] / $im->getImageHeight();
        $im->removeImage();
        $im->setResolution($width_in_pixels * $x_ratio, $height_in_pixels * $y_ratio);
        $im->readImageBlob($image);
        $im->setImageFormat("jpeg");
        $im->writeImage(__DIR__ . '/../../../Public/moban/images/1/humourised_'. $filename);
        $im->clear();
        $im->destroy();
    }