<?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. IIS部署WCF疑难

    1.其他信息: 无法激活请求的服务. 可能原因:1. 服务的命名空间和接口的命名空间不一致.2. 传递的参数类型没有打上[DataContract], [DataMember]标签. 2.记得这样: ...

  2. mysql 5.6.44 zip 安装教程(基于windows )

    首先我们从官网下载最新版本的mysql 5.6.44版本,网页地址: ,我的电脑是64位的版本,所以我选择的是64位版本,如果是32位,根据实际情况下载所需要的安装包.

  3. Netty学习篇④-心跳机制及断线重连

    心跳检测 前言 客户端和服务端的连接属于socket连接,也属于长连接,往往会存在客户端在连接了服务端之后就没有任何操作了,但还是占用了一个连接:当越来越多类似的客户端出现就会浪费很多连接,netty ...

  4. 基于node的前端组件包发布至nexus和npmjs

    目录 目录... 3 1. 前言... 1 2. 配置... 1 2.1. 建立组件的导出模块... 1 2.2. 建立组件入口文件... 1 2.3. 配置“ng-package.json”文件.. ...

  5. Head First设计模式——单例模式

    单例模式是所有设计模式中最简单的模式,也是我们平常经常用到的,单例模式通常被我们应用于线程池.缓存操作.队列操作等等. 单例模式旨在创建一个类的实例,创建一个类的实例我们用全局静态变量或者约定也能办到 ...

  6. My Android 学习之旅--开始

    其实,很早就想写写博客了,一直懒到现在. 学习android也不是今天才开始的,大概在2月份过完年之后就开始了,买了我认为还可以的书<Android从入门到精通>,花了不到一个月的时间,把 ...

  7. Unity中动态创建Mesh

    什么是Mesh? Mesh是指的模型的网格,3D模型是由多边形拼接而成,而多边形实际上又是由多个三角形拼接而成的.即一个3D模型的表面其实是由多个彼此相连的三角面构成.三维空间中,构成这些三角形的点和 ...

  8. H5+app -- 自动更新

    一.最近做了一个app自动更新功能,用的基本都是网上找得到的. 1.h5+ 规范 :  http://www.html5plus.org/doc/zh_cn/maps.html 2.环形进度条插件:h ...

  9. 013.Kubernetes二进制部署worker节点Nginx实现高可用

    一 Nginx代理实现kube-apiserver高可用 1.1 Nginx实现高可用 基于 nginx 代理的 kube-apiserver 高可用方案. 控制节点的 kube-controller ...

  10. springboot封装JsonUtil,CookieUtil工具类

    springboot封装JsonUtil,CookieUtil工具类 yls 2019-9-23 JsonUtil public class JsonUtil { private static Obj ...