| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <?php
- namespace addons\Sicpay\common\services;
- use addons\Sicpay\common\models\SicpayConfig;
- use addons\Sicpay\common\models\SicpayConfig as Config;
- use addons\Sicpay\common\models\SicpayOrder;
- use addons\Sicpay\common\sdk\config\AlipayAppStruct;
- use addons\Sicpay\common\sdk\config\AlipayWapStruct;
- use addons\Sicpay\common\sdk\config\BaseStruct;
- use addons\Sicpay\common\sdk\config\CloudAppStruct;
- use addons\Sicpay\common\sdk\config\CloudH5Struct;
- use addons\Sicpay\common\sdk\config\QueryStruct;
- use addons\Sicpay\common\sdk\config\WechatAppStruct;
- use addons\Sicpay\common\sdk\config\WechatGZHStruct;
- use addons\Sicpay\common\sdk\config\WechatWapStruct;
- use addons\Sicpay\common\sdk\PayCore;
- use addons\Sicpay\common\sdk\PaySign;
- use common\models\common\PaymentTrade;
- use common\models\common\PaymentTradeOrder;
- use common\models\common\PaymentTradeGroupOrder;
- class PayService extends BaseService
- {
- // 查询是否支付成功
- public function query($order_no){
- $order = SicpayOrder::findOne(['order_no'=>$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];
- }
- }
|