Browse Source

fix:都是

super-yimizi 2 months ago
parent
commit
d933f520fb

+ 1 - 1
addons/epay/.addonrc

@@ -1 +1 @@
-{"files":["application\/.DS_Store","application\/admin\/controller\/Epay.php","public\/assets\/addons\/epay\/css\/common.css","public\/assets\/addons\/epay\/less\/common.less","public\/assets\/addons\/epay\/images\/paid.png","public\/assets\/addons\/epay\/images\/logo-wechat.png","public\/assets\/addons\/epay\/images\/logo-alipay.png","public\/assets\/addons\/epay\/images\/screenshot-alipay.png","public\/assets\/addons\/epay\/images\/alipay.png","public\/assets\/addons\/epay\/images\/screenshot-wechat.png","public\/assets\/addons\/epay\/images\/wechat.png","public\/assets\/addons\/epay\/images\/scan.png","public\/assets\/addons\/epay\/images\/expired.png","public\/assets\/addons\/epay\/js\/jquery.qrcode.min.js","public\/assets\/addons\/epay\/js\/common.js"],"license":"regular","licenseto":"9671","licensekey":"xv40rgCNFufkIyR7 kVa35bA9v6dzkn8inBgmKA==","domains":[],"licensecodes":[],"validations":[]}
+{"files":["application\/admin\/controller\/Epay.php","public\/assets\/addons\/epay\/css\/common.css","public\/assets\/addons\/epay\/less\/common.less","public\/assets\/addons\/epay\/images\/paid.png","public\/assets\/addons\/epay\/images\/logo-wechat.png","public\/assets\/addons\/epay\/images\/logo-alipay.png","public\/assets\/addons\/epay\/images\/screenshot-alipay.png","public\/assets\/addons\/epay\/images\/alipay.png","public\/assets\/addons\/epay\/images\/screenshot-wechat.png","public\/assets\/addons\/epay\/images\/wechat.png","public\/assets\/addons\/epay\/images\/scan.png","public\/assets\/addons\/epay\/images\/expired.png","public\/assets\/addons\/epay\/js\/jquery.qrcode.min.js","public\/assets\/addons\/epay\/js\/common.js"],"license":"regular","licenseto":"9671","licensekey":"AmC4EWejPcGNQDah CXD\/Kwdw5wNsm8wfstxiYw==","domains":["thinkphp_fastadmin_lottery.test"],"licensecodes":[],"validations":["022dd74d4cf1f33577d64ebe41b309d2"]}

+ 61 - 25
application/api/controller/Pay.php

@@ -12,6 +12,10 @@ use app\common\Enum\ChannelEnum;
 use app\common\Service\OrderService;
 use app\common\Service\OrderService;
 use app\common\model\Third as ThirdOauth;
 use app\common\model\Third as ThirdOauth;
 use app\common\model\Order;
 use app\common\model\Order;
+use app\common\model\pay\Index as PayModel;
+use app\common\Enum\PayEnum;
+use Yansongda\Pay\Pay as YansongdaPay;
+use Psr\Http\Message\ResponseInterface;
 /**
 /**
  * 支付接口
  * 支付接口
  */
  */
@@ -25,36 +29,68 @@ class Pay extends Base
         parent::_initialize();
         parent::_initialize();
         set_addon_config('epay', ['version'=>'v3'], false);
         set_addon_config('epay', ['version'=>'v3'], false);
     }
     }
