|
@@ -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/';
|
|
|
+
|
|
|
+
|
|
|
+ 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=';
|
|
|
+
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ $json_data = json_encode($body);
|
|
|
+
|
|
|
+ $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 = "-----BEGIN $alias KEY-----\n".$key."-----END $alias KEY-----";
|
|
|
+
|
|
|
+ return $pem;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|