• 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."
    ", 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
    ";
    
                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);
    
        }
    
    }
    
    
    
    ?>
  • 相关阅读:
    一. js高级(1)-面向对象编程
    tips01- 定位
    h5c3 part6 flex
    h5c3 part5 background and transform
    template and pagination
    h5c3 part4
    h5c3 part3
    h5c3 part2
    h5c3 part1
    学习博客
  • 原文地址:https://www.cnblogs.com/phpfensi/p/9150102.html
Copyright © 2020-2023  润新知