dever 3 gadi atpakaļ
vecāks
revīzija
78167d408c
2 mainītis faili ar 295 papildinājumiem un 3 dzēšanām
  1. 14 3
      app/shop/lib/Cron.php
  2. 281 0
      app/shop/src/Yspay.php

+ 14 - 3
app/shop/lib/Cron.php

@@ -7,16 +7,27 @@ use Dever;
 class Cron
 {
     # 获取7天后完成的订单 准备分账
-    public function yspay()
+    public function yspay_api()
     {
         $time = time();
         $where['status'] = '5,6';
+        $where['withdraw'] = 1;
         $where['cdate'] = $time - 7*86400;
         $order = Dever::db('shop/sell_order')->getDataByTime($where);
 
-        print_r($order);die;
         if ($order) {
-            
+            foreach ($order as $k => $v) {
+                $this->yspayOne($v);
+            }
+        }
+    }
+
+    public function yspayOne($v)
+    {
+        $shop = Dever::db('shop/info')->find($v['shop_id']);
+        if ($v['withdraw'] == 1 && $shop && $shop['mid'] && $shop['status'] == 1) {
+            $cash = $v['price'];//之后还要加上礼品卡的钱
+            Dever::load('shop/yspay')->action($shop['mid'], $v['order_num'], 2, $cash);
         }
     }
 

+ 281 - 0
app/shop/src/Yspay.php

@@ -0,0 +1,281 @@
+<?php
+
+namespace Shop\Src;
+
+use Dever;
+use Main\Lib\Core;
+
+class Yspay
+{
+	public function test()
+	{
+		
+		$class = new Chinaums();
+
+		# 查看当前余额
+		$cash = $class->query();
+
+		echo $cash;die;
+		return $cash;
+	}
+
+	public function act()
+	{
+		$order = Dever::order();
+
+		$result = $this->action(false, $order, 1, 1);
+
+		return $result;
+	}
+
+	public function action($mid, $order, $type, $cash)
+	{
+		$class = new Chinaums();
+
+		$notify = Dever::url('yspay.notify?order=' . $order, 'shop');
+
+		$result = $class->act($mid, $order, $type, $cash, $notify);
+
+		return $result;
+	}
+
+	public function notify()
+	{
+		$msg = Dever::input();
+		Dever::log($msg, 'yspay');
+		$order = Dever::input('order');
+
+		$where['order_num'] = $order;
+		$order = Dever::db('shop/sell_order')->find($where);
+
+		$class = new Chinaums();
+
+		if ($order && $order['withdraw'] == 1) {
+			$content = Dever::input('content');
+
+			$content = $class->privateDecrypt($content);
+
+			if ($content && isset($content['responseCode']) && $content['responseCode'] == '000000') {
+				Dever::db('shop/sell_order')->update(array('where_id' => $order['id'], 'withdraw' => 2));
+			} else {
+				Dever::load('shop/lib/cron')->yspayOne($order);
+			}
+		}
+	}
+}
+
+/**
+ * 银联商务代付
+ * Class Chinaums
+ */
+class Chinaums
+{
+	//测试地址
+	protected $test_host = 'https://mobl-test.chinaums.com/';
+
+	//正式地址
+	protected $host = 'https://managefree.chinaums.com/';
+
+    //系统编号(sysId)
+    protected $sys_id = '10003';
+
+    //商户号
+    protected $mch_id = '898460159921026';
+
+    //外部平台私钥
+    protected $private_key = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDAAbXA7tnnMuWV6WO1bKEKGyKZRFcRCGDW+UfGFZdx0MEm6+fKTNGTsalEFwFPK36YtQFXcN0FciGmQp1wGts4IqLaEzk9az5UcxIfR00JxpNsTYSZb82ZMpj52WF0FHtyj7qE+K3k/FcKCcEHQ3Soa9LL/GQpyVO0yhxeV5tiRfnHoJxxCRHp3jM//VnlCd6koTwPNPFKsf8Vf+dtGA3/BZPFoHvFP0+vfLmEi2TIHO1f1CZDg67TiC/Kkusl0XBiUAXhjAz1SleNQzKHtUVPbVluBtG8ydk8kcLpqDDST6WPnHg5NgHt9qXp0vOLO7ABkQz+dGCXKm+tWXHnRjj1AgMBAAECggEAMm7AjMKwHZgy0aOR+w9jZUInXlai/+hRd2XWwmLdepm4gj6ojWyMB908dpQMVf04rWetyIfupgWKbR9GNzH2rtH6MImoGUfYAVqQQgL6azzrcCEUWTESsdCmecntXQ4cNsUl2tNu6ZyWSB6zwvKm664Wmlna/VbSU8RamzUrrS362gxNFdcEyvCstlnNx1aC5VCRFHm6uBO2uFSYR4dh4e0KpEmYsPT41k93Z4KQHFTCwcvuQu+or5WKL44hKYHyXoZbWiZhfvBRXBVDT7TLmObkeQXAr/Uu1SO5AkblYqG0dyYVy1ea2xANjt8Mw+OP4kRu8IFikALwWp4iYdyAaQKBgQD5mrsx6KrRHbtpBZzHBcEL+/tttA8YAskH2NlkEcGDPcwwULdEYRUUEvX5J+9sTwZHLnE6O9YKI0UtbEBLmDGDfoHy9OM0NCHEaxmZJvmizzfGGc4u/+EtrNCZh1nXUvz1cPip6tywpuHuIgcdAczm0kD9vMWcKHWJSZv+gdClpwKBgQDE7StEIc/c4/fYjIzUaMh6NHqGGB/SpqpfyKHdNZG1xhacN3zY44fO4X8U93uV+thhY3a66TjvvfC2kQAidWWwn4DzmOgWCSPPtuYuI5vouqW/HL8rLKf3hV2rGCC6fz9PDgjy1tl6ZxI10YsA0VjWuHQ9OcQjBl/ypoGfTCJ4AwKBgQCvMhwSe+zpuqTAol/YkgFeGA/ygF/XypywFVUBGDVrmQSpJP590GarIGPl7lHvA8i0TbTL2xPxKbB0oXa/mKOoWDN+BMU07yKEa2gcR28RB8FuGs7NzmyPUq1YFdjJekZzQEhJe8BLfdc2/ktf4NOhcBKOBuHtKbjWFASaLyP0IQKBgHjRSYozdGQBOT4SfRSUdOsE52b9xghnWIALh8M/6nWrYpPVNzOZ5Oh4UI98hsYtcDPP4jgqflQYJGbd70c0337NXUAWv81FLkNx4ybLkgvm92mZKXBDpYmmuSEPXIUPLLhD1Bmo1yTRt8ptFOsbhXW3FRm7JyqV7qfgoAYrn7ohAoGAT2YHHABe8UHfo8ZnLKjjC3FfUcrGd87LTB8EbADVb+Vuak7/8/FTGRDGxygeH3/haB86Dv1nRQJ2Jp1fS9HrWfX/cart1H6Ef/FKT6Td3aCZAwM6kTLWkDepX+2qWW3pnKytrnp1rHFu9XIR+iFlG2hFOg+ppzUKfX3L3A57xDU=';
+
+    //外部平台PKCS1私钥(银联商务提供的PKCS8格式需转为PKCS1格式)
+    protected $private_key_pkcs1 = 'MIIEowIBAAKCAQEAwAG1wO7Z5zLlleljtWyhChsimURXEQhg1vlHxhWXcdDBJuvnykzRk7GpRBcBTyt+mLUBV3DdBXIhpkKdcBrbOCKi2hM5PWs+VHMSH0dNCcaTbE2EmW/NmTKY+dlhdBR7co+6hPit5PxXCgnBB0N0qGvSy/xkKclTtMocXlebYkX5x6CccQkR6d4zP/1Z5QnepKE8DzTxSrH/FX/nbRgN/wWTxaB7xT9Pr3y5hItkyBztX9QmQ4Ou04gvypLrJdFwYlAF4YwM9UpXjUMyh7VFT21ZbgbRvMnZPJHC6agw0k+lj5x4OTYB7fal6dLzizuwAZEM/nRglypvrVlx50Y49QIDAQABAoIBADJuwIzCsB2YMtGjkfsPY2VCJ15Wov/oUXdl1sJi3XqZuII+qI1sjAfdPHaUDFX9OK1nrciH7qYFim0fRjcx9q7R+jCJqBlH2AFakEIC+ms863AhFFkxErHQpnnJ7V0OHDbFJdrTbumclkges8LypuuuFppZ2v1W0lPEWps1K60t+toMTRXXBMrwrLZZzcdWguVQkRR5urgTtrhUmEeHYeHtCqRJmLD0+NZPd2eCkBxUwsHL7kLvqK+Vii+OISmB8l6GW1omYX7wUVwVQ0+0y5jm5HkFwK/1LtUjuQJG5WKhtHcmFctXmtsQDY7fDMPjj+JEbvCBYpAC8FqeImHcgGkCgYEA+Zq7Meiq0R27aQWcxwXBC/v7bbQPGALJB9jZZBHBgz3MMFC3RGEVFBL1+SfvbE8GRy5xOjvWCiNFLWxAS5gxg36B8vTjNDQhxGsZmSb5os83xhnOLv/hLazQmYdZ11L89XD4qercsKbh7iIHHQHM5tJA/bzFnCh1iUmb/oHQpacCgYEAxO0rRCHP3OP32IyM1GjIejR6hhgf0qaqX8ih3TWRtcYWnDd82OOHzuF/FPd7lfrYYWN2uuk4773wtpEAInVlsJ+A85joFgkjz7bmLiOb6Lqlvxy/Kyyn94Vdqxggun8/Tw4I8tbZemcSNdGLANFY1rh0PTnEIwZf8qaBn0wieAMCgYEArzIcEnvs6bqkwKJf2JIBXhgP8oBf18qcsBVVARg1a5kEqST+fdBmqyBj5e5R7wPItE20y9sT8SmwdKF2v5ijqFgzfgTFNO8ihGtoHEdvEQfBbhrOzc5sj1KtWBXYyXpGc0BISXvAS33XNv5LX+DToXASjgbh7Sm41hQEmi8j9CECgYB40UmKM3RkATk+En0UlHTrBOdm/cYIZ1iAC4fDP+p1q2KT1TczmeToeFCPfIbGLXAzz+I4Kn5UGCRm3e9HNN9+zV1AFr/NRS5DceMmy5IL5vdpmSlwQ6WJprkhD1yFDyy4Q9QZqNck0bfKbRTrG4V1txUZuycqle6n4KAGK5+6IQKBgE9mBxwAXvFB36PGZyyo4wtxX1HKxnfOy0wfBGwA1W/lbmpO//PxUxkQxscoHh9/4WgfOg79Z0UCdiadX0vR61n1/3Gq7dR+hH/xSk+k3d2gmQMDOpEy1pA3qV/tqllt6Zysra56daxxbvVyEfohZRtoRToPqac1Cn19y9wOe8Q1';
+
+    //银商系统公钥
+    protected $public_key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu13Ykr8Q4ACqnYMfLL5kgV2JsUC7TQEeWR70Zpulqq6JeujD6dCupnYnGhnMmePasgBZT0rIKGvoUEe5tMS1sfYo6dMqaAwcVfe4XOQaPSQs10XDSMB689+ImZmhECEBJkbKs7K+BBJXBOZGkgHBZsd4pn3vlF4E2yPTrfrcn9OEXZAKrUb/jZm6suzHoXSljqtHWwT7OwQoIX+Q/27gYA6PuGpFFmr4Xtc4a/AqIHeCC4TinbgboD8HqfL0ZoC4NG6Xm2KJ9wK66MbS7sYRiK+7pctZkZLxIJ47Ro5Psuxs4owTdtY7b1aHun9GoUT6Wm4mRO0asvBv0XKn05qn9wIDAQAB';
+
+    private function host()
+    {
+    	return $this->test_host;
+    }
+
+    # 查询余额
+    public function query()
+    {
+    	$url = $this->host() . 'uisouterfront/qrywithdrawbalance/process';
+
+
+    	//整理内容信息
+        $content = [
+            'sysId' => $this->sys_id,
+            'mchntNo' => $this->mch_id,
+            'timestamp' => date('YmdHis'),
+        ];
+        //设置签名并加密
+        $body['content'] = $this->createSignature($content);
+
+        $result = Dever::curl($url, $body, 'post');
+
+        $decryptData = $this->privateDecrypt($result);
+
+        if (isset($decryptData['tzWithdrawAmtPublic'])) {
+        	return $decryptData['tzWithdrawAmtPublic'];
+        } elseif (isset($decryptData['t0WithdrawAmtPublic'])) {
+        	return $decryptData['t0WithdrawAmtPublic'];
+        }
+
+        return 0;
+    }
+
+    # 提现
+    public function act($mid, $order, $cash = 1, $type = 1, $notify = '')
+    {
+    	$url = $this->host() . 'uisouterfront/withdrawback/process';
+
+    	$mid = $mid ? $mid : $this->mch_id;
+    	$type = (string) $type;
+		$cash = (string) $cash;
+
+    	//整理内容信息
+        $content = [
+            'sysId' => $this->sys_id,
+            'mchntNo' => $mid,
+            'timestamp' => date('YmdHis'),
+            'sysOrderId' => $order,
+            'responseUrl' => $notify,
+            'withdrawType' => $type,
+            'withdrawAmt' => $cash,
+        ];
+        //设置签名并加密
+        $body['content'] = $this->createSignature($content);
+
+        $result = Dever::curl($url, $body, 'post');
+        $decryptData = $this->privateDecrypt($result);
+
+        if (isset($decryptData['responseCode']) && ($decryptData['responseCode'] == '000000' || $decryptData['responseCode'] == '000001')) {
+        	return 'ok';
+        } else {
+        	return $decryptData['responseDesc'];
+        }
+    }
+
+    /**
+     * 私钥解密
+     * @Author Abnermouke <abnermouke@gmail.com>
+     * @Originate in Abnermouke's MBP
+     * @Time 2021-08-26 16:36:58
+     * @param $encryptData
+     * @return string
+     */
+    public function privateDecrypt($encryptData)
+    {
+        $content = pack('H*', $encryptData);
+        $result = '';
+        foreach (str_split($content, 256) as $block) {
+            openssl_private_decrypt($block, $dataDecrypt, $this->formatRsaKey($this->private_key_pkcs1), OPENSSL_PKCS1_PADDING);
+            $result .= $dataDecrypt;
+        }
+        $result = Dever::json_decode($result);
+        return $result;
+    }
+
+    /**
+     * 创建签名
+     * @Author Abnermouke <abnermouke@gmail.com>
+     * @Originate in Abnermouke's MBP
+     * @Time 2021-08-26 16:34:49
+     * @param $body
+     * @return false|string
+     */
+    private function createSignature($body)
+    {
+        //重新排序信息
+        ksort($body);
+        //整理加密字符串
+        $signature_string = '';
+        //循环数据
+        foreach ($body as $key => $value) {
+            //整合字符串
+            $signature_string .= $key.'='.$value.'&';
+        }
+        //整理加密字符串
+        $signature_string = rtrim($signature_string, '&');
+        //获取加密数组
+        $array_json = $this->rsaEncrypt($signature_string);
+        //设置签名
+        $body['sign'] = bin2hex($array_json);
+
+        //print_r($body);
+        //json序列化
+        $json_data = json_encode($body);
+        //加密RSA
+        $json_rsa = $this->publicRsa($json_data);
+        //返回结果
+        return $json_rsa;
+    }
+
+    /**
+     * 私钥加密
+     * @Author Abnermouke <abnermouke@gmail.com>
+     * @Originate in Abnermouke's MBP
+     * @Time 2021-08-26 16:35:08
+     * @param string $str
+     * @return false
+     */
+    private function rsaEncrypt($str=''){
+        $charSet = mb_detect_encoding($str, ["UTF-8", "GB2312", "GBK"]);
+        $str = mb_convert_encoding($str, "UTF-8", $charSet);
+        $pri_key = $this->private_key;
+        $pri_key = $this->formatRsaKey($pri_key, 'RSA PRIVATE');
+        $pi_key = openssl_pkey_get_private($pri_key);
+        if(!$pi_key) return false;
+        $algo = "SHA256";
+        openssl_sign($str, $binary_signature, $pi_key, $algo);
+        return $binary_signature;
+    }
+
+    /**
+     * 公钥加密
+     * @Author Abnermouke <abnermouke@gmail.com>
+     * @Originate in Abnermouke's MBP
+     * @Time 2021-08-26 16:35:14
+     * @param string $str
+     * @return false|string
+     */
+    private function publicRsa($str='')
+    {
+        $charSet = mb_detect_encoding($str, ["UTF-8", "GB2312", "GBK"]);
+        $str = mb_convert_encoding($str, "UTF-8", $charSet);
+        $pub_key = $this->public_key;
+        $pub_key = $this->formatRsaKey($pub_key, 'PUBLIC');
+        $pu_key = openssl_pkey_get_public($pub_key);
+        if(!$pu_key)  return false;
+        $result = '';
+        foreach (str_split($str,245) as $chunk) {
+            if(openssl_public_encrypt($chunk,$encryptData, $pub_key)){
+                $result .= $encryptData;
+            }
+        }
+        $result = bin2hex($result);
+        openssl_free_key($pu_key);
+        return $result;
+    }
+
+    /**
+     * 格式化密钥
+     * @Author Abnermouke <abnermouke@gmail.com>
+     * @Originate in Abnermouke's MBP
+     * @Time 2021-08-26 16:36:36
+     * @param $key
+     * @param string $alias
+     * @param int $length
+     * @return string
+     */
+    private function formatRsaKey($key, $alias = 'RSA PRIVATE', $length = 64)
+    {
+        //拆分格式
+        $key = chunk_split($key, (int)$length, "\n");
+        //生成pem
+        $pem = "-----BEGIN $alias KEY-----\n".$key."-----END $alias KEY-----";
+        //返回pem
+        return $pem;
+    }
+
+}