<?php

header('Content-type:text');

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();

//通过get获取字符串

if (!isset($_GET['echostr'])) {

    $wechatObj->responseMsg();

}else{

    $wechatObj->valid();

}

/**

 * 

 */

class wechatCallbackapiTest

{

    /**

     * 签名消息入口

     * @return [type] [description]

     */

    public function valid()

    {

        $echoStr = $_GET["echostr"];

        if($this->checkSignature()){

            echo $echoStr;

            exit;

        }

    }

     /**

     * 响应本消息

     * @return [type] [description]

     */

    public function responseMsg()

    {

        $postStr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");

        if (!empty($postStr)){

            $this->logger("R ".$postStr);

            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

            $RX_TYPE = trim($postObj->MsgType);

            switch ($RX_TYPE)

            {

                case "event":

                    $result = $this->receiveEvent($postObj);

                    break;

                case "text":

                    $result = $this->receiveText($postObj);

                    break;

            }

            $this->logger("T ".$result);

            echo $result;

        }else {

            echo "";

            exit;

        }

    }

    /**

     * 收到文本消息的处理

     * @param  [type] $postObj [description]

     * @return [type]          [description]

     */

    private function receiveText($postObj){

        //获取到的文本内容

        $msg = $postObj->Content;

        //获取openid

        $openid = $postObj->FromUserName;

        //$result = $this->transmitText($postObj,$openid.':'.$text);

        if($msg == '红包'){

            //调用微信支付

            $this->sendredpack($openid);

            $text = '感谢您领取红包';

        }else{

            $text = '感谢您XXXXX衣柜的关注!';

        }

        //回复消息

        $result = $this->transmitText($postObj,$text);

        return $result;

    }

    /**

     * 检验签名信息

     * @return [type] [description]

     */

    private function checkSignature()

    {

        $signature = $_GET["signature"];

        $timestamp = $_GET["timestamp"];

        $nonce = $_GET["nonce"];

        $token = TOKEN;

        $tmpArr = array($token, $timestamp, $nonce);

        sort($tmpArr);

        $tmpStr = implode($tmpArr);

        $tmpStr = sha1($tmpStr);

        if($tmpStr == $signature){

            return true;

        }else{

            return false;

        }

    }

    /**

     * 关注消息回复

     * @param  [type] $object [description]

     * @return [type]         [description]

     */

    private function receiveEvent($object)

    {

        $content = ""; 

        //判断是否送红包

        $isSend = false;

        switch ($object->Event)

        {

            case "subscribe":

                $content = "欢迎关注XXX衣柜!请输入关键词“红包”领取!";

                //设为发送红包

                $isSend = ture;

                break;

            case "unsubscribe":

                $content = "取消关注";

                break;

        }

        $result = $this->transmitText($object, $content);

        if($isSend){

            //发送红包

            $openid = $openid = $postObj->FromUserName;

            //调用微信支付

            $this->sendredpack($openid);

        }

        return $result;

    }

    /**

     * 转化为xml消息

     * @param  [type] $object  [description]

     * @param  [type] $content [description]

     * @return [type]          [description]

     */

    private function transmitText($object, $content)

    {

        $textTpl = "<xml>

                    <ToUserName><![CDATA[%s]]></ToUserName>

                    <FromUserName><![CDATA[%s]]></FromUserName>

                    <CreateTime>%s</CreateTime>

                    <MsgType><![CDATA[text]]></MsgType>

                    <Content><![CDATA[%s]]></Content>

                    </xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);

