之前在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.'pay\wxcert\apiclient_cert.pem';
       // $this->cert['apiclient_key']=EXTEND_PATH.'pay\wxcert\apiclient_key.pem';
    }

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

use pay\Wxpay;

//并写个私有的方法

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

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

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

 

posted on 2020-11-17 09:25  思君邪  阅读(116)  评论(0编辑  收藏  举报