gorden před 8 měsíci
rodič
revize
2e4affdc80

+ 38 - 6
app/admin/controller/order/WholeController.php

@@ -7,6 +7,7 @@ use app\admin\validate\coupon\CouponValidate;
 use app\admin\validate\device\DeviceValidate;
 use app\admin\validate\order\OrderExpressValidate;
 use app\admin\validate\order\OrderValidate;
+use app\common\payment\AppUtil;
 use app\common\payment\Tlpay;
 use app\controller\Curd;
 use app\model\Appointment;
@@ -309,7 +310,6 @@ class WholeController extends Curd
             }
 
             $payDetail = PayDetail::where('join_pay_order_id', $order->order_groupby)->first();
-            dump($payDetail);
             if ($payDetail->pay_category == 'CASH') {
                 $memberAccount = MemberAccount::where('join_account_member_id', $payDetail->join_pay_member_id)
                     ->where('member_account_classify', 'CASH')
@@ -952,6 +952,10 @@ class WholeController extends Curd
         if (!$order) {
             return json_fail("订单异常");
         }
+        if ($order->order_is_complete == 'Y' || $order->order_is_complete == 'R'){
+
+            return json_fail('订单已完成,无法退款');
+        }
         if ($amount > $order->order_amount_pay) {
             return json_fail('退款金额不能超过订单金额');
         }
@@ -978,22 +982,50 @@ class WholeController extends Curd
 
         try {
             Db::beginTransaction();
+            // 订单主表
+            Order::where('order_id', $return->join_return_order_id)->update(['order_is_complete' => 'R']);
+            // return 表
+            $return->order_return_status = 'DONE';
+            $return->save();
+
             $tlpay = new Tlpay();
-            $return = $tlpay->refund($data);
+            $res = $tlpay->refund($data);
+
+            // 生成payDetail
+            $payDetailData = [
+                'join_pay_member_id' => $order->join_order_member_id,
+                'join_pay_order_id' => $order->order_groupby,
+                'pay_status' => 'SUCCESS',
+                'pay_category' => 'REFUND',
+                'pay_amount' => $amount,
+                'pay_paytimes' => date('Y-m-d H:i:s'),
+                'pay_json_request' => json_encode($data),
+                'pay_json_response' => $res,
+                'pay_prepayid' => 0,
+                'pay_addtimes' => time()
+            ];
+            PayDetail::insert($payDetailData);
+
+            $resArray = json_decode($res, true);
+            if (AppUtil::validSign($resArray)) {
+                if ($resArray['retcode'] != 'SUCCESS' || $resArray['trxstatus'] != '0000') {
+//                    throw new PayException('退款失败,原因:' . $resArray['errmsg']);
+                }
+            }
 
             Db::commit();
 
-            _syslog("退款", "发起退款", $return, $data);
+            _syslog("退款", "发起退款", $resArray, $data);
             return json_success("退款成功");
         } catch (PayException $e) {
             Db::rollBack();
 
-            _syslog("退款", "发起退款", $e->getMessage(), $data);
-            return json_fail("发起退款失败");
+            _syslog("退款", "发起退款", $resArray ?? $e->getMessage(), $data);
+            return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
 
-            _syslog("退款", "发起退款", $e->getMessage(), $data);
+            _syslog("退款", "发起退款", $resArray ?? $e->getMessage(), $data);
             return json_fail("数据更新失败");
         }
     }

+ 9 - 0
app/admin/service/goods/GoodsService.php

@@ -826,6 +826,15 @@ class GoodsService
                 }
                 $data['goods_detail_slider_json'] = rtrim($slider, ',');
             }
+            $extendJson = [];
+            if (!empty($data['goods_attribute_json'])) {
+                $extendJson = json_decode($data['goods_attribute_json'], true);
+                $data['goods_attribute_json'] = $extendJson;
+                if (isset($extendJson['premisses'])) {
+                    $data['goods_premisses'] = $extendJson['premisses'];
+                    $data['goods_premisses_str'] = SysDept::whereIn('dept_id', $extendJson['premisses'])->pluck('dept_name');
+                }
+            }
 
             $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
 

+ 15 - 0
app/common/payment/AppConfig.php

