<?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自动发红包代码示例

    <?php header('Content-type:text'); define("TOKEN", "weixin"); $wechatObj = ne ...

  2. 微信小程序发红包

    背景: 近期一个朋友公司要做活动,活动放在小程序上.小程序开发倒是不难,不过要使用小程序给微信用户发红包,这个就有点麻烦 确定模式: 小程序目前没有发红包接口,要实现的话,只能是模拟红包,即小程序上做 ...

  3. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的

    最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想到两个方法. 之前公众号开发一直用了的.一个是红包接口,一个是企业支付接口.一开 ...

  4. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的

    微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的   最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想 ...

  5. 微信发红包 PHP 实现

    最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https ...

  6. PHP微信发红包简明教程

    PHP微信发红包简明教程1首先进入公众号申请微信支付 申请成功账号密码会发到你指定的邮箱 是登陆商户平台的2 进入后申请发红包借口3 调用发红包接口 https://api.mch.weixin.qq ...

  7. 微信自动抢红包android实现

    AccessibilityService-微信自动抢红包 2018年02月01日 16:09:06 阅读数:1757 在领导发红包的时候,看到有些同事在1s.2s抢到红包,为什么他们能够这么快?一定是 ...

  8. 微信小程序红包开发思路 微信红包小程序开发思路讲解

    之前公司开发小程序红包,将自己在开发的过程中遇到的一些坑分享到了博客里.不少人看了以后,还是不明白怎么开发.也加了我微信咨询.所以今天,我就特意再写一篇文章,这次就不谈我开发中遇到的坑了.就主要给大家 ...

  9. 使用PHP编写发红包程序

    使用PHP编写发红包程序 http://www.jb51.net/article/69815.htm 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-07-22   微信发红 ...

随机推荐

  1. Web—CSS概述

    一.概念: 它是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言 的一个子集)等文件样式的计算机语言. 二.特点: 1.实现网页内容与样式的分离     2.降低图形文件的 ...

  2. Android经常使用设计模式(二)

    继上一篇 Android经常使用设计模式(一)里认识了观察者.适配器.代理等三种模式,这一篇将会解说下面三种模式: 工厂模式 单例模式 命令模式 1.工厂模式(Factory Pattern) 工厂模 ...

  3. [iOS]经常使用正則表達式

    经常使用正則表達式大全!(比如:匹配中文.匹配html) 匹配中文字符的正則表達式: [u4e00-u9fa5]    评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包含汉字 ...

  4. [IT学习]从网上获取pdf制作vce文件

    考过IT证书的朋友,都知道什么是vce文件.如果仅仅找到了pdf版本的文件,该如何转为vce文件呢? 具体的步骤如下: 1.到如下网址下载examformatter,http://www.examco ...

  5. 51NOD 1821 最优集合 栈

    1821 最优集合   一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2, ...

  6. Tomcat最多支持并发多少用户?

    当一个进程有 500 个线程在跑的话,那性能已经是很低很低了.Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大.当某个应用拥有 250 个以上并发 ...

  7. brctl和虚拟网桥

    1 创建空的虚拟网桥 brctl addbr br0 这个时候可以认为该虚拟网桥有多个虚拟接口,但是没有实际的网卡接口和该虚拟网桥相连的. 2 将eth0网卡连接到br0 网卡只有一个接口,这个接口是 ...

  8. qemu所支持的网卡

    1 命令 -net nic 创建一个network interface card,即创建一个网卡,默认是e1000网卡. 2 qemu所支持的网卡类型 2.1 rtl8139 Realtek 10/1 ...

  9. [BZOJ2144]国家集训队 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  10. 如何正确使用log4j

      如何正确使用log4j? 关键字: 如何正确使用log4j? Java Web开发的过程中,通过会采用输出log的方式来进行调试,产品上线之后,也通常使用log来记录系统的运行状态.最简单的输出l ...