        return $result;

    }

    /**

     * 日志记录

     * @param  [type] $log_content [description]

     * @return [type]              [description]

     */

    private function logger($log_content)

    {

        if(isset($_SERVER['HTTP_APPNAME'])){   //SAE

            sae_set_display_errors(false);

            sae_debug($log_content);

            sae_set_display_errors(true);

        }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL

            $max_size = 10000;

            $log_filename = "log.xml";

            if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}

            file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);

        }

    }

    /**

     * 公众号curlpost消息

     * @param  [type]  $url     [description]

     * @param  [type]  $vars    [description]

     * @param  integer $second  [description]

     * @param  array   $aHeader [description]

     * @return [type]           [description]

     */

    public function curl_post_ssl($url, $vars, $second=30,$aHeader=array())

    {

        $ch = curl_init();

        //超时时间

        curl_setopt($ch,CURLOPT_TIMEOUT,$second);

        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);

        //这里设置代理,如果有的话

        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');

        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);

        curl_setopt($ch,CURLOPT_URL,$url);

        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

        //以下两种方式需选择一种

        //第一种方法,cert 与 key 分别属于两个.pem文件

        //默认格式为PEM,可以注释

        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');

        curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/apiclient_cert.pem');

        // 默认格式为PEM,可以注释

        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');

        curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/apiclient_key.pem');

        //第二种方式,两个文件合成一个.pem文件

        //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');

         if( count($aHeader) >= 1 ){

            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);

        }

        curl_setopt($ch,CURLOPT_POST, 1);

        curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);

        $data = curl_exec($ch);

        if($data){

            curl_close($ch);

            return $data;

        }

        else {

            $error = curl_errno($ch);

            echo "call faild, errorCode:$error\n";

            curl_close($ch);

            return false;

        }

    }

//$re = sendredpack();

//var_dump($re);

/**

 * 发红包

 * @return [type] [description]

 */

public function sendredpack($openid){

    $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";

    $mch_billno = '随机字符串如(1235583002)' . date ( "YmdHis", time () ) . rand ( 1000, 9999 );      //商户订单号

    //$mch_billno = '1235583002'.uniqid(); //商户订单号

    $mch_id = '商户号';                         //微信支付分配的商户号

    $wxappid = '你的APPID';                //公众账号appid

    $send_name = "名字,尽量别超过四个字"; 

    $re_openid = $openid;

    $total_amount = 100;                             // 付款金额,单位分

    $total_num = 1;                                  //红包发放总人数

    $wishing = "恭喜发财";                           //红包祝福语

    $client_ip = "211.149.199.227 ";                    //Ip地址

    $act_name = "首次关注";                          //活动名称

    $remark = "红包";                                //备注

    $apikey = "商户apikey";    // key 商户后台设置的  微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

    $nonce_str =  md5(rand());                       //随机字符串,不长于32位

    $m_arr = array (

        'mch_billno' => $mch_billno,

        'mch_id' => $mch_id,

        'wxappid' => $wxappid,

        'send_name' => $send_name,

        're_openid' => $re_openid,

        'total_amount' => $total_amount,

        'total_num' => $total_num,

        'wishing' => $wishing,

        'client_ip' => $client_ip,

        'act_name' => $act_name,

        'remark' => $remark,

        'nonce_str' => $nonce_str

    );

    array_filter ( $m_arr ); // 清空参数为空的数组元素

    ksort ( $m_arr ); // 按照参数名ASCII码从小到大排序

    $stringA = "";

    foreach ( $m_arr as $key => $row ) {

        $stringA .= "&" . $key . '=' . $row;

    }

    $stringA = substr ( $stringA, 1 );

    // 拼接API密钥:

    $stringSignTemp = $stringA."&key=" . $apikey;

    $sign = strtoupper ( md5 ( $stringSignTemp ) );         //签名

    $textTpl = '<xml>

                       <sign><![CDATA[%s]]></sign>

                        <mch_billno><![CDATA[%s]]></mch_billno>

                        <mch_id><![CDATA[%s]]></mch_id>

                        <wxappid><![CDATA[%s]]></wxappid>

                        <send_name><![CDATA[%s]]></send_name>

                        <re_openid><![CDATA[%s]]></re_openid>

                        <total_amount><![CDATA[%s]]></total_amount>

                        <total_num><![CDATA[%s]]></total_num>

                        <wishing><![CDATA[%s]]></wishing>

                        <client_ip><![CDATA[%s]]></client_ip>

                        <act_name><![CDATA[%s]]></act_name>

                        <remark><![CDATA[%s]]></remark>

                        <nonce_str><![CDATA[%s]]></nonce_str>

                        </xml>';

    $resultStr = sprintf($textTpl, $sign, $mch_billno, $mch_id, $wxappid, $send_name,$re_openid,$total_amount,$total_num,$wishing,$client_ip,$act_name,$remark,$nonce_str);

    return $this->curl_post_ssl($url,$resultStr);

    }

}