@@ -0,0 +1,15 @@
+<?php
+namespace app\common\payment;
+/**
+ * 常量配置
+ */
+ class AppConfig{
+	const APPID = '00265677';
+	const CUSID = '660451073920V5E';
+    const PRIVATEKEY = 'MIIEowIBAAKCAQEA1PRVftKiQcN75dsB3p2CPHaqFtfDIhFAarQ9Vt9+470zNPKBHgJJKj4ievpDoCxOHXHQEHlRJqirlc57085cIQkR4aWce30YroPjNzvpQFPXlPFE30yom43DL0kHykHPPEQy81NUv9Afj1cQcUtRbHKsrBaq12Dhsp+lTK7dnMMHo02xwwYcb4U/QBkroZKo5aKFgy/JNpeENrADKC2fSqTqVcsWEZ+dzFOaTXqK8Va32u4JrMWIdEHGrZclUSMiqnYGZQwtEZgcsqFhrv3Akk8Ry1764Jh1w6z1XUGrVf0s/iY79lIWy3POanndYlnwjQEMmt6++oOk2h2+qniPIQIDAQABAoIBAD2WtKtLK9YtPUYLAw1pLGNkRmj42dyedKznl93qIX6oF4k2oZUWQCbRdZNvkeNfLPBjHDPHgmrV2VooL7PgONDtGJjUFt+4HE1Mo4gz8Y/DL9RJuwuB1jm21D52tqQOSGs7piitbxNSk+4W1hCOIexldf8HRz2nLV9FwL7ezAUr8z+VDXPUCCleuzZg2d4s8lhIY8hAg6IoHMwtrVJA9HCc9CdwBtqOZUKELPaU3wRM9+IxxQGJI7JqPifzRgXZAenC/UEI49c0vXUmx1lQL224K0apd4Lu+ikCw5bilVLYYLrFbV/PSefltr7zIGmKQ308U8zUdA3/tm7lNkvGPckCgYEA+unM5YszqtpCD0sfI0/9D+DvD8i75APLa05BU+0nrUqnX4JvhgKRRwd6k1dGK6vBj8ZCNf8/h2XySSW5Xux518PJaXVfmLgfiSNk1ohZOzdAzrYD9QkxrOHL6d5d7jEYg/lRGXz5AvWtMBXOgR0u9rmlvvOe6AosKWJgiwAfy/sCgYEA2UWIgmhDTZwxUvNT+0/KX6dVwG/d0FzON+onnuOGb4i8unGffvOs2jNkQg4xtAyPE4IhscJZLF0GypGLadUTE+txftERFQl6dVVtDT5CE41b4h+VV053mVAh+bnbLEhIsbp9xf4bVIO+Q0nrhj0wonkcBoNYkkQqXXmwU+DZ6pMCgYBDDMFFQdqPuH1YquFqRVDBsoEPvbt/5gew6BuK+t/UbhOl8SwuKnd5/KSjxPmqZ950ti0xUsE+RF7nbx5HIHg60UX8WXIvVFyRABVNQuhda5l046zRCSDuKvSbzWFaamI7uh8S6ZN9V/ts0xb457yKD/gbu+xl43oDoRddba4RiwKBgFVD02GR9y+i5zxtX3zVgE7vhViCziKx+P+6dZgGJEDrAV2Nr5ELob7zwhmmJl1JPHDkdcKjyYj+bObcHUEILHd5w02IUFLYKGWZg7VZxGaV6AQibuIXWhohd2PgSyHisByHWkp0AVe2Z9lSTgqdQtPQAW6Q5xZnh9StJ8STDhHfAoGBAMV96ScKbMWged6GsbWH0xEew/c5KwYZdKwim9ysyB2Il6O9VwYMCUWV1/XaZB+crOzpi/s9BVfPuGSOhzNqZkQPnSH39GJj/ud5D25OufQ0JUeMUzfgJ2wmYZp8Bk/C2UOQ/rdB/Uw/Dow1BDaoZ3ttgNEnev/ihWtpBMPbqJQb';
+
+    const PUBLICKEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm9OV6zH5DYH/ZnAVYHscEELdCNfNTHGuBv1nYYEY9FrOzE0/4kLl9f7Y9dkWHlc2ocDwbrFSm0Vqz0q2rJPxXUYBCQl5yW3jzuKSXif7q1yOwkFVtJXvuhf5WRy+1X5FOFoMvS7538No0RpnLzmNi3ktmiqmhpcY/1pmt20FHQQIDAQAB';
+    const APIURL = "https://vsp.allinpay.com/apiweb/unitorder";//生产环境
+    const APIVERSION = '11';
+ }
+?>

