zoukankan      html  css  js  c++  java
  • 支付封装集合之如何调用【更新至2020.11.17】

    之前在csdns 上 ,现在为了方便更改直接在这边写了,那边的会直接删除

    以下写法是在Tp5的环境下适用的 目前还没有尝试过其他
    首先说 一下方法适用于我这里大部分的支付封装类 如有必要请仔细研究下代码 说不定能带来惊喜

     1 public function extendsPay($biao,$order_sn,$subject,$payTypeInfo,$method='api')
     2     {
     3         // 获取订单信息
     4         $order=model($biao)->getone(['order_sn'=>$order_sn]);
     5         if(!$order)
     6         {
     7             return $this->error('指定信息查找不到');
     8         }
     9         // 获取价格 与支付编码
    10         $opApn=model($biao)->opApn($order_sn,$payTypeInfo,$order);
    11         $total=$opApn['total'];
    12         $pay_sn=$opApn['pay_sn'];
    13 
    14         $payFunname=$payTypeInfo['funname'];
    15         $pay_type=$payTypeInfo['id'];
    16         $pay_name=$payTypeInfo['name'];
    17 
    18         // 进行支付
    19         $domain=request()->domain();
    20         // $domain=cur_domain();
    21         $pay_funname=$biao.'_'.strtolower($payFunname);//在同一方法下获取参数一致
    22 
    23         $is_exists_fun=[
    24             'Backurl',
    25             'Notify'
    26         ];
    27         foreach ($is_exists_fun as $k => $fun) {
    28             $class_fun='app\'.$method.'controller\'.$fun;
    29 
    30             if(!class_exists($class_fun))
    31             {
    32                 return $this->error($fun.'类不存在');
    33                 continue;
    34             }
    35             $class=new $class_fun;
    36             if(!method_exists($class,$pay_funname))
    37             {
    38                 return $this->error($fun.'类下 '.$pay_funname.'方法 不存在');
    39                 continue;
    40             }
    41         }
    42 
    43         $payD=[
    44             'return_url'=>$domain.'//'.$method.'//backurl/'.$pay_funname,
    45             'notify_url'=>$domain.'//'.$method.'//notify/'.$pay_funname,
    46             'total'=>$total,
    47             'subject'=>$subject,
    48             'attach'=>$pay_type,
    49             'pay_sn'=>$pay_sn,
    50             'order_sn'=>$order_sn,
    51             'payTypeInfo'=>$payTypeInfo,
    52         ];
    53 
    54         return $this->payTypeDo($pay_type,$payD,$order['user_id']);
    55     }
    56 
    57     // 根据不同支付类型操作支付
    58     public function payTypeDo($pay_type,$payD,$user_id)
    59     {
    60         $payTypeInfo=$payD['payTypeInfo'];
    61         $total=$payD['total'];
    62         $order_sn=$payD['order_sn'];
    63         $pay_sn=$payD['pay_sn'];
    64         $pay_name=$payTypeInfo['name'];
    65         $funname=$payTypeInfo['funname'];
    66 
    67         $user=model('user')->userinfo(['id'=>$user_id]);
    68 
    69 
    70         // 对类进行实例化
    71         $classfun='pay\'.$funname;//转化为带命名空间的
    72         if(class_exists($classfun))
    73         {
    74             $pay=new $classfun($payTypeInfo['field_json']);
    75         }else{
    76             return $this->error('指定类不存在');
    77         }
    78 
    79         $payRes=$pay->index($payD);
    80 
    81         if($payRes['code']==0)
    82         {
    83             return $payRes;
    84         }
    85 
    86         $return=[
    87             'order_sn'=>$order_sn,
    88             'total'=>$total,  
    89             'pay_sn'=>$pay_sn,
    90             'pay_type'=>$pay_type,
    91             'pay_name'=>$pay_name,
    92             'pay_data'=>isset($payRes['data'])?$payRes['data']:[],
    93         ];
    94         return ['code'=>1,'msg'=>'','data'=>$return];
    95     }

    如果感觉以上方法过于麻烦 如果你能看到这里的话 来个简单的方法

    修改之前 namespace pay 类下的构造方法为如下代码

    public function __construct($calltype='',$config=[]){
    
            $this->calltype=$calltype!=''?$calltype:$this->calltype;
            if($config)
            {
                $this->config=$config;
            }
            $appname=$this->calltype.'_appid';
            $this->appid=$this->config[$appname];
            // 线上 linux
            $this->cert['apiclient_cert']=EXTEND_PATH.'pay/wxcert/apiclient_cert.pem';
            $this->cert['apiclient_key']=EXTEND_PATH.'pay/wxcert/apiclient_key.pem';
            
            // 本地
           // $this->cert['apiclient_cert']=EXTEND_PATH.'paywxcertapiclient_cert.pem';
           // $this->cert['apiclient_key']=EXTEND_PATH.'paywxcertapiclient_key.pem';
        }

    然后在需要调用支付方法的控制器下添加

    use payWxpay;
    
    //并写个私有的方法
    
    private function wxPay($data,$calltype='')
        {
            $pay = new Wxpay($calltype);
            $pay=$pay->index($data);
            return $pay;
        }
    
    //调用就变得比较简单了
    
    
    $paytype='app';//这里可根据类型设置 找到封装下具体使用的方法
    $data=[
         'return_url'=>'http://'.$_SERVER['HTTP_HOST'].'/api/order/index',
         'notify_url'=>'http://'.$_SERVER['HTTP_HOST'].'/api/notify/goods_notify',
         'subject'=>$model['order_no'], //商品标题
         'pay_sn'=>$model['order_no'], //支付订单单号
         'total'=>$model['pay_price'],//总价
         'attach'=>$model['order_no'], //订单编号(备注)
     ];
     
     if($paytype=='wx')
     {
          //由于微信公众号需要使用openid 是需要提前传递的喔
         $data['openid']=$user['wx_openid'];
     }
     $domain='http://'.$_SERVER['HTTP_HOST'];
     $notify_url=$domain.'/api/notify/goods_notify';
     $data['notify_url']=$notify_url;
     $paydata=$this->wxPay($data,$paytype);

    好了 关于调用就先到这里结束了 希望对你的支付有所帮助

    温馨提示:封装的类有每个人的风格,可以参考,急于写项目的时候也可以拿来用,但是最好看懂里面的代码,尝试些出自己的封装会对自己有所提高喔! 加油

  • 相关阅读:
    webdav srs相关
    How To Configure WebDAV Access with Apache on Ubuntu 14.04
    ubuntu 编译lighttpd
    srs编译及推流测试
    Compile pciutils (lspci, setpci) in Windows x86,在 Windows x86 平台下编译 pciutils (lspci, setpci)
    mingw MSYS2 区别
    Qt之美(三):隐式共享
    Qt之美(二):元对象
    Qt之美(一):d指针/p指针详解
    C++的栈空间和堆空间
  • 原文地址:https://www.cnblogs.com/exo5/p/13992538.html
Copyright © 2011-2022 走看看