Browse Source

xyz wangxin

xiaoyu 1 year ago
parent
commit
3a267340a7

+ 2 - 2
data/config/win/base.ini.php

@@ -10,13 +10,13 @@ define('BONUS_EXPIRY_DATE',true);
 define('USE_BONUS_RATE',false);
 define('SERVER_TYPE','panda');
 define('CROSS_DOAMIN',true);
-define('COOKIE_DOMAIN','192.168.31.168');
+define('COOKIE_DOMAIN','192.168.3.103');
 define('COMPANY_NAME', 'XYZ_COMPANY');
 define('NET_IP','123.117.109.96');
 define('ZERO_GOODS_ID', 6666);
 define('ADMIN_NAME', 'YELIN');
 
-$SRV_HOST = 'http://192.168.31.168';
+$SRV_HOST = 'http://192.168.3.103';
 $REMOTE_IMG_HOST = $SRV_HOST;
 
 $config = [];

+ 1 - 1
docker/compose/xiaoyu/conf/nginx/nginx.conf

@@ -28,7 +28,7 @@ http
     {
     	listen       80;
         set  $folder_name /var/www/html;
-        server_name 192.168.31.168 www.xyxy.com;
+        server_name 192.168.3.103 www.xyxy.com;
         root $folder_name;
         index index.html index.php;
     	client_max_body_size 100m;

+ 8 - 0
helper/refill/api/xyz/wangxin/API信息.txt

@@ -0,0 +1,8 @@
+账号:bjgyfl
+密码:wangxin
+Pid:20230811115729
+后台地址:http://tel.wxdigital.cn:8384/tariffe/admin
+网信公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD5KS7iQkyAX0c6DU/6cd6BtiZ5Tb1UvVJJdmRC7zhInMpjMqDSCMg/IsKgQXpwrG7Md6s2gN3PQICuJaj3P/nFLakWMSQzMnnFixAu721IB2WN1s0CBvLVwJfrzX2HZhxDyaxI5DcEFZdF/N38J+xLm/X2Mpd2vfNk2OJHhosSwIDAQAB
+
+
+

BIN
helper/refill/api/xyz/wangxin/API对接文档.docx


+ 72 - 0
helper/refill/api/xyz/wangxin/RefillCallBack.php

@@ -0,0 +1,72 @@
+<?php
+namespace refill\wangxin;
+
+require_once(BASE_HELPER_RAPI_PATH . '/wangxin/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($sign === 1) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $sign = $params['sign'];
+
+        unset($params['ext_content']);
+        unset($params['sign']);
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content = rtrim($content,'&');
+        return openssl_verify($content, base64_decode($sign), config::PROVIDER_PUBLIC_KEY);
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = $params['status'];
+        $order_sn = $params['kh_order_id'];
+        $order_info = Model('vr_order')->getOrderInfoForNotify(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false, false, ''];
+        }
+
+        $official_sn = '';
+        $order_id = $order_info['order_id'];
+        if ($status === '3') {
+            $official_sn = strtolower($params['ext_content']) == 'null' ? '' : $params['ext_content'];
+            $data['official_sn'] = $official_sn;
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true, $official_sn];
+        }
+        elseif ($status === '2') {
+            return [$order_id, false, true, true, $official_sn];
+        }
+        else {
+            return [$order_id, false, false, false, $official_sn];
+        }
+    }
+}

+ 170 - 0
helper/refill/api/xyz/wangxin/RefillPhone.php

