微信支付

<?php
 // +----------------------------------------------------------------------
 // | Author: 飞鱼计划 (weixin:315061897 交流thinkphp下微信开发)
 // +----------------------------------------------------------------------
 namespace Home\Controller;
 use Think\Controller;
 use Common\Libs\Weixin\ComPay;//红包与企业支付
 use \Common\Libs\Weixin\WechatAuth;//JSSDK 需要用到accessToken
 use \Common\Libs\Weixin\JSSDK;//JSSDK
 class IndexController extends Controller {
    protected function _initialize(){
        //基础配置(必须)
        define('APPID','');
        define('MCHID', '');
        define('KEY', '');
        define('APPSECRET', '');
        //证书配置
        //默认为Application/Common/Common/Libs/Weixin/cert文件夹下
        //其他位置需要设置证书物理路径
        // define('SSLCERT_PATH', '');
        // define('SSLKEY_PATH',  '' );
    }
    public function index(){
        $openid = $this->getOpenid();
        //红包部份
        $opt = I('get.opt');
        if($opt == 'redbag')$this->RedBag($openid,1);
        if($opt == 'compay')$this->ComPay($openid,1);
        //JSSDK部份
        $accessToken = $this->getToken();
        $jssdk = new JSSDK(APPID, $accessToken );
        $this->assign('signPack',$jssdk->getSignPackage());
        $this->assign('paydata',S('paydata'));
        $this->display();
    }
    //jssdk用到accessToken
    private function getToken(){
        $token = S('token');
        if(!$token){
            $WechatAuth = new WechatAuth(APPID,APPSECRET);
            $AccessToken = $WechatAuth->getAccessToken();
            $token = $AccessToken['access_token'];
            S('token',$token,7000);
        }
        return $token;
    }
    //公众号内红包
    private function RedBag($openid,$value){
        $rb = new ComPay();
        $fee = $value*100;//金额
        $totalnum = 1;//数量
        $sendname = '发送者名字';
        $wishing = '祝福语';
        $actname = '活动名称';
        $body = '有钱,任性';
        $rb->setOpenid($openid);
        $rb->setAmount($fee);
        $rb->setMchid(MCHID);
        $rb->setApiKey(KEY);
        $rb->setMchAppid(APPID);
        $rb->setSendName($sendname);
        $rb->setTotalNum($totalnum);
        $rb->setWishing($wishing);
        $rb->setActName($actname);
        $rb->setDesc($body);

        $res = $rb->RedBag();
        $res ? $this->success('发送成功') : $this->error($rb->error());
        die();
    }
    //企业支付
    private function ComPay($openid,$value){
        $rb = new ComPay();
        $fee = $value*100;
        $body = '企业支付';
        $rb->setOpenid($openid);
        $rb->setAmount($fee);
        $rb->setMchid(MCHID);
        $rb->setApiKey(KEY);
        $rb->setMchAppid(APPID);
        $rb->setDesc($body);        
        $res =  $rb->ComPay();
        $res ? $this->success('发送成功') : $this->error($rb->error());
        die();
    }
    //获取地址
    public function addr(){        
        import('Common.Libs.Weixin.JSAPI');
        $tools = new \JsApiPay();
        $openid = $tools->GetOpenid();
        $this->editAddress = $tools->GetEditAddressParameters();        
        $this->assign('title','收货信息');
        $this->display();
    }
    //支付
    public function pay(){
        $id = I('get.id');
        //生成订单及查询订单
        if(!$id){
            $data = $this->dataMgr('new');
            $this->redirect('index/pay','id=' . $data['out_trade_no']);
            die();
        }else{
            $data = $this->dataMgr('get',$id);
            if($this->orderquery($data['out_trade_no']) ){
                $this->error('订单已支付');
                die();
            }
        }

        //获取openid
        $openId = $this->getOpenid();
        //支付相关
        import('Common.Libs.Weixin.JSAPI');
        $tools = new \JsApiPay();
        $Out_trade_no     = $data['out_trade_no'];
        $Body            = '订单号:'.$Out_trade_no;
        $Total_fee         = $data['total_fee'];;

        //设置支付
        $input = new \WxPayUnifiedOrder();
        $input->SetBody($Body);
        $input->SetOut_trade_no($Out_trade_no);
        $input->SetTotal_fee($Total_fee);
        $input->SetNotify_url('http://' . $_SERVER['HTTP_HOST'] . U('index/notify') );
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order = \WxPayApi::unifiedOrder($input);
        $this->jsApiParameters = $tools->GetJsApiParameters($order);
        $this->assign('paydata',$data);
        $this->display();
    }
    //退款
    public function refund(){
        $id = I('get.id');
        $data = $this->dataMgr('get',$id);
        $out_trade_no = $data['out_trade_no'];
        $total_fee = $data['total_fee'];
        if(!$out_trade_no || !$total_fee){
            $this->error('订单不存在');
            die();
        }
        if(!$this->orderquery($out_trade_no) ){
            $this->error('订单未付款');
            die();
        }
        import('Common.Libs.Weixin.JSAPI');        
        $refund_fee = $total_fee;
        $input = new \WxPayRefund();
        $input->SetOut_trade_no($out_trade_no);
        $input->SetTotal_fee($total_fee);
        $input->SetRefund_fee($refund_fee);
        $input->SetOut_refund_no(\WxPayConfig::MCHID.date("YmdHis"));
        $input->SetOp_user_id(\WxPayConfig::MCHID);
        print_r(\WxPayApi::refund($input));
    }
    //回调
    public function notify(){
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
        $xmlObj = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
        $xmlArr = json_decode(json_encode($xmlObj),true);        
        $result_code = $xmlArr['result_code'];
        // $dir = dirname(__FILE__).'/xml.txt';
        // file_put_contents($dir, var_export($xmlObj,true) );
        $out_trade_no =  $xmlArr['out_trade_no'];
        if($result_code == 'SUCCESS'){
            //查询订单支付情况,并标注支付
            $this->orderquery($out_trade_no);
        }
    }
    //用缓存暂代数据库
    private function dataMgr($opt,$out_trade_no){
        if($opt == 'new'){
            $data = array(
                'openid'        => $this->getOpenid(),
                'out_trade_no'    => substr((string)time().rand(100,999),3),
                'total_fee'        => 1,
                'status'        => 0,
                'addtime'        => time()
                );
            $paydata = S('paydata');            
            $paydata[$data['out_trade_no']] = $data;
            S('paydata',$paydata);
            return $data;
        }
        if($opt == 'get'){
            $paydata = S('paydata');
            return $paydata[$out_trade_no];
        }
    }

     //订单查询
    private function orderquery($out_trade_no){
        import('Common.Libs.Weixin.JSAPI');
        $input = new \WxPayOrderQuery();
        $input->SetOut_trade_no($out_trade_no);
        $data = \WxPayApi::orderQuery($input);
        if($data['trade_state'] == 'SUCCESS' ){
            $paydata = S('paydata');
            $data = $paydata[$out_trade_no];
            $data['status'] = 1;
            $paydata[$out_trade_no] = $data;
            S('paydata',$paydata);
            return $data;
        }else{
            return false;
        }
    }
    //获取openid
    private function getOpenid(){
        $openid = session('openid');
        if(!$openid){
            import('Common.Libs.Weixin.JSAPI');
            $tools = new \JsApiPay();
            $openid = $tools->GetOpenid();
            session('openid',$openid); 
        }
        return $openid;
    }
 }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值