瀏覽代碼

'发货,退款'

aiyou 4 年之前
父節點
當前提交
f17e439cb0

+ 23 - 3
application/admin/controller/order/StoreOrder.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\order;
 
 use app\admin\model\general\Express;
+use app\api\controller\WxPay;
 use app\common\controller\Backend;
 
 /**
@@ -99,7 +100,7 @@ class StoreOrder extends Backend
      */
     public function refund($ids)
     {
-        $row = $this->model->where(['id' => $ids])->field('id,refund_status,refund_type,status,refund_reason_wap_img,refund_reason_wap_explain,refund_reason_time,refund_reason_wap,refund_reason,refund_price,refund_delivery_name,refund_delivery_id')->find();
+        $row = $this->model->where(['id' => $ids])->field('id,pay_price,order_id,refund_status,refund_type,status,refund_reason_wap_img,refund_reason_wap_explain,refund_reason_time,refund_reason_wap,refund_reason,refund_price,refund_delivery_name,refund_delivery_id')->find();
         if (!$row) {
             $this->error(__('No Results were found'));
         }
@@ -113,8 +114,27 @@ class StoreOrder extends Backend
                     $this->success("成功", null, ['id' => $ids]);
                 }
             }elseif($refund_status=5){
-                $this->model->where(['id' => $ids])->update(['refund_status'=>$refund_status,'refund_reason'=>$refund_reason,'status'=>0-$refund_status]);
-                $this->success("成功", null, ['id' => $ids]);
+
+                $reoderSn=$row['order_id'];//订单编号
+                //获取支付金额
+                $money =$row['pay_price'];
+                $wx = new WxPay();//实例化微信支付控制器
+
+                $body = '订单号' . $row['order_id'];//支付说明
+                $out_trade_no = $reoderSn;//订单号
+                $total_fee = $money * 100;//支付金额(乘以100)
+                $refund_fee=$row['refund_price']*100;
+                $order = $wx->wxrefund($out_trade_no,date('YmdHis').time(),$total_fee,$refund_fee);
+                // dump($order);
+                if(($order['return_code']=='SUCCESS') && ($order['result_code']=='SUCCESS')){
+                    $this->model->where(['id' => $ids])->update(['refund_status'=>$refund_status,'refund_reason'=>$refund_reason,'status'=>0-$refund_status]);
+                    $this->success("成功", null, ['id' => $ids]);
+                }else if(($order['return_code']=='FAIL') || $order['result_code']=='FAIL' ){
+                    $reason = (empty($order['err_code_des'])?$order['return_msg']:$order['err_code_des']);
+                    $this->error($reason);
+                }else{
+                    $this->error("退款失败");
+                }
             }
             $this->error("失败");
         }

+ 21 - 3
application/api/controller/WxPay.php

@@ -45,7 +45,25 @@ class WxPay extends Controller
         //将微信返回的结果xml转成数组
         return $this->xmltoarray($response);
     }
+    public function wxrefund($out_trade_no,$out_refund_no,$total_fee,$refund_fee)
+    {
+        $param = array(
+            'appid'=> $this->config["appid"],
+            'mch_id'=> $this->config['mch_id'],
+            'nonce_str'=>  $this->getRandChar(32),
+            'out_trade_no'=>$out_trade_no,
+            'out_refund_no'=>$out_refund_no,//订单号
+            //  'transaction_id'=> $transactionId,//微信订单号
+            'total_fee'=> $total_fee,
+            'refund_fee'=>$refund_fee
+        );
 
+        $param['sign'] = $this->getSign($param, false);
+        $xmldata = $this->arrayToXml($param);
+        $xmlresult = $this->postXmlSSLCurl($xmldata,'https://api.mch.weixin.qq.com/secapi/pay/refund');
+        $result = $this->xmlToArray($xmlresult);
+        return $result;
+    }
     //小程序*退款
     public function getOrder($out_trade_no,$out_refund_no,$total_fee,$refund_fee,$notify_url){
         $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
@@ -151,7 +169,7 @@ class WxPay extends Controller
         }
     }
     //需要使用证书的请求 * 退款
-    function postXmlSSLCurl($xml,$url,$second=30)
+    private function postXmlSSLCurl($xml,$url,$second=30)
     {
         $ch = curl_init();
         //超时时间
@@ -170,10 +188,10 @@ class WxPay extends Controller
         //使用证书:cert 与 key 分别属于两个.pem文件
         //默认格式为PEM,可以注释
         curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
-        curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);
+        curl_setopt($ch,CURLOPT_SSLCERT,  dirname(__DIR__).'/wxcert/apiclient_cert.pem');
         //默认格式为PEM,可以注释
         curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