?>

PHP自动发红包代码示例的更多相关文章

  1. php微信自动发红包

    <?phpheader('Content-type:text');define("TOKEN", "weixin");$wechatObj = new w ...

  2. My.Ioc 代码示例——实现自动注册/解析

    在很多 Ioc 容器中,当使用者向容器请求实现了某个契约类型 (Contract Type) 的服务时 (调用类似如下方法 container.Resolve(Type contractType)), ...

  3. JAVA NIO工作原理及代码示例

    简介:本文主要介绍了JAVA NIO中的Buffer, Channel, Selector的工作原理以及使用它们的若干注意事项,最后是利用它们实现服务器和客户端通信的代码实例. 欢迎探讨,如有错误敬请 ...

  4. 发送邮件的几种方法(C#发邮件 和 js前台实现都有)C#后台自动发邮件 js发邮件

    1.后台自动发邮件 1)首先设置邮件参数,这里写在configuration里面 <appSettings> <add key="SMTP" value=&quo ...

  5. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

  6. [Dynamic Language] 用Sphinx自动生成python代码注释文档

    用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...

  7. SELECT控件操作的JS代码示例

    SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...

  8. PHP实现发红包程序

    我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...

  9. PHP自动发邮件

    自动发邮件 使用了这个类http://bbs.php100.com/read-htm-tid-121431.html 因他用的php版本较老,用到了函数ereg_replace() 和 ereg() ...

随机推荐

  1. 【java基础】为什么重写toString()方法?

    不得不说,有很多java初学者写java实体类的时候,并没有真正理解重写toString() 方法,可能是口头知道也可能是跟风随带添加toString() 方法,并没有真正理解其意义,如果真要被问起来 ...

  2. 学习笔记42_SpringMVC

    SpringMVC中,Global.axas发生变化,其中 1.原来是 public class MvcApplication:System.web.HttpApplication 现在是 publi ...

  3. [2018-01-08] Python强化周的第一天

    Python强化周的第一天 学生管理系统-制作(成绩类)模块 class Score: lesson_name = "python" # 课程名 score = 0 # 分数 # ...

  4. 游戏辅助外gua篇:如何Dump内存获得游戏的辅助

    转载请标明出处: https://dujinyang.blog.csdn.net/article/category/9267855 本文出自:[奥特曼超人的博客] 本篇邀请了 "阿七&quo ...

  5. Salesforce学习之路-developer篇(五)Aura组件原理及常用属性

    很喜欢曾经看到的一句话:以输出倒逼输入.以输出的形式强制自己学习,确实是高效的学习方式,真的很棒.以下仅为个人学习理解,如有错误,欢迎指出,共同学习. 1. 什么是Lightning Componen ...

  6. 『题解』LibreOJ6277 数列分块入门 1

    更好的阅读体验 Portal Portal1: LibreOJ Description 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间加法,单点查值. Input 第一行输入一个数字 ...

  7. linux 打包 | autoconf 使用方法

    面试题 嵌入式 0x10道题目 宏定义 #define 宏体 宏体 (大写) #define SECOND_OF_YEAR (365*24*3600)UL 可移植性 数据声明 一个存有10个指针的数组 ...

  8. pdf2eps implement

    Well, I used the command pdftops in the LaTeX distribution such as MiKTeX/TeXLive/CTex to implement ...

  9. [javascript] 编写一个计算器,实现加减法

    1.代码 <script> function sum(){ //加法 var value1 = document.getElementById("num1").valu ...

  10. Swoole和Redis实现的并发队列处理系统

    由于PHP不支持多线程,但是作为一个完善的系统,有很多操作都是需要异步完成的.为了完成这些异步操作,我们做了一个基于Redis队列任务系统. 大家知道,一个消息队列处理系统主要分为两大部分:消费者和生 ...