linwu 2 ani în urmă
părinte
comite
da2c25b283

+ 122 - 0
app/admin/controller/Demo.php

@@ -0,0 +1,122 @@
+<?php
+
+namespace app\admin\controller;
+
+use think\Response;
+use think\Config;
+/**
+ * 示例接口
+ */
+class Demo
+{
+
+    //如果$noNeedLogin为空表示所有接口都需要登录才能请求
+    //如果$noNeedRight为空表示所有接口都需要验证权限才能请求
+    //如果接口已经设置无需登录,那也就无需鉴权了
+    //
+    // 无需登录的接口,*表示全部
+    protected $noNeedLogin = ['*'];
+    // 无需鉴权的接口,*表示全部
+    protected $noNeedRight = ['*'];
+
+    /**
+     * 测试方法
+     *
+     */
+    public function test()
+    {
+        $batch_name   = '余额提现';//转账的名称
+        $out_trade_no = time().rand(1000,9999);//单号
+        $money        = 1;//金额
+        $openid       = 'o4a9g5cDIEVzS7zVzE-_VEK8y9Yg';//用户openid
+        $this->tixian($batch_name,$out_trade_no,$money,$openid);
+    }
+
+    public function tixian($batch_name,$out_trade_no,$money,$openid){
+        $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';
+        $pars = [];
+        $pars['appid'] = config('wxconfig.appId');//直连商户的appid
+        $pars['out_batch_no'] = 'sjzz'.date('Ymd').mt_rand(1000, 9999);//商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一
+        $pars['batch_name']   = $batch_name;//该笔批量转账的名称
+        $pars['batch_remark'] = $batch_name;//转账说明,UTF8编码,最多允许32个字符
+        $pars['total_amount'] = intval($money * 100);//转账总金额 单位为“分”
+        $pars['total_num']    = 1;//转账总笔数
+        $pars['transfer_detail_list'][0]  = [
+            'out_detail_no'=>'Dh'.$out_trade_no,
+            'transfer_amount'=>$pars['total_amount'],
+            'transfer_remark'=>$batch_name,
+            'openid'=>$openid
+        ];//转账明细列表
+        $token  = $this->getToken($pars);//获取token
+        $res    = $this->https_request($url,json_encode($pars),$token);//发送请求
+        $resArr = json_decode($res,true);
+        halt($resArr);
+        //成功返回
+        // array(3) {
+        //   ["batch_id"] => string(40) "1030001016101247194272022062900873000000"
+        //   ["create_time"] => string(25) "2022-06-29T10:21:30+08:00"
+        //   ["out_batch_no"] => string(16) "sjzz202206291647001"
+        // }
+    }
+    function https_request($url,$data = null,$token){
+        $curl = curl_init();
+        curl_setopt($curl, CURLOPT_URL, (string)$url);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
+        if (!empty($data)){
+            curl_setopt($curl, CURLOPT_POST, 1);
+            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
+        }
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        //添加请求头
+        $headers = [
+            'Authorization:WECHATPAY2-SHA256-RSA2048 '.$token,
+            'Accept: application/json',
+            'Content-Type: application/json; charset=utf-8',
+            'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
+        ];
+        if(!empty($headers)){
+            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
+        }
+        $output = curl_exec($curl);
+        curl_close($curl);
+        return $output;
+    }
+    public function getToken($pars)
+    {
+        // $url = 'https://api.mch.weixin.qq.com/v3/certificates';
+        $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';
+        $http_method = 'POST';//请求方法(GET,POST,PUT)
+        $timestamp   = time();//请求时间戳
+        $url_parts   = parse_url($url);//获取请求的绝对URL
+        $nonce       = $timestamp.rand('10000','99999');//请求随机串
+        $body        = json_encode((object)$pars);//请求报文主体
+        $stream_opts = [
+            "ssl" => [
+                "verify_peer"=>false,
+                "verify_peer_name"=>false,
+            ]
+        ];
+
+        $apiclient_cert_path = 'https://'.$_SERVER['HTTP_HOST'].'/uploads/apiclient/apiclient_cert.pem';
+        $apiclient_key_path  = 'https://'.$_SERVER['HTTP_HOST'].'/uploads/apiclient/apiclient_key.pem';
+
+        $apiclient_cert_arr = openssl_x509_parse(file_get_contents($apiclient_cert_path,false, stream_context_create($stream_opts)));
+        $serial_no          = $apiclient_cert_arr['serialNumberHex'];//证书序列号
+        $mch_private_key    = file_get_contents($apiclient_key_path,false, stream_context_create($stream_opts));//密钥
+        $merchant_id = config('wxconfig.payMchId');//商户id
+        $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
+        $message = $http_method."\n".
+            $canonical_url."\n".
+            $timestamp."\n".
+            $nonce."\n".
+            $body."\n";
+        openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
+        $sign = base64_encode($raw_sign);//签名
+        $schema = 'WECHATPAY2-SHA256-RSA2048';
+        $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
+            $merchant_id, $nonce, $timestamp, $serial_no, $sign);//微信返回token
+        return $token;
+    }
+
+}