+ 68 - 0
app/common/payment/AppUtil.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace app\common\payment;
+
+use Payment\Common\PayException;
+
+class AppUtil
+{
+    /**
+     * 将参数数组签名
+     */
+
+    //RSA签名
+    public static function Sign(array $array)
+    {
+        ksort($array);
+        $bufSignSrc = AppUtil::ToUrlParams($array);
+        $private_key = AppConfig::PRIVATEKEY;
+        $private_key = chunk_split($private_key, 64, "\n");
+        $key = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($private_key) . "-----END RSA PRIVATE KEY-----";
+        //   echo $key;
+        if (openssl_sign($bufSignSrc, $signature, $key)) {
+            $sign = base64_encode($signature);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
+        } else {
+            throw new PayException('签名错误');
+        }
+
+        return $sign;
+    }
+
+
+    public static function ToUrlParams(array $array)
+    {
+        $buff = "";
+        foreach ($array as $k => $v) {
+            if ($v != "" && !is_array($v)) {
+                $buff .= $k . "=" . $v . "&";
+            }
+        }
+
+        $buff = trim($buff, "&");
+        return $buff;
+    }
+
+    /**
+     * 校验签名
+     * @param array 参数
+     * @param unknown_type appkey
+     */
+
+
+    public static function ValidSign(array $array)
+    {
+        $sign = $array['sign'];
+        unset($array['sign']);
+        ksort($array);
+        $bufSignSrc = AppUtil::ToUrlParams($array);
+        $public_key = AppConfig::PUBLICKEY;
+        $public_key = chunk_split($public_key, 64, "\n");
+        $key = "-----BEGIN PUBLIC KEY-----\n$public_key-----END PUBLIC KEY-----\n";
+        $result = openssl_verify($bufSignSrc, base64_decode($sign), $key);
+        return $result;
+    }
+
+
+}
+
+?>

+ 39 - 9
app/common/payment/Tlpay.php

@@ -1,4 +1,5 @@
 <?php
+
 namespace app\common\payment;
 
 use Payment\Client\Refund;
@@ -15,20 +16,49 @@ class Tlpay
         $this->config = config('payment.tl');
     }
 
+
+    //当天交易请用撤销,非当天交易才用此退货接口
     public function refund($data)
     {
-        if (!$data){
-            return json_fail('参数异常');
-        }
-
+        $params = array();
+        $params["cusid"] = AppConfig::CUSID;
+        $params["appid"] = AppConfig::APPID;
+        $params["version"] = AppConfig::APIVERSION;
+        $params["trxamt"] = $data['trxamt'];
+        $params["reqsn"] = $data['reqsn'];
+        $params["oldtrxid"] = $data['oldtrxid'];//原来订单号
+        $params["randomstr"] = $data['randomstr'];//
+        $params["signtype"] = 'RSA';
         try {
-            $ret = Refund::run(Config::TL_REFUND, $this->config, $data);
+            $params["sign"] = urlencode(AppUtil::Sign($params));//签名
+            $paramsStr = AppUtil::ToUrlParams($params);
+            $url = AppConfig::APIURL . "/refund";
+            $rsp = http_post($url, $paramsStr);
+
+            file_put_contents(runtime_path('logs/tlpay.log'), $rsp);
 
-            file_put_contents(runtime_path('logs/tlpay.log'),json_encode($ret, JSON_UNESCAPED_UNICODE));
-            return $ret;
-        } catch (PayException $e) {
-            throw new PayException("发起退款失败");
+            return $rsp;
+        } catch (\Exception $e) {
+            throw new PayException("退款失败,原因:" . $e->getMessage());
         }
 
     }
+
+//    public function refund($data)
+//    {
+//        if (!$data){
+//            return json_fail('参数异常');
+//        }
+//
+//        try {
+//            $ret = Refund::run(Config::TL_REFUND, $this->config, $data);
+//
+//            file_put_contents(runtime_path('logs/tlpay.log'),json_encode($ret, JSON_UNESCAPED_UNICODE));
+//            return $ret;
+//        } catch (PayException $e) {
+//            dump($e->getMessage());
+//            throw new PayException("发起退款失败");
+//        }
+//
+//    }
 }

+ 21 - 0
app/functions.php

@@ -2,3 +2,24 @@
 /**
  * Here is your custom functions.
  */
+
+if (!function_exists('http_post')) {
+    function http_post($url,$params){
+        $ch = curl_init();
+        $this_header = array("content-type: application/x-www-form-urlencoded;charset=UTF-8");
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $this_header);
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
+        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
+
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//如果不加验证,就设false,商户自行处理
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
+
+        $output = curl_exec($ch);
+        curl_close($ch);
+        return $output;
+    }
+}

+ 6 - 8
config/payment.php

