PHP自动发红包代码示例
<?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自动发红包代码示例的更多相关文章
- php微信自动发红包
		<?phpheader('Content-type:text');define("TOKEN", "weixin");$wechatObj = new w ... 
- My.Ioc 代码示例——实现自动注册/解析
		在很多 Ioc 容器中,当使用者向容器请求实现了某个契约类型 (Contract Type) 的服务时 (调用类似如下方法 container.Resolve(Type contractType)), ... 
- JAVA NIO工作原理及代码示例
		简介:本文主要介绍了JAVA NIO中的Buffer, Channel, Selector的工作原理以及使用它们的若干注意事项,最后是利用它们实现服务器和客户端通信的代码实例. 欢迎探讨,如有错误敬请 ... 
- 发送邮件的几种方法(C#发邮件 和 js前台实现都有)C#后台自动发邮件  js发邮件
		1.后台自动发邮件 1)首先设置邮件参数,这里写在configuration里面 <appSettings> <add key="SMTP" value=&quo ... 
- 高级渲染技巧和代码示例 GPU Pro 7
		下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ... 
- [Dynamic Language] 用Sphinx自动生成python代码注释文档
		用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ... 
- SELECT控件操作的JS代码示例
		SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ... 
- PHP实现发红包程序
		我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ... 
- PHP自动发邮件
		自动发邮件 使用了这个类http://bbs.php100.com/read-htm-tid-121431.html 因他用的php版本较老,用到了函数ereg_replace() 和 ereg() ... 
随机推荐
- Centos6.5 忘记密码解决方法
			问题 原因 : 太久没用centos了 忘记密码了 很尴尬 快照也没说明密码.... 1.重启 centos 在开机启动的时候快速按键盘上的“E”键 或者“ESC”键(如果做不到精准快速可以在启动 ... 
- 【XSY2344】K-th String
			Description Alice有 n(n≤26) 张牌,牌上分别标有前 n 个英文小写字母.例如,如果 n=3 ,则Alice有3张牌,分别标有"a", "b&quo ... 
- 学习笔记11全局处理程序global.asax
			*全局处理程序Clobal.asax只能叫这个名字,不能修改文件名,如果网站没有的话,可以自己添加. *Application[]类似于session,是全局的,Application["k ... 
- [python]一些常用的python知识总结
			Pthon知识积累,遇到的各种python问题汇总 json.dumps()和json.loads()是json格式处理函数 json.dumps()函数是将一个Python数据类型列表进行json格 ... 
- [考试反思]1015csp-s模拟测试74:压迫
			其实同时也是第27,一大片并列的. 真的是越考越烂. T1是个弱化的贪心原题,15分钟拿下没什么可说的. T2打的记忆化搜索,hash_mod太小撞哈希了,50->30 T3,想不到正解,90分 ... 
- P3521 [POI2011]ROT-Tree Rotations(线段树合并)
			一句话题意(不用我改了.....):给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. ......这题输入很神烦呐... 给你一棵二叉树的dfs序 ... 
- 洛谷 pP2146 [NOI2015]软件包管理器
			题目的传送门 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ... 
- php自定义截取中文字符串-utf8版
			php自定义截取中文字符串-utf8版 UTF-8的编码范围(utf-8使用1-6个字节编码字符,实际上只使用了1-4字节): 1个字节:00——7F 2个字节:C080——DFBF 3个字符:E08 ... 
- idea用hibernate创建一个表两个主键时遇到的问题
			1>> idea功能简单,最大化的实现傻瓜式操作,不需要像eclipse一样手敲代码,尤其是在创建主键多个或者主键映射时. 2>> (1).首先,idea创建复合主键映射时,需 ... 
- vue开发之跨域请求,请求头not allowed by Access-Control-Allow-Headers,后端cookie session值取不到(二)
			原因:你本地的请求ajax的get和post请求:如果你的请求头内放一些可用验证数据Token的时候就会存在跨域请求这是浏览器所不允许的问题: 方案一:后台的接口请求模式都写成jsonp请求,前端去调 ... 
