$order_no]); if(empty($order)){ return $this->error("订单不存在"); } $struct = new QueryStruct(['mall_id'=>$order->mall_id,'order_no'=>$order->order_no]); $resp = $struct->query(); if($resp === false) return $this->error($struct->error); // 支付处理 return $this->_handel_order($order->id,$resp); } // 下单 public function create(PaymentTrade $trade,$trade_type){ $config = Config::getConfig($trade->mall_id); $trade_type = trim($trade_type); // 增加组合支付判断 if(!empty($trade->is_pay_group)){ $paymentOrderObj = PaymentTradeGroupOrder::class; }else{ $paymentOrderObj = PaymentTradeOrder::class; } $mall_order_no = $paymentOrderObj::find()->where(['trade_id'=>$trade->id])->select("order_no")->column(); // 支付方式 $order = [ "mall_id"=>$trade->mall_id, "order_no"=>$trade->out_trade_no, "mall_order_no"=>$mall_order_no[0] ?? '', "type"=>$trade_type, "agencyId"=>$config->agencyId, "amount"=>$trade->pay_fee, "product_name"=>$trade->title, "created_at"=>time(), "updated_at"=>time(), ]; switch ($trade_type){ case Config::CLOUD_H5: // 银联在线 $struct = new CloudH5Struct($order); break; case Config::CLOUD_APP: // 云闪付 $struct = new CloudAppStruct($order); break; case Config::ALIPAY_APP: // 支付宝app支付 $struct = new AlipayAppStruct($order); break; case Config::WECHAT_APP: // 微信app支付 $struct = new WechatAppStruct($order); break; case Config::WECHAT_GZH: // 微信公众号支付 $struct = new WechatGZHStruct($order); break; case Config::WECHAT_WAP: // 微信h5支付 $struct = new WechatWapStruct($order); break; case Config::ALIPAY_WAP: // 支付宝wap支付(手机网页、电脑网页) $struct = new AlipayWapStruct($order); break; default: throw new \Exception("SICPAY 不支持 {$trade_type} 交易"); } $model = new SicpayOrder(); if(!($model->load($order,'') && $model->save())){ $msg = array_values($model->getErrors())[0] ?? "SICPAY 未知错误"; return $this->error($msg); } // 请求接口 $res = $struct->pay(); if($res == false){ throw new \Exception($struct->error); } // 返回数据 $resp = $struct->returnData(); if(!empty($resp['form'])){ // 有返回form表单的话,缓存起来, $url = "sicpay:order:{$struct->mall_id}:".$struct->order_no; \Yii::$app->redis->setex($url,1800,$resp['form']); $resp['url'] = \Yii::$app->services->setting->platform->get('system.api_url')."/sicpay/notify/topay?order_no=$url"; unset($resp['form']); } $resp['trade_type'] = $trade_type; // 更新记录 $model->pay_no = $resp['pay_no']; $model->token_id = $resp['token_id'] ?? ''; $model->response_json = $resp['form'] ?? ''; $model->request_json = json_encode($struct->getConfig()); $model->save(); return $resp; } // 支付异步回调 public function notifyHandle($mall_id,$data){ $config = SicpayConfig::getConfig($mall_id); $core = new PaySign(); $pay_data = $core->notifyDecodeData($config,$data); $order = SicpayOrder::findOne(['order_no'=>$pay_data['order_no'] ?? '']); if(empty($order)){ return false; } list($res,$pay_status) = $this->_handel_order($order->id,$pay_data); if($res && $pay_status == 1){ // 支付成功 return [ 'out_trade_no'=>$order->order_no, 'pay_fee'=>$order->amount, ]; } return false; } private function _handel_order($order_id,$resp){ $is_ok = $resp['pay_result']; $res = false; if($resp['pay_result'] == 1){ // 成功 $res = SicpayOrder::pay_success($order_id,$resp['pay_no'],$resp['pay_time'],$resp); }else if($resp['pay_result'] == 0){ // 未支付,不处理 }else if($resp['pay_result'] == 2){ // 支付失败 $res = SicpayOrder::pay_fail($order_id,$resp['err_msg'],$resp); }else if($resp['pay_result'] == 6){ // 已关闭 $res = SicpayOrder::pay_close($order_id,$resp['err_msg'],$resp); } return [$res,$is_ok]; } }