laravel框架 封装的卡卷管理代码

来源:互联网 发布:python 期货交易接口 编辑:程序博客网 时间:2024/05/22 12:50
<?php/** * Created by PhpStorm. * User: DreaMedia * Date: 2017/9/7 * Time: 14:18 */namespace App\Http\Controllers\Api;use Illuminate\Http\Request;use Illuminate\Support\Facades\DB;class CouponController extends CommonController{    protected $card_type_text = [        'GROUPON' => '<button class="btn btn-primary btn-xs">团购卷</button>',        'DISCOUNT' => '<button class="btn btn-danger btn-xs">折扣券</button>',        'GIFT' => '<button class="btn btn-info btn-xs">礼品券</button>',        'CASH' => '<button class="btn btn-warning btn-xs">代金卷</button>',        'GENERAL_COUPON' => '<button class="btn btn-default btn-xs">通用卷</button>',        'MEMBER_CARD' => '<button class="btn btn-success btn-xs">会员卡</button>',        'SCENIC_TICKET' => '<button class="btn btn-default btn-xs">景点门票</button>',        'MOVIE_TICKET' => '<button class="btn btn-default btn-xs">电影卷</button>',        'BOARDING_PASS' => '<button class="btn btn-default btn-xs">飞机票</button>',        'MEETING_TICKET' => '<button class="btn btn-default btn-xs">会议门票</button>',        'BUS_TICKET' => '<button class="btn btn-default btn-xs">汽车票</button>',        'EXPERIENCE' => '<button class="btn btn-default btn-xs">体验卷</button>'    ];    protected $status_text = [        'CARD_STATUS_NOT_VERIFY' => '<span class="label label-default label-xs">待审核</span>',        'CARD_STATUS_VERIFY_FAIL' => '<span class="label label-danger label-xs">审核失败</span>',        'CARD_STATUS_VERIFY_OK' => '<span class="label label-success label-xs">审核通过</span>',        'CARD_STATUS_DELETE' => '<span class="label label-warning label-xs">商户删除</span>',        'CARD_STATUS_DISPATCH' => '<span class="label label-default label-xs">公众平台投放的卡券</span>'    ];    protected $user_card_status_text = [        'NORMAL' => '正常',        'CONSUMED' => '已核销',        'EXPIRE' => '已过期',        'GIFTING' => '转赠中',        'GIFT_TIMEOUT' => '转赠超时',        'DELETE' => '已删除',        'UNAVAILABLE' => '已失效'    ];    public function index(Request $data)    {        print_r($this->getApiTicket());        return view('index/index');    }    public function createCoupon($data)    {        $this->getAccessToken();        $url = "https://api.weixin.qq.com/card/create?access_token=".session('token.access_token');        $card = json_decode($this->http_post($url,json_encode($data,JSON_UNESCAPED_UNICODE)),1);        //判断是否成功获取        if($card['errcode'] == 'ok')        {            return [                'card_id' => $card['card_id'],                'status' => 200            ];        }else{            return [                'status' => 400,                'errmsg' => '创建卡卷失败,原因:'.$card['errmsg']            ];        }    }    //获取素材列表    public function getMaterial($type='image',$offset=0,$count=20)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token='.session('token.access_token');        $data = json_encode([            'type' => $type,            'offset' => $offset,            'count' => $count        ]);        $res = json_decode($this->http_post($url,$data),1);        if(empty($res['errmsg']))        {            return [                'status' => 200,                'material' => $res            ];        }else{            return [                'status' => 400,                'errmsg' => '获取素材失败,原因:'.$res['errmsg']            ];        }    }    //获取卡卷领取二维码    /**     * @param $card_id 卡卷id值     * @param bool $code 自定义code码     * @param bool $openid 限制用户openid     * @param bool $unique 二维码一次性     * @param unsigned int $expire_seconds 二维码有效时间 范围:60 ~ 1800 默认365天     * @return array     */    public function getCardQrcode($card_id,$code=false,$openid=false,$unique=false,$expire_seconds='')    {        $this->getAccessToken();        $data = [            'action_name' => 'QR_CARD',            'expire_seconds' => $expire_seconds,//二维码有效时间            'action_info' =>[                'card' =>[                    'card_id' => $card_id ,                    'code' => $code,//自定义code                    'openid' => $openid,//用户制定openid                    'is_unique_code' => $unique,//扫描一次性是否开启                    'outer_str' => '',//场景值字符串                    'outer_id' => '',//场景值id                ],            ],        ];        $url = 'https://api.weixin.qq.com/card/qrcode/create?access_token='.session('token.access_token');        $res = json_decode($this->http_post($url,json_encode($data)),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200,                'ticket' => $res['ticket'],                'expire_seconds' => $res['expire_seconds'],                'url' => $res['url'],                'show_qrcode_url' => $res['show_qrcode_url']            ];        }else{            return [                'status' => 400,                'errmsg' => $res['errmsg']            ];        }    }    //上传图片素材 传入name为image的file文件    /**     * @param Request $data     * @return bool     */    public function uploadImg($file)    {        $this->getAccessToken();        $api = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=".session('token.access_token')."&type=image";        $res = json_decode($this->http_post_media($api,$file),1);        unlink($file);        if(empty($res['errcode']))        {            return [                'status' => 200,                'url' => $res['url']            ];        }else{            return [                'status' => 400,                'errmsg' => $res['errmsg']            ];        }    }    //核销卡卷    /**     * @param $code //卡卷码     * @param $card_id //卡卷id     * @return array     */    public function chargeOffStatus($code,$card_id)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/code/get?access_token='.session('token.access_token');        $data = json_encode([            'code' => $code,            'card_id' => $card_id,            'check_consume' => false        ]);        $res = json_decode($this->http_post($url,$data),1);        //检查卡卷是否可核销        if($res['errcode']==0)        {            if($res['can_consume'] == false)            {                return [                    'status' => 400,                    'msg' => '无法使用卡卷,原因:'.$this->user_card_status_text[$res['user_card_status']]                ];            }else{                $url = 'https://api.weixin.qq.com/card/code/consume?access_token='.session('token.access_token');                $res = json_decode($this->http_post($url,json_encode([                    'code'=>$code                ])),1);                if($res['errmsg'] == 'ok')                {                    return [                        'status' =>200                    ];                }            }        }else{            return [                'status' => 401,                'errmsg' => '无法使用的卡卷,卡卷编码错误,请检查卡卷所属商户'            ];        }    }    //获取卡卷货架    /**     * @param $banner 页面banner     * @param $title 页面标题     * @param array $card_list 卡卷数据,需要传入卡卷id和缩略图 ['card_id'=>'','thumb_url'=>'']     * @param bool $can_share     * @param string $scene     * @return array     */    public function ticketShelf($banner,$title,$card_list,$can_share=true,$scene='SCENE_NEAR_BY')    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/landingpage/create?access_token='.session('token.access_token');        $data = json_encode([            'banner' => $banner,            'page_title' => $title,            'can_share' => $can_share ,            'scene' => $scene,            'card_list' =>$card_list        ]);        $res = json_decode($this->http_post($url,$data),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200,                'url' => $res['url'],                'page_id' => $res['page_id']            ];        }else{            return [                'status' => 400,                'errmsg' => '获取货架接口出错,原因:',$res['errmsg']            ];        }    }    //获取卡卷列表    /**     * @param int $offset 偏移量     * @param int $count 列表总数,最多50     * @param string $status CARD_STATUS_NOT_VERIFY  待审核  CARD_STATUS_VERIFY_FAIL 审核失败 CARD_STATUS_VERIFY_OK 通过审核 CARD_STATUS_DELETE 卡券被商户删除 CARD_STATUS_DISPATCH 在公众平台投放过的卡券     * @return array     */    public function getTicketList($offset=0,$count=50,$status=[])    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/batchget?access_token='.session('token.access_token');        $data = json_encode([            'offset' => $offset,            'count' => $count,            'status_list' => $status            //CARD_STATUS_NOT_VERIFY”,待审核;“CARD_STATUS_VERIFY_FAIL”,审核失败;“CARD_STATUS_VERIFY_OK”,通过审核;“CARD_STATUS_DELETE”,卡券被商户删除;“CARD_STATUS_DISPATCH”,在公众平台投放过的卡券;        ]);        $res = json_decode($this->http_post($url,$data),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200,                'card_id_list' => $res['card_id_list'],                'total' => $res['total_num']            ];        }else{            return [                'status' => 400,                'errmsg' => '获取列表失败,原因:'.$res['errmsg']            ];        }    }    //获取卡卷详情    public function getCardInfo($card_id)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/get?access_token='.session('token.access_token');        $data = json_encode([            'card_id' => $card_id        ]);        $res = json_decode($this->http_post($url,$data),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200,                'info' => $res['card']            ];        }else{            return [                'status' => 400,                'errmsg' => '获取详情失败,原因:'.$res['errmsg']            ];        }    }    //更改卡卷信息 (未完善)    /**     * @return array     */    public function updateTicket()    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/update?access_token='.session('token.access_token');        $data = json_encode([        ]);        $res = json_decode($this->http_post($url,$data),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200,                //'card_id_list' => $res['card_id_list'],                //'total' => $res['total_num']            ];        }else{            return [                'status' => 400,                //'errmsg' => '获取列表失败,原因:'.$res['errmsg']            ];        }    }    //更改库存接口    /**     * @param $card_id 卡卷id     * @param int $increase_stock_value 增加库存数量     * @param int $reduce_stock_value 减少库存数量     * @return array     */    public function updateTicketStock($card_id,$increase_stock_value,$reduce_stock_value)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/modifystock?access_token='.session('token.access_token');        $data = json_encode([            'card_id' => $card_id,            'increase_stock_value' => $increase_stock_value,            'reduce_stock_value' => $reduce_stock_value        ]);        $res = json_decode($this->http_post($url,$data),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200            ];        }else{            return [                'status' => 400,                'errmsg' => '修改库存失败,原因:'.$res['errmsg']            ];        }    }    //删除卡卷    /**     * @param $card_id  卡卷id     * @return array     */    public function deleteTicket($card_id)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/delete?access_token='.session('token.access_token');        $data = json_encode([            'card_id' => $card_id        ]);        $res = json_decode($this->http_post($url,$data),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200            ];        }else{            return [                'status' => 400,                'errmsg' => '删除卡卷失败,原因:'.$res['errmsg']            ];        }    }    //设置卡卷失效    /**     * @param string(20) $code 卡卷编码     * @param string(64) $reason 失效原因     * @param null $card_id 自定义code需要填写     * @return array     */    public function unavailableTicket($code,$reason,$card_id=null)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/card/code/unavailable?access_token='.session('token.access_token');        $data = json_encode([            'code' => $code ,            'reason' => $reason,            'card_id' => $card_id,        ]);        $res = json_decode($this->http_post($url,$data),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200            ];        }else{            return [                'status' => 400,                'errmsg' => '设置失效失败,原因:'.$res['errmsg']            ];        }    }    //拉取卡券概况数据    /**     * 日期格式需要使用 2015-10-10 不可使用时间戳 查询区间需要小于62,同时不可以拉取当天的信息     * @param string(16) $begin_date 开始时间     * @param string(16) $end_date 结束时间     * @param int $cond_source 卡卷来源 0为公众平台创建的卡券数据 1是API创建的卡券数据     * @return array     */    public function getCardBizuinInfo($begin_date,$end_date,$cond_source)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/datacube/getcardbizuininfo?access_token='.session('token.access_token');        $data = json_encode([            'begin_date' => $begin_date ,            'end_date' => $end_date,            'cond_source' => $cond_source,        ]);        $res = json_decode($this->http_post($url,$data),1);        if(empty($res['errmsg']))        {            return [                'list' => $res['list']            ];        }else{            return [                'status' => 400,                'errmsg' => '设置失效失败,原因:'.$res['errmsg']            ];        }    }    //拉取免费卡卷概况数据    /**     * 日期格式需要使用 2015-10-10 不可使用时间戳 查询区间需要小于62,同时不可以拉取当天的信息     * @param $card_id 卡卷id     * @param string(16) $begin_date 开始时间     * @param string(16) $end_date 结束时间     * @param $cond_source 卡卷来源 0为公众平台创建的卡券数据 1是API创建的卡券数据     * @return array     */    public function getCardCardInfo($card_id,$begin_date,$end_date,$cond_source)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/datacube/getcardcardinfo?access_token='.session('token.access_token');        $data = json_encode([            'card_id' => $card_id,            'begin_date' => $begin_date ,            'end_date' => $end_date,            'cond_source' => $cond_source        ]);        $res = json_decode($this->http_post($url,$data),1);        if(empty($res['errmsg']))        {            return [                'status' => 200,                'list' => $res['list']            ];        }else{            return [                'status' => 400,                'errmsg' => '设置失效失败,原因:'.$res['errmsg']            ];        }    }    //拉取会员卡数据    public function getCardMemberCardInfo($begin_date,$end_date,$cond_source)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/datacube/getcardmembercardinfo?access_token='.session('token.access_token');        $data = json_encode([            'begin_date' => $begin_date ,            'end_date' => $end_date,            'cond_source' => $cond_source        ]);        $res = json_decode($this->http_post($url,$data),1);        if(empty($res['errmsg']))        {            return [                'list' => $res['list']            ];        }else{            return [                'status' => 400,                'errmsg' => '设置失效失败,原因:'.$res['errmsg']            ];        }    }    //拉去单张会员卡数据    public function getCardMemberCardDetail($card_id,$begin_date,$end_date)    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/datacube/getcardmembercarddetail?access_token='.session('token.access_token');        $data = json_encode([            'begin_date' => $begin_date ,            'end_date' => $end_date,            'card_id' => $card_id        ]);        $res = json_decode($this->http_post($url,$data),1);        if(empty($res['errmsg']))        {            return [                'list' => $res['list']            ];        }else{            return [                'status' => 400,                'errmsg' => '设置失效失败,原因:'.$res['errmsg']            ];        }    }}
public function http_post_media($url,$filename){        $ch = curl_init($url);        $file = curl_file_create($filename);        $data = array('media' => $file);        if(stripos($url,"https://")!==FALSE){            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);            curl_setopt($ch, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1        }        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );        curl_setopt($ch, CURLOPT_POST,1);        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);        $content = curl_exec($ch);        $aStatus = curl_getinfo($ch);        curl_close($ch);        if(intval($aStatus["http_code"])==200){            return $content;        }else{            return false;        }    }    public function http_post($url,$param,$post_file=false){        $oCurl = curl_init();        $this_header = array("content-type: application/x-www-form-urlencoded;charset=UTF-8");        if(stripos($url,"https://")!==FALSE){            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1        }        if (is_string($param) || $post_file) {            $strPOST = $param;        } else {            $aPOST = array();            foreach($param as $key=>$val){                $aPOST[] = $key."=".urlencode($val);            }            $strPOST = join("&", $aPOST);        }        curl_setopt($oCurl, CURLOPT_HEADER, 0);        curl_setopt($oCurl,CURLOPT_HTTPHEADER,$this_header);        curl_setopt($oCurl, CURLOPT_URL, $url);        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );        curl_setopt($oCurl, CURLOPT_POST,true);        curl_setopt($oCurl, CURLOPT_POSTFIELDS,$param);        $sContent = curl_exec($oCurl);        $aStatus = curl_getinfo($oCurl);        curl_close($oCurl);        if(intval($aStatus["http_code"])==200){            return $sContent;        }else{            return false;        }    }    function getApiTicket()    {        $this->getAccessToken();        $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.session('token.access_token').'&type=wx_card';        $res = json_decode($this->http_post($url,''),1);        if($res['errmsg'] == 'ok')        {            return [                'status' => 200,                'ticket' => $res['ticket']            ];        }else{            return [                'status' => 400,                'errmsg' => $res['errmsg']            ];        }    }    function getAccessToken()    {        if(session()->get('token.access_token')==null || session()->get('token.time')+7100<time())        {            $token = DB::table('wx_data')->where('id','=',1)->first();            if($token)            {                if( $token->created+7100<time() )                {                    $token = null;                    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" . "&appid=" . urlencode( $this->appid ) . "&secret=" . urlencode( $this->secret );                    $fetch = json_decode(file_get_contents($url),1);                    DB::table('wx_data')->where('id','=',1)->update([                        'access_token' =>$fetch['access_token'],                        'created' => time()                    ]);                    $token = DB::table('wx_data')->where('id','=',1)->first();                }                session([                    'token' => [                        'access_token' => $token->access_token,                        'time' => $token->created                    ]                ]);            }else{                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" . "&appid=" . urlencode( $this->appid ) . "&secret=" . urlencode( $this->secret );                $token = json_decode(file_get_contents($url),1);                DB::table('wx_data')->insert([                    'access_token' =>$token['access_token'],                    'created' => time()                ]);                session([                    'token' => [                        'access_token' => $token['access_token'],                        'time' => time()                    ]                ]);            }        }    }