BIN
app/app.tar.gz


BIN
app/app/app.zip


BIN
public/uploads/apiclient/apiclient_cert.p12


+ 24 - 0
public/uploads/apiclient/apiclient_cert.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID8zCCAtugAwIBAgIUI1Sl0S6FIBxFDMCcU+eBE7/vcmMwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjIwODMxMDA1NDQxWhcNMjcwODMwMDA1NDQxWjCBhDETMBEGA1UEAwwK
+MTYxOTM0OTA1MjEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTAwLgYDVQQL
+DCfnpo/lu7rnnIHmmYvmsZ/kurrlipvotYTmnKzmnInpmZDlhazlj7gxCzAJBgNV
+BAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBALdRMXOxwrJ14pmXL3SDe6CV/1M9a0kuTXbUliUKEYC2amYWT+KT
+TtLgjlMt7T5Opefs0wngMKT3JeMVEcKwKtxQPE35JAWZ93TifMjjV+/OSwV7qogj
+4TDH9UP4FPeWcU7Cg76h/vso5mMR1MnkF35lRkQ0/LrdLfW0QizYW0fxtjgysKgU
+UtxRfS+yWrd1DB6trp1Isjl3IBrdiZmZTso7/8iLwmEBtYH8uUohcDGKF99zhj7a
+LW5q6ZpNKfflGP2SeIqU0SOW2hbqyrKTcrcYOJ3yj1txB3xXsGALzx36bdVmd53b
+OhtYsOS/UgrJgEk1y98sI0tLYFtgVXICkacCAwEAAaOBgTB/MAkGA1UdEwQCMAAw
+CwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVz
+LmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQz
+OTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAmUjL9WVcazvw
+OLjZm9ptn3D0dXt/u6Ygrs81WQs9igVGgGmaaQHmJV5Qzk3Ica5odRK9wlC12sjE
+5/XyoFWja3BsTubb6+yMENAiawfEZaMjIIPH35tawlEdpN7DAQIs8SO5p+l79Dg0
+d+Pc+Zu1Wru1j+MYpVfhb3xXu+cqtgVqeSk9W0P6rLy89PHAvFzZpE23LpEZS4cp
+kHcaCZAhHvsic2w+Ym0zOV/3ifsaqAq5V/xcyIU0Qe5ZPlr+Xsou4JOt9ZyGCW5P
+S5aRkEq9dt1+yJQhVAJUEx6Hfb+qyHxOQVSqqJWswkTzNo4D7oZ7jH7BBh7WvzGg
+TzlQi2xGgw==
+-----END CERTIFICATE-----

+ 28 - 0
public/uploads/apiclient/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3UTFzscKydeKZ
+ly90g3uglf9TPWtJLk121JYlChGAtmpmFk/ik07S4I5TLe0+TqXn7NMJ4DCk9yXj
+FRHCsCrcUDxN+SQFmfd04nzI41fvzksFe6qII+Ewx/VD+BT3lnFOwoO+of77KOZj
+EdTJ5Bd+ZUZENPy63S31tEIs2FtH8bY4MrCoFFLcUX0vslq3dQwera6dSLI5dyAa
+3YmZmU7KO//Ii8JhAbWB/LlKIXAxihffc4Y+2i1uaumaTSn35Rj9kniKlNEjltoW
+6sqyk3K3GDid8o9bcQd8V7BgC88d+m3VZned2zobWLDkv1IKyYBJNcvfLCNLS2Bb
+YFVyApGnAgMBAAECggEAAVTZoxl7bIhmqO7sLVB3KWdtf1FG4jUv4tkQbhxwnBq3
+Ex6+XcrsG6P95KTEwFsZ4WFa9wtlzwzsfYW9p0hYR1ld1sMke9Xuci7i8SKVlOxO
+py+KwYphLFWHdoLqxBGXqRbIli3fCDv30Ghkv0Kk2QorRHuOCl1o5Av3HxRDNXaM
+0WO9tqp2aq6U8Xmbk/AtQ810C3VcjoZK6SPO78boBBflPg0ZwSnNe/8/7R5d8pCE
+Lqc93nkGjgfD+VXfGmj789nG6jjAQEEku+0T7nU1q6wiGfIO1Xif6FfT5Nz1lN1m
+anm+zbdCk2+dMCt8VFH/5I+1Mj9CyzBP020IezfOAQKBgQDlLLCD2yvitI8buA2b
+sjt96IQGEr/87vjV2k1z0xI9ytiJ+4b3fZbB2xxDWDmQOwZtwtz96ZITmoYQuqst
+92SKEDKghzeAK39jJ5G/nFgmlZQMZ6qlC++c1PIZ83t+YHaMp2x+Gi8lc6JjXpbr
+mko2XaGKAz3nRGQsfV8XcVGKwQKBgQDMxl4V/krQWLOGAhp/zWyJ647Zh6BdJops
++kKZObRarbAv6eBTWfmpioP/bXIOyin8TmB4Wi27rhMY0buQSZkaT2b2Ialui8dW
+Fz9OBo8goZ8vZYXh9XGdw4FtLbff5MkbVJzIUzwO5xJ4ql3pxUuLO2P796au4KlY
+lGZmvdk+ZwKBgQDekMMwmwcI2a/uDJZyseqjAdBOEaGQpAjXr3Xu2XrqtfgMMVHH
+Q5nI1OGi6ail0R0SNd/nXBI4paYz0wXx00Q57TctvYQCHrxNcJ1UiCL3/eZVEcyh
+E3F2Tzx8RYGWn1oiiWqNISLObXm0paVOVH5kRBRg83sIAdyDdJKIMs4tQQKBgEE5
+skBZJmVky5IU23H38emggXjijX7+Rrtdn5cE3WDA0E0CtvR1xWNufor+xoTVejgm
+ku3i84xDb0vJim/0MXNC9W3S3RAcL9tJPl3REwf20yiasuF9d7ojyvcGx/nl+vTc
+p6/ba1bn3WdYBN/wexaXTUq14H71iptvcYqqUCdjAoGANK+/iJA0LPQWq3RVD1Zd
+wI3b5NPTw85E2RwIBV+R7wLusMVlmQdz/AvoaibL2ElcnqjUOfADRtZGPLJg3GtR
+KeEi2r8aVIoEUbQk0diuvp7w8UJxQ9Hysxcvvtxs7X58GD2auVmxnany2WSl47rB
+U/lofVQrlNvYdpMyBMyQI/o=
+-----END PRIVATE KEY-----

+ 23 - 0
public/uploads/apiclient/cert.pem

@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID3DCCAsSgAwIBAgIUTM+ck3JVXSYdflq8mz/psb9IJXcwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjIwMTE4MDIzNzA5WhcNMjcwMTE3MDIzNzA5WjBuMRgwFgYDVQQDDA9U
+ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl
+bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo
+ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8ZJYkVm9v8EzQ3AtL
+aYVkpcm8TLRsdXuk3Yfm7N9grz9XiJhped/NAOqCbr3SId8Hr5JPoM0UNc4G8oQL
+TX13J7bSo3choZP+qyllrrK+3HPTZWAPVOpeUYuddvXtMgl0kunh7gqUPfwsWT48
+0mXbBXqiPYaIR0+F/ubwIB73IxNSArvrAhNa4kfMC8BoWVrVvxwpuYNdLrjaN8AO
+gA+WqzUCuwGernF68rja5uQcypV3WoF7jN3boLSsJuP92towMDi7ROUxdEgqS1Xq
+/tSKnB4yauXaQ0oDkIFbDLRTjDRoNNC62rUUZU38s1QNyk+cehvNyePiV/9SbvxK
+VklRAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc
+MFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js
+P0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ
+KoZIhvcNAQELBQADggEBAJU3dPGmWpeMLcegPx8HP4eFzil7vuKZxTvZoCaTbchS
+GZNDs+E4NQd8TIn5WMOBFt+gd8aQ2FomQ7kqz6/NQ2vFXb9JZd1dh+jzxH5K6Mqm
+Nr6+rhyAQigCT7Ts2uZdeaZIXWi/ZK+dAGEfNDacjSATvkagrYm14W1edZD0+0rv
+NxaG/JQBE7j2X8CI0a/dDpi3QUHIsdwaA+TyAKCaExP7qutiVxdEHqsDdozfS/VH
+EBvaKe8OarDK3tOxfZRGgmx+7aCBKih254Pku2MkwLT0XHIX88r0JLHehcQC6EUk
+xZ5IQEKd1Sh/yRImXM0FtGTAtFQL0Zf0H72djO3ZIpA=
+-----END CERTIFICATE-----

+ 19 - 0
public/uploads/apiclient/rootca.pem

@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
+dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
+MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
+dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
+BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
+cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
+MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
+aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
+ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
+IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
+7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
+1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
+-----END CERTIFICATE-----

+ 18 - 0
public/uploads/apiclient/证书使用说明.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)下载