@@ -2,17 +2,15 @@
 
 return [
     'tl' => [
-        'app_id' => '00265677',  // 公众账号ID
+        'app_id' => '00265677',  // APPID
         'cus_id' => '660451073920V5E',// 商户id
         'md5_key' => '55079104816PJXP04',// md5 秘钥
-        'sign_type' => 'MD5',// MD5  HMAC-SHA256
-
+        'private_key' => 'MIIEowIBAAKCAQEA1PRVftKiQcN75dsB3p2CPHaqFtfDIhFAarQ9Vt9+470zNPKBHgJJKj4ievpDoCxOHXHQEHlRJqirlc57085cIQkR4aWce30YroPjNzvpQFPXlPFE30yom43DL0kHykHPPEQy81NUv9Afj1cQcUtRbHKsrBaq12Dhsp+lTK7dnMMHo02xwwYcb4U/QBkroZKo5aKFgy/JNpeENrADKC2fSqTqVcsWEZ+dzFOaTXqK8Va32u4JrMWIdEHGrZclUSMiqnYGZQwtEZgcsqFhrv3Akk8Ry1764Jh1w6z1XUGrVf0s/iY79lIWy3POanndYlnwjQEMmt6++oOk2h2+qniPIQIDAQABAoIBAD2WtKtLK9YtPUYLAw1pLGNkRmj42dyedKznl93qIX6oF4k2oZUWQCbRdZNvkeNfLPBjHDPHgmrV2VooL7PgONDtGJjUFt+4HE1Mo4gz8Y/DL9RJuwuB1jm21D52tqQOSGs7piitbxNSk+4W1hCOIexldf8HRz2nLV9FwL7ezAUr8z+VDXPUCCleuzZg2d4s8lhIY8hAg6IoHMwtrVJA9HCc9CdwBtqOZUKELPaU3wRM9+IxxQGJI7JqPifzRgXZAenC/UEI49c0vXUmx1lQL224K0apd4Lu+ikCw5bilVLYYLrFbV/PSefltr7zIGmKQ308U8zUdA3/tm7lNkvGPckCgYEA+unM5YszqtpCD0sfI0/9D+DvD8i75APLa05BU+0nrUqnX4JvhgKRRwd6k1dGK6vBj8ZCNf8/h2XySSW5Xux518PJaXVfmLgfiSNk1ohZOzdAzrYD9QkxrOHL6d5d7jEYg/lRGXz5AvWtMBXOgR0u9rmlvvOe6AosKWJgiwAfy/sCgYEA2UWIgmhDTZwxUvNT+0/KX6dVwG/d0FzON+onnuOGb4i8unGffvOs2jNkQg4xtAyPE4IhscJZLF0GypGLadUTE+txftERFQl6dVVtDT5CE41b4h+VV053mVAh+bnbLEhIsbp9xf4bVIO+Q0nrhj0wonkcBoNYkkQqXXmwU+DZ6pMCgYBDDMFFQdqPuH1YquFqRVDBsoEPvbt/5gew6BuK+t/UbhOl8SwuKnd5/KSjxPmqZ950ti0xUsE+RF7nbx5HIHg60UX8WXIvVFyRABVNQuhda5l046zRCSDuKvSbzWFaamI7uh8S6ZN9V/ts0xb457yKD/gbu+xl43oDoRddba4RiwKBgFVD02GR9y+i5zxtX3zVgE7vhViCziKx+P+6dZgGJEDrAV2Nr5ELob7zwhmmJl1JPHDkdcKjyYj+bObcHUEILHd5w02IUFLYKGWZg7VZxGaV6AQibuIXWhohd2PgSyHisByHWkp0AVe2Z9lSTgqdQtPQAW6Q5xZnh9StJ8STDhHfAoGBAMV96ScKbMWged6GsbWH0xEew/c5KwYZdKwim9ysyB2Il6O9VwYMCUWV1/XaZB+crOzpi/s9BVfPuGSOhzNqZkQPnSH39GJj/ud5D25OufQ0JUeMUzfgJ2wmYZp8Bk/C2UOQ/rdB/Uw/Dow1BDaoZ3ttgNEnev/ihWtpBMPbqJQb',
+        'public_key' => 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm9OV6zH5DYH/ZnAVYHscEELdCNfNTHGuBv1nYYEY9FrOzE0/4kLl9f7Y9dkWHlc2ocDwbrFSm0Vqz0q2rJPxXUYBCQl5yW3jzuKSXif7q1yOwkFVtJXvuhf5WRy+1X5FOFoMvS7538No0RpnLzmNi3ktmiqmhpcY/1pmt20FHQQIDAQAB',
+        'sign_type' => 'RSA',// MD5  HMAC-SHA256
         'limit_pay' => ['no_credit'],
-
-        'notify_url' => 'http://172.16.2.46:8080/vo-apidemo/OrderServlet',
-
-        'redirect_url' => 'https://helei112g.github.io/',// 如果是h5支付,可以设置该值,返回到指定页面
-
+        'notify_url' => 'https://app.wanyuewellness.com.cn/',
+        'redirect_url' => '',// 如果是h5支付,可以设置该值,返回到指定页面
         'return_raw' => false,// 在处理回调时,是否直接返回原始数据,默认为true
     ]
 ];