-    /**
-     * 
-     * 支付回调
-     * @return void
+
+     /**
+     * 支付成功回调
      */
      */
     public function notify()
     public function notify()
     {
     {
-        $type = $this->request->param('type');
-        $paytype = $this->request->param('paytype');
-        if ($type == 'notify') {
-            $pay = \addons\epay\library\Service::checkNotify($paytype);
-            if (!$pay) {
-                echo '签名错误';
-                \think\Log::write('签名错误', 'epay',);
-                return;
+        Log::write('pay-notify-comein:');
+
+        $payment = $this->request->param('payment');
+        $platform = $this->request->param('platform');
+
+        $payService = new PayService($payment, $platform);
+
+        $result = $payService->notify(function ($data, $originData = []) use ($payment) {
+            Log::write('pay-notify-data:' . json_encode($data));
+
+            $out_trade_no = $data['out_trade_no'];
+
+            // 查询 pay 交易记录
+            $payModel = PayModel::where('pay_sn', $out_trade_no)->find();
+            if (!$payModel || $payModel->status !=  PayEnum::PAY_STATUS_UNPAID) {
+                // 订单不存在,或者订单已支付
+                return YansongdaPay::$payment()->success();
             }
             }
-            $data = $pay->verify();
-            // try {
-                $payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;
-                PayOperService::settle($data['out_trade_no'], $payamount, $paytype == 'alipay' ? $data['trade_no'] : $data['transaction_id']);
-            // } catch (\Exception $e) {
-            //     \think\Log::write($e->getMessage(), 'epay');
-            // }
-            echo $pay->success();
-        }//  pc 支付
-         elseif ($type == 'return') {
-            // $order_sn = $this->request->param('order_sn');
-            // $this->redirect("index/shop.order/detail", ['orderid' => $order_sn]);
+
+            Db::transaction(function () use ($payModel, $data, $originData, $payment) {
+                $notify = [
+                    'pay_sn' => $data['out_trade_no'],
+                    'transaction_id' => $data['transaction_id'],
+                    'notify_time' => $data['notify_time'],
+                    'buyer_info' => $data['buyer_info'] ?? "",
+                    'payment_json' => $originData ? json_encode($originData) : json_encode($data),
+                    'pay_fee' => $data['pay_fee'],          // 微信的已经*100处理过了
+                    'pay_type' => $payment              // 支付方式
+                ];
+
+                // pay 实例
+                $payOper = new PayOperService($payModel->user_id);
+                $payOper->notify($payModel, $notify);
+            });
+
+            return YansongdaPay::$payment()->success();
+        });
+
+        return $this->payResponse($result, $payment);
+    }
+       /**
+     * 处理返回结果 tp5 不能直接 return YansongdaPay::$payment()->success()
+     *
+     * @param object|string $result
+     * @param string|null $payment
+     * @return void
+     */
+    private function payResponse($result = null, $payment = null)
+    {
+        if ($result instanceof ResponseInterface) {
+            $content = $result->getBody()->getContents();
+            $content = $payment == 'wechat' || $payment == 'douyin' ? json_decode($content, true) : $content;
+            return response($content, 200, [], ($payment == 'wechat' ? 'json' : ''));
         }
         }
-        return;
+
+        return $result;
     }
     }
 
 
     /**
     /**

+ 8 - 6
application/common/Service/Pay/Provider/Base.php

@@ -70,9 +70,9 @@ class Base
     public function init($payment, $config = [], $type = 'normal')
     public function init($payment, $config = [], $type = 'normal')
     {
     {
         $this->config = $this->getConfig($payment, $config, $type);
         $this->config = $this->getConfig($payment, $config, $type);
-
         $this->pay = Pay::config($this->config);
         $this->pay = Pay::config($this->config);
         Pay::set(HttpClientInterface::class, HttpClient::instance());       // 使用自定义 client (也继承至 GuzzleHttp\Client)
         Pay::set(HttpClientInterface::class, HttpClient::instance());       // 使用自定义 client (也继承至 GuzzleHttp\Client)
+       
     }
     }
 
 
     /**
     /**
@@ -86,16 +86,18 @@ class Base
         // 获取平台配置
         // 获取平台配置
         $platformConfig = $this->getPlatformConfig();
         $platformConfig = $this->getPlatformConfig();
         extract($platformConfig);
         extract($platformConfig);
-
+     
         $params = $this->getPayConfig($payment, $paymentConfig);
         $params = $this->getPayConfig($payment, $paymentConfig);
 
 
         // 格式化支付参数
         // 格式化支付参数
         $params['mode'] = $params['mode'] ?? 0;
         $params['mode'] = $params['mode'] ?? 0;
-        $params = $this->formatConfig($params, ['app_id' => $app_id], $type);
-
+        if($payment == 'douyin'){
+            $params = $this->formatConfig($params, ['mini_app_id' => $app_id], $type);
+        }else{
+            $params = $this->formatConfig($params, ['app_id' => $app_id], $type);
+        }        
         // 合并传入的参数
         // 合并传入的参数
         $params = array_merge($params, $config);
         $params = array_merge($params, $config);
-
         // 合并参数
         // 合并参数
         $config = $this->baseConfig();
         $config = $this->baseConfig();
         $config = array_merge($config, [$payment => ['default' => $params]]);
         $config = array_merge($config, [$payment => ['default' => $params]]);
@@ -114,7 +116,7 @@ class Base
 
 
         $paymentConfig = $platformConfig['payment'] ?? [];
         $paymentConfig = $platformConfig['payment'] ?? [];
         $app_id = $platformConfig['app_id'] ?? '';
         $app_id = $platformConfig['app_id'] ?? '';
-
+      
         return compact('paymentConfig', 'app_id');
         return compact('paymentConfig', 'app_id');
     }
     }
 
 

+ 11 - 13
application/common/Service/Pay/Provider/Douyin.php

@@ -13,6 +13,9 @@ use app\common\Enum\ChannelEnum;
  */
  */
 class Douyin extends Base
 class Douyin extends Base
 {
 {
+
+
+
     /**
     /**
      * 构造函数
      * 构造函数
      * @param mixed $payService
      * @param mixed $payService
@@ -33,11 +36,10 @@ class Douyin extends Base
     public function pay($order, $config = []) 
     public function pay($order, $config = []) 
     {
     {
         $this->init('douyin', $config);
         $this->init('douyin', $config);
-
         // 按照抖音支付API要求构建订单参数
         // 按照抖音支付API要求构建订单参数
         $orderData = [
         $orderData = [
-            'out_order_no' => $order['out_trade_no'],
-            'total_amount' => intval($order['total_amount']), // 抖音支付金额单位为分
+            'out_order_no' => $order['out_order_no'] ?? $order['out_trade_no'],
+            'total_amount' => intval(bcmul((string)$order['total_amount'], '100')), // 抖音支付金额单位为分
             'subject' => $order['subject'] ?? '商品支付',
             'subject' => $order['subject'] ?? '商品支付',
             'body' => $order['body'] ?? '商品支付',
             'body' => $order['body'] ?? '商品支付',
             'valid_time' => $config['valid_time'] ?? 600, // 默认10分钟
             'valid_time' => $config['valid_time'] ?? 600, // 默认10分钟
@@ -55,13 +57,9 @@ class Douyin extends Base
         if (isset($config['msg_page'])) {
         if (isset($config['msg_page'])) {
             $orderData['msg_page'] = $config['msg_page'];
             $orderData['msg_page'] = $config['msg_page'];
         }
         }
-
-        // 移除不需要的字段
-        unset($order['order_id'], $order['total_amount']);
-        
         // 获取支付方法
         // 获取支付方法
         $method = $this->getMethod('douyin');
         $method = $this->getMethod('douyin');
-        
+    
         // 调用 Yansongda\Pay 进行支付
         // 调用 Yansongda\Pay 进行支付
         $result = Pay::douyin()->$method($orderData);
         $result = Pay::douyin()->$method($orderData);
 
 
@@ -98,16 +96,16 @@ class Douyin extends Base
             Log::write('抖音支付回调原始数据:' . json_encode($data, JSON_UNESCAPED_UNICODE));
             Log::write('抖音支付回调原始数据:' . json_encode($data, JSON_UNESCAPED_UNICODE));
             
             
             // 处理支付成功回调
             // 处理支付成功回调
-            if ($data['type'] === 'payment' && $data['msg'] === 'success') {
+            if ($data['type'] === 'payment') {
                 // 格式化数据为统一格式
                 // 格式化数据为统一格式
                 $callbackData = [
                 $callbackData = [
-                    'out_trade_no' => $data['out_order_no'],
-                    'transaction_id' => $data['order_id'],
+                    'out_trade_no' => $data['cp_orderno'],
+                    'transaction_id' => $data['cp_orderno'],
                     'total_amount' => $data['total_amount'],
                     'total_amount' => $data['total_amount'],
                     'pay_fee' => $data['total_amount'], // 抖音支付金额单位为分,这里保持原样
                     'pay_fee' => $data['total_amount'], // 抖音支付金额单位为分,这里保持原样
                     'notify_time' => date('Y-m-d H:i:s'),
                     'notify_time' => date('Y-m-d H:i:s'),
-                    'buyer_info' => $data['buyer_info'] ?? '',
-                    'cp_extra' => $data['cp_extra'] ?? ''
+                    // 'buyer_info' => $data['buyer_info'] ?? '',
+                    // 'cp_extra' => $data['cp_extra'] ?? ''
                 ];
                 ];
 
 
                 $result = $callback($callbackData, $data);
                 $result = $callback($callbackData, $data);

+ 2 - 1
composer.json

@@ -29,7 +29,8 @@
         "ext-json": "*",
         "ext-json": "*",
         "ext-curl": "*",
         "ext-curl": "*",
         "ext-pdo": "*",
         "ext-pdo": "*",
-        "ext-bcmath": "*"
+        "ext-bcmath": "*",
+        "hyperf/pimple": "~2.2.0"
     },
     },
     "config": {
     "config": {
         "preferred-install": "dist",
         "preferred-install": "dist",