Browse Source

测试零钱到帐

linwu 2 năm trước cách đây
mục cha
commit
17ac4ba0b3
2 tập tin đã thay đổi với 165 bổ sung37 xóa
  1. 5 37
      app/admin/controller/Index.php
  2. 160 0
      extend/payment/wechat/WechatTransfers.php

+ 5 - 37
app/admin/controller/Index.php

@@ -2,10 +2,8 @@
 
 namespace app\admin\controller;
 
-use WeChatPay\Builder;
-use WeChatPay\Crypto\Rsa;
-use WeChatPay\Transformer;
-use WeChatPay\Util\PemUtil;
+
+use payment\wechat\WechatTransfers;
 
 class Index
 {
@@ -16,38 +14,8 @@ class Index
 
     public function t1()
     {
-        // 商户号
-        $merchantId = config('wxconfig.payMchId');
-
-// 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
-        $merchantPrivateKeyFilePath = file_get_contents(root_path('/extend/wechat-del/cert') . 'apiclient_key.pem');
-        $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
-
-// 「商户API证书」的「证书序列号」
-        $merchantCertificateSerial = config('wxconfig.serial');
-
-// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
-        $platformCertificateFilePath = file_get_contents(root_path('/extend/wechat-del/cert') . 'apiclient_cert.pem');
-        $platformPublicKeyInstance   = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
-
-// 从「微信支付平台证书」中获取「证书序列号」
-        $platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
-
-// 构造一个 APIv3 客户端实例
-        $instance = Builder::factory([
-            'mchid'      => $merchantId,
-            'serial'     => $merchantCertificateSerial,
-            'privateKey' => $merchantPrivateKeyInstance,
-            'certs'      => [
-                $platformCertificateSerial => $platformPublicKeyInstance,
-            ],
-        ]);
-
-// 发送请求
-        $resp = $instance->chain('v3/certificates')->get(
-            ['debug' => true] // 调试模式,https://docs.guzzlephp.org/en/stable/request-options.html#debug
-        );
-        halt($resp->getBody());
-
+        $server = new WechatTransfers(config('wxconfig.appId'),config('wxconfig.payMchId'),config('wxconfig.appSecret'),$_SERVER['SERVER_ADDR']);
+        $res = $server->sendMoney(1,'o4a9g5cDIEVzS7zVzE-_VEK8y9Yg');
+        halt($res);
     }
 }

+ 160 - 0
extend/payment/wechat/WechatTransfers.php

@@ -0,0 +1,160 @@
+<?php
+/**
+ * 微信付款到零钱
+ */
+
+namespace payment\wechat;
+
+class WechatTransfers
+{
+    const TRANSFERS_URL = '/mmpaymkttransfers/promotion/transfers';
+
+    private $app_id = '';
+    private $mchid = '';
+    private $secret_key = '';
+    private $ip = '';
+
+    public function __construct($app_id, $mchid, $secret_key, $ip)
+    {
+        $this->app_id     = $app_id;
+        $this->mchid      = $mchid;
+        $this->secret_key = $secret_key;
+        $this->ip         = $ip;
+    }
+
+    public function xmltoarray($xml)
+    {
+        //禁止引用外部xml实体
+        libxml_disable_entity_loader(true);
+        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
+        $val       = json_decode(json_encode($xmlstring), true);
+        return $val;
+    }
+
+    public function arraytoxml($data)
+    {
+        $str = '<xml>';
+        foreach ($data as $k => $v) {
+            $str .= '<' . $k . '>' . $v . '</' . $k . '>';
+        }
+        $str .= '</xml>';
+        return $str;
+    }
+
+    public function createNoncestr($length = 32)
+    {
+        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789";
+        $str   = "";
+
+        for ($i = 0; $i < $length; $i++) {
+            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
+        }
+        return $str;
+    }
+
+    public function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = [])
+    {
+        $isdir = $_SERVER['DOCUMENT_ROOT'] . "/cert/";//证书位置;绝对路径
+
+        $ch = curl_init();//初始化curl
+
+        curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
+        curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
+        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
+        curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//证书位置
+        curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
+        curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
+        curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
+        curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
+        if (($aHeader) >= 1) {
+            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
+        }
+        curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);//全部数据使用HTTP协议中的"POST"操作来发送
+
+        $data = curl_exec($ch);//执行回话
+        if ($data) {
+            curl_close($ch);
+            return $data;
+        } else {
+            $error = curl_errno($ch);
+            echo "call faild, errorCode:$error";
+            curl_close($ch);
+            return false;
+        }
+    }
+
+    function sendMoney($amount, $re_openid, $desc = '测试', $check_name = '')
+    {
+
+        $total_amount = (100) * $amount;
+
+        $data = [
+            'mch_appid'        => $this->app_id,//商户账号appid
+            'mchid'            => $this->mchid,//商户号
+            'nonce_str'        => $this->createNoncestr(),//随机字符串
+            'partner_trade_no' => date('YmdHis') . rand(1000, 9999),//商户订单号
+            'openid'           => $re_openid,//用户openid
+            'check_name'       => 'NO_CHECK',//校验用户姓名选项,
+            're_user_name'     => $check_name,//收款用户姓名
+            'amount'           => $total_amount,//金额
+            'desc'             => $desc,//企业付款描述信息
+            'spbill_create_ip' => $this->ip,//Ip地址
+        ];
+
+        //生成签名算法
+        $secrect_key = $this->secret_key;///这个就是个API密码。MD5 32位。
+        $data        = array_filter($data);
+        ksort($data);
+        $str = '';
+        foreach ($data as $k => $v) {
+            $str .= $k . '=' . $v . '&';
+        }
+        $str          .= 'key=' . $secrect_key;
+        $data['sign'] = md5($str);
+        //生成签名算法
+
+
+        $xml = $this->arraytoxml($data);
+
+        $url    = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //调用接口
+        $res    = $this->curl_post_ssl($url, $xml);
+        $return = $this->xmltoarray($res);
+
+
+        print_r($return);
+        //返回来的结果是xml,最后转换成数组
+        /*
+        array(9) {
+         ["return_code"]=>
+         string(7) "SUCCESS"
+         ["return_msg"]=>
+         array(0) {
+         }
+         ["mch_appid"]=>
+         string(18) "wx57676786465544b2a5"
+         ["mchid"]=>
+         string(10) "143345612"
+         ["nonce_str"]=>
+         string(32) "iw6TtHdOySMAfS81qcnqXojwUMn8l8mY"
+         ["result_code"]=>
+         string(7) "SUCCESS"
+         ["partner_trade_no"]=>
+         string(18) "201807011410504098"
+         ["payment_no"]=>
+         string(28) "1000018301201807019357038738"
+         ["payment_time"]=>
+         string(19) "2018-07-01 14:56:35"
+        }
+        */
+
+
+        $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
+        echo $res = $responseObj->return_code; //SUCCESS 如果返回来SUCCESS,则发生成功,处理自己的逻辑
+
+        return $res;
+    }
+}