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);

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

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

  • 相关阅读:
    [ZJOI2010]count 数字计数
    小雄数
    简单筛法函数
    [Noip模拟题]lucky
    欧拉线筛
    Intern Day78
    CodeForces1360C
    CodeForces1373B
    Intern Day78
    Intern Day78
  • 原文地址:https://www.cnblogs.com/exo5/p/13992538.html
Copyright © 2011-2022 走看看