@@ -0,0 +1,170 @@
+<?php
+
+namespace refill\wangxin;
+
+require_once(BASE_HELPER_RAPI_PATH . '/wangxin/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function header_params($params)
+    {
+        $timestamp = $this->getMillisecond();
+        $header['app_id'] = config::APP_ID;
+        $header['req_no'] = 'YZ' . $timestamp;
+        $header['timestamp'] = $timestamp;
+        $header['sign_nonce'] = $this->createNoncestr();
+        $header['sign'] = $this->sign($params, $header);
+
+        return ['header' => $header, 'body' => $params];
+    }
+
+    private function req_params(int $phone, int $amount, $card_type, string $order_sn)
+    {
+        $params['product_id'] = config::operator[$card_type] . $amount;
+        $params['phone'] = $phone;
+        $params['type'] = 1;
+        $params['kh_order_id'] = $order_sn;
+        $params['ext_content'] = '';
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params, &$net_errno = 0)
+    {
+        $params = $this->req_params($card_no, $amount, $card_type, $params['order_sn']);
+        $params = $this->header_params($params);
+        $params = json_encode($params);
+        $resp = http_post_data(config::ORDER_URL, $params, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '系统错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['body']['code'] === '200') {
+                return [true, $resp['body']['order_id'], false];
+            } elseif ($resp['body']['code'] === '9999') {
+                $net_errno = "HTTP-9999";
+                return [false, $resp['body']['msg'], true];
+            } else {
+                return [false, $resp['body']['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['kh_order_id'] = $refill_info['order_sn'];
+        $params = $this->header_params($params);
+
+        $params = json_encode($params);
+        $resp = http_post_data(config::QUERY_URL, $params , config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误', ''];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            $resp = $resp[0];
+            if (empty($resp)) {
+                return [false, '网络错误', ''];
+            }
+            elseif ($resp['body']['code'] === '200')
+            {
+                $official_sn = '';
+                $status = $resp['body']['status'];
+                if ($status === '3') {
+                    $official_sn = $resp['body']['ext_content'];
+                    $updata['official_sn'] = $official_sn;
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === '2') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === '1') {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $status, $official_sn];
+                }
+                return [true, $order_state, $official_sn];
+            }
+            else {
+                return [false, $resp['body']['msg'], ''];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['type'] = 1;
+        $params = $this->header_params($params);
+
+        $params = json_encode($params);
+        $resp = http_post_data(config::BALANCE_URL, $params , config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误'];
+            } elseif ($resp['body']['code'] === '200') {
+                return [true, $resp['body']['balance']];
+            } else {
+                return [false, $resp['body']['msg']];
+            }
+        }
+    }
+
+    private function sign($params, $header)
+    {
+        $params = array_merge($params, $header);
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content = rtrim($content,'&');
+        $res = openssl_pkey_get_private(config::PRIVATE_KEY);
+        openssl_sign($content, $sign, $res, OPENSSL_ALGO_SHA1 );
+        return base64_encode($sign);
+    }
+
+    /**
+     * 获取毫秒级别的时间戳
+     */
+    private function getMillisecond()
+    {
+        $cur = microtime (true);
+        $cur = intval($cur * 1000);
+        return $cur;
+    }
+
+    private function createNoncestr($length = 32)
+    {
+        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
+        $str ="";
+        for ( $i = 0; $i < $length; $i++ )  {
+            $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
+        }
+        return $str;
+    }
+}

+ 64 - 0
helper/refill/api/xyz/wangxin/config.php

@@ -0,0 +1,64 @@
+<?php
+namespace refill\wangxin;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://tel.wxdigital.cn:8181/tariffe/wx/charge/wxChargeOrderProcess.do';
+    const QUERY_URL = 'http://tel.wxdigital.cn:8181/tariffe/wx/order/wxOrderFind.do';
+    const BALANCE_URL = 'http://tel.wxdigital.cn:8181/tariffe/wx/balance/wxBalance.do';
+
+    const APP_ID = '20230811115729';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_wangxin.php";
+
+    const ExtHeaders = ['Content-Type: application/json'];
+    const operator = [
+        mtopcard\ChinaMobileCard  => 'CM',
+        mtopcard\ChinaUnicomCard  => 'CU',
+        mtopcard\ChinaTelecomCard => 'CT'
+    ];
+
+    //椰子公钥
+    const PUBLIC_KEY = <<<heredoc
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuRBO3uRe9ilTQTSpy++pk8TYA
+cwffePH06x2wmPHfGiLWpn7+FVuJNEKSWkx/VN+zK4HV2r0zrMYZakp6jcCa1wVP
+LBdnakE5vyMyKITQlZOV19X1Inns9l6E4/dXTjH3f/bQIyVIkwYP1Zcr1PhRtRLP
+L9mEDr15GJt9ZSlYGQIDAQAB
+-----END PUBLIC KEY-----
+
+
+heredoc;
+
+    //椰子私钥
+    const PRIVATE_KEY = <<<heredoc
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAK5EE7e5F72KVNBN
+KnL76mTxNgBzB9948fTrHbCY8d8aItamfv4VW4k0QpJaTH9U37MrgdXavTOsxhlq
+SnqNwJrXBU8sF2dqQTm/IzIohNCVk5XX1fUieez2XoTj91dOMfd/9tAjJUiTBg/V
+lyvU+FG1Es8v2YQOvXkYm31lKVgZAgMBAAECgYBuPczHdgUpt7/twlMvSGRAlUNX
+R23cllNiX/Z5SFgCjjMp3UwLCpHMm03d7dfk2VlmrAhHtEfqz8rGOzKAkvobLjcI
+enluLVy3qWi2Y85oHF2/PU+BFNnlYEUcXg6A6YRiuxBEnlDAWRSpg+BY2WEPgeoW
+4qSSdeyZP2JReSz/MQJBAOJw40mRlZ44QeZ/aRJ4UKjf/jQ4OgcTSAzumIqoN/6b
+pvTAa1M53qXtN2IykplWFjBrlld0oNWZjOA1FAgeUYUCQQDFA5/1s7/o88BgoXcL
+fCvISJkoY0Jv+IcsUcFqJG4baJIDHUCIIrLYWYjye6gouI+peD7fnzbAo6QGYxWR
+lmaFAkEAz8QMh6AQy8+Kh9c3rT6/o3OCZp+AfqVuYo85X1/hoLdohQFYeFCMvWne
+ezcz04VtbpgIpc3ZFKOC4uVQr/JBkQJAUw6VKDNwa5gfeV1434mot5YLo6A9CRGA
+gymwXbwgA0QRkmiJpRrjxRvyBTAmk4xDXJHKB+KKZapXYy3wkOEUNQJBAKYx6PqQ
+tVDAtCTm5RbBjIn1QDeQjGjpLpwBD26GlBf3ix+jBjkMqcCIMKs1zS5T44S3bkCx
+gNzxYS7SygRX8GQ=
+-----END PRIVATE KEY-----
+
+
+heredoc;
+
+    //网信公钥
+    const PROVIDER_PUBLIC_KEY = <<<heredoc
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD5KS7iQkyAX0c6DU/6cd6BtiZ
+5Tb1UvVJJdmRC7zhInMpjMqDSCMg/IsKgQXpwrG7Md6s2gN3PQICuJaj3P/nFLak
+WMSQzMnnFixAu721IB2WN1s0CBvLVwJfrzX2HZhxDyaxI5DcEFZdF/N38J+xLm/X
+2Mpd2vfNk2OJHhosSwIDAQAB
+-----END PUBLIC KEY-----
+heredoc;
+}

+ 11 - 0
mobile/callback/refill_wangxin.php

@@ -0,0 +1,11 @@
+<?php
+
+$content = $_SERVER['post_content'];
+$input = json_decode($content,true) ?? [];
+
+$body = $input['body'];
+$header = $input['header'];
+$params = array_merge($body, $header);
+refill\util::push_notify('wangxin', $params);
+
+echo 'success';

File diff suppressed because it is too large
+ 18 - 0
test/TestRefill.php