-        curl_setopt($ch,CURLOPT_SSLKEY, $this->SSLKEY_PATH);
+        curl_setopt($ch,CURLOPT_SSLKEY,dirname(__DIR__).'/wxcert/apiclient_key.pem');
         //post提交方式
         curl_setopt($ch,CURLOPT_POST, true);
         curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);

二進制
application/api/wxcert/apiclient_cert.p12


+ 24 - 0
application/api/wxcert/apiclient_cert.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID/DCCAuSgAwIBAgIUR+8rJcXsrb6FCTX7slnfHQPXjcswDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjAwNzI5MDgwNTE2WhcNMjUwNzI4MDgwNTE2WjCBjTETMBEGA1UEAwwK
+MTYwMDg4NTE1ODEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTkwNwYDVQQL
+DDDmt4TljZrlkrvlkrvll5bovabnlLXlrZDllYbliqHmnInpmZDotKPku7vlhazl
+j7gxCzAJBgNVBAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAORBy3hULspJYPlA9fhyPa3qgY6rwRv50G/OlwVi
+c9pfzCLZypcULmmun8ivYHyBAhL43gxTLGuRcOA9w+gqQ66ITX4egKfprT/jlIjA
+G/Bi8Ul+kQ6kI4DUceMnnPMhR1n0aCddbJMd6TEGKkP0Lkrg24s9YHfLNdDX2ndz
+TZVa1qFshNZLLHr+lxi6XPXjL1l+VTbNq9xgFjdrtIMAnONo88WVqqnypIlT/8pN
+/r/k09SAcY1FFx+V3Zit5H9LkOYC1R4B3p0s8YrQdG7tNaYIDakI/F4MgTIOtx0F
+XITmLOejy6NY8qDHSs/FI24AcpIAf5LyviaL6a0dhAx4BAECAwEAAaOBgTB/MAkG
+A1UdEwQCMAAwCwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9l
+dmNhLml0cnVzLmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERC
+QzA0QjA2QUQzOTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEA
+Slev5LUruS3igl9CEu9iA+Ai6qs3i5ir+M6P3zEH9BDF1TdJbcxOgi4oZLQDltQF
+0VYdwuDn/Q+C3hYuGseYrD5hXgXKrOdlSEmmEQCAGjLyceYoA6ilQ2ktF/Oj4s18
+IE71kiUW0z13Bi75E5m3gepQGLN/fhucf2L/G9iuF1Z5lEfSXzXa5Fd6WFMGQqhI
+OfWL0Lfb4MQMUgxYCw5QwweMCCJUYU/yma851/wxMD7M6LHt6chWlZv++8rH+r+q
+egqPYMV829X3lN70dII/WeDCQlNzeLmo/DX3SZy/OQ1Ax+YLHFsyERJaHFs492UT
+xpWua8NcS77yGiQQK8hBEw==
+-----END CERTIFICATE-----

+ 28 - 0
application/api/wxcert/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDkQct4VC7KSWD5
+QPX4cj2t6oGOq8Eb+dBvzpcFYnPaX8wi2cqXFC5prp/Ir2B8gQIS+N4MUyxrkXDg
+PcPoKkOuiE1+HoCn6a0/45SIwBvwYvFJfpEOpCOA1HHjJ5zzIUdZ9GgnXWyTHekx
+BipD9C5K4NuLPWB3yzXQ19p3c02VWtahbITWSyx6/pcYulz14y9ZflU2zavcYBY3
+a7SDAJzjaPPFlaqp8qSJU//KTf6/5NPUgHGNRRcfld2YreR/S5DmAtUeAd6dLPGK
+0HRu7TWmCA2pCPxeDIEyDrcdBVyE5izno8ujWPKgx0rPxSNuAHKSAH+S8r4mi+mt
+HYQMeAQBAgMBAAECggEAdfNx+2o1C59Dl0n0UUBnkxmdfWZP0e8TwNMWw1eO2oeq
+a0/0GoH5Qe9U7lWCHJRlx/wGcoQAbk2n8Ji6RZyhgO06bjPA9AQS3PLzbH8pcN0Q
+JpRazSAQoKAngeSUfCb0Qg3ETKNAWf2Y5RZ0fM0Ppu3vRVKgKQc/df41DIjuzIA8
+PTED6274T7RlRpXkxNAnVXA9FvvWxEY7xEXnZrbaRtz9CgVCxkgZumAVM7UceXk0
+4iHL5qvUtQ3+7DoHLkD3RYyYcGipS3yRYUwJvRCKlQSZsv1EvWTHk6PVJBf4WYDM
+d3b1JloDJXAmHtg/yMUaT9bDqXN/lvKAXjsbutZ/4QKBgQD+/IBaPsfaX7ecH1Xd
+ybyEgj5IhPnTM3waEIXHEXM0KyaDkivprrlQNarRZOEWHl3Lm875hc0Z48npNgqr
+zJkeFsgxuC5lC5aF6mKQ50MiqoX8XhiecKAlPmOl0zIgzC2JTLaF4rZzi+kBxRMI
+5V+Vc4bbo5YEua/zU25clYe5RQKBgQDlKhdSLv4hJeZxIdsPaW8g9spZSlXCvLfm
+PdXUMO8z2lOsi79oogDsLChrw23nuC1glBQxGu2ZmLlnjj87mUBt1OZDNPR+54WK
+rk/2LX79Rpee+G4zD85hLfwBbgKcbEI/P0iNgnlkrH8DL+33wPAPl6A9zvwj2v8D
+DzMjXjAljQKBgBWh5mHBocLtC+662dYPH2c+hXoxjeBVJdowPKk+2b87SfEvnXod
+0Kr1YqCRJmdx/BMiDNUufNANezvF0fHxUawz0pglQApiiUqjL+mLNS7juKpIcV4/
+v9ZpDJss57vQlqxnTbTeHwx+ei4kQhEnJIzRWEeaAUg1WLAUC/De3rzhAoGBAKWW
+S3Gj6RcUprWajApP2e/Mw5vPXbav3IXuqmJ/1Wf3WzyzYeR+IwKESdTMSs8Dwy4k
+8Y4l8gdpVpbgLwqmiuqRyqxHSF+mdVUm7Tpp13e1mXtR8XbN9gc8TfrOfe5/P0Mq
+PAecfpDjH4ezC1VZQV1S54Oh24khBeE1C3OD7HBFAoGBAK8EFt4pXbj6QYeDa+AY
+zjCL9LZ+NKXZlZlLqxMD+YBrHCtAIZ+3AC+hEd+9nwljsJR9vZVZvBjvFhHxStPW
+uzLKp+ZQbf3aWTaBtsHrwdR3v6pcdXkp4t16O3XlUblkgBGIgJul3OFTzGc7bRV2
+DRqLXMNnUi0XqGTiIRaMH8X2
+-----END PRIVATE KEY-----

+ 18 - 0
application/api/wxcert/证书使用说明.txt

@@ -0,0 +1,18 @@
+欢迎使用微信支付!
+附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。
+证书属于敏感信息,请妥善保管不要泄露和被他人复制。
+不同开发语言下的证书格式不同,以下为说明指引:
+    证书pkcs12格式(apiclient_cert.p12)
+        包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
+        部分安全性要求较高的API需要使用该证书来确认您的调用身份
+        windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031)
+    证书pem格式(apiclient_cert.pem)
+        从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
+        部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
+        您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
+    证书密钥pem格式(apiclient_key.pem)
+        从apiclient_cert.p12中导出密钥部分的文件,为pem格式
+        部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
+        您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
+备注说明:  
+        由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书,  2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载 

+ 3 - 9
public/assets/js/backend/order/store_order.js

@@ -107,7 +107,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                                    // extend:'data-area=\'["500px","400px"]\'',
                                     dropdown:'更多操作',
                                     callback: function (data) {
-                                        table.bootstrapTable('refresh', {});
+                                      //  table.bootstrapTable('refresh', {});
                                     },
                                     visible: function (row) {
                                         //返回true时按钮显示,返回false隐藏
@@ -156,18 +156,12 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 var refund_status=$("input[name='refund_status']:checked").val();
                 var ids=$("input[name=ids]").val();
 
-                if (refund_status=='5'){
-                    Fast.api.ajax({
-                        confirm:'确认退款吗',
-                        url:'order/store_order/refund',
-                        data:{ids:ids,refund_status:refund_status,refund_reason:refund_reason}
-                    });
-                }
+
                 Fast.api.ajax({
                     url:'order/store_order/refund',
                     data:{ids:ids,refund_status:refund_status,refund_reason:refund_reason}
                 });
-               Fast.api.close(refund_reason);
+              // Fast.api.close(refund_reason);
             });
         },
         api: {