之前在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);
好了 关于调用就先到这里结束了 希望对你的支付有所帮助
温馨提示:封装的类有每个人的风格,可以参考,急于写项目的时候也可以拿来用,但是最好看懂里面的代码,尝试些出自己的封装会对自己有所提高喔! 加油
在规矩中有自己的不规矩,走出不一样的路才是属于自己的路