diff --git a/extend/payment/AlipayFace.php b/extend/payment/AlipayFace.php new file mode 100644 index 000000000..20c2894bf --- /dev/null +++ b/extend/payment/AlipayFace.php @@ -0,0 +1,530 @@ +config = $params; + } + + /** + * 配置信息 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-09-19 + * @desc description + */ + public function Config() + { + // 基础信息 + $base = [ + 'name' => '支付宝', // 插件名称 + 'version' => '1.0.0', // 插件版本 + 'apply_version' => '不限', // 适用系统版本描述 + 'apply_terminal'=> ['pc', 'h5'], // 适用终端 默认全部 ['pc', 'h5', 'app', 'alipay', 'weixin', 'baidu'] + 'desc' => '支付宝当面付、适用web端,用户主动扫码支付方式,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金。 立即申请', // 插件描述(支持html) + 'author' => 'Devil', // 开发者 + 'author_url' => 'http://shopxo.net/', // 开发者主页 + ]; + + // 配置信息 + $element = [ + [ + 'element' => 'input', + 'type' => 'text', + 'default' => '', + 'name' => 'appid', + 'placeholder' => 'appid', + 'title' => 'appid', + 'is_required' => 0, + 'message' => '请填写应用appid', + ], + [ + 'element' => 'textarea', + 'name' => 'rsa_public', + 'placeholder' => '应用公钥', + 'title' => '应用公钥', + 'is_required' => 0, + 'rows' => 6, + 'message' => '请填写应用公钥', + ], + [ + 'element' => 'textarea', + 'name' => 'rsa_private', + 'placeholder' => '应用私钥', + 'title' => '应用私钥', + 'is_required' => 0, + 'rows' => 6, + 'message' => '请填写应用私钥', + ], + [ + 'element' => 'textarea', + 'name' => 'out_rsa_public', + 'placeholder' => '支付宝公钥', + 'title' => '支付宝公钥', + 'is_required' => 0, + 'rows' => 6, + 'message' => '请填写支付宝公钥', + ], + ]; + + return [ + 'base' => $base, + 'element' => $element, + ]; + } + + /** + * 支付入口 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-09-19 + * @desc description + * @param [array] $params [输入参数] + */ + public function Pay($params = []) + { + // openssl + if(!function_exists('openssl_sign')) + { + return DataReturn('当前环境不支持openssl', -1); + } + + // 参数 + if(empty($params)) + { + return DataReturn('参数不能为空', -1); + } + + // 配置信息 + if(empty($this->config) || empty($this->config['appid']) || empty($this->config['rsa_public']) || empty($this->config['rsa_private']) || empty($this->config['out_rsa_public'])) + { + return DataReturn('支付缺少配置', -1); + } + + // 支付参数 + $parameter = array( + 'app_id' => $this->config['appid'], + 'method' => 'alipay.trade.precreate', + 'format' => 'JSON', + 'charset' => 'utf-8', + 'sign_type' => 'RSA2', + 'timestamp' => date('Y-m-d H:i:s'), + 'version' => '1.0', + 'notify_url' => $params['notify_url'], + ); + $biz_content = array( + 'subject' => $params['name'], + 'out_trade_no' => $params['order_no'], + 'total_amount' => (string) $params['total_price'], + 'qr_code_timeout_express' => $this->OrderAutoCloseTime(), + ); + $parameter['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE); + + // 生成签名参数+签名 + $sp = $this->GetParamSign($parameter); + $parameter['sign'] = $this->MyRsaSign($sp['value']); + + + // 执行请求 + $result = $this->HttpRequest('https://openapi.alipay.com/gateway.do', $parameter); + $key = str_replace('.', '_', $parameter['method']).'_response'; + + // 验证签名 + if(!$this->SyncRsaVerify($result, $key)) + { + return DataReturn('签名验证错误', -1); + } + + // 状态 + if(isset($result[$key]['code']) && $result[$key]['code'] == 10000 && !empty($result[$key]['qr_code'])) + { + if(empty($params['ajax_url'])) + { + return DataReturn('支付状态校验地址不能为空', -50); + } + $pay_params = [ + 'url' => urlencode(base64_encode($result[$key]['qr_code'])), + 'order_no' => $params['order_no'], + 'name' => urlencode('支付宝支付'), + 'msg' => urlencode('打开支付宝APP扫一扫进行支付'), + 'ajax_url' => urlencode(base64_encode($params['ajax_url'])), + ]; + $url = MyUrl('index/pay/qrcode', $pay_params); + return DataReturn('success', 0, $url); + } + + // 直接返回支付信息 + return DataReturn($result[$key]['sub_msg'].'['.$result[$key]['sub_code'].']', -1000); + } + + /** + * 订单自动关闭的时间 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-03-24 + * @desc description + */ + public function OrderAutoCloseTime() + { + return intval(MyC('common_order_close_limit_time', 30, true)).'m'; + } + + /** + * 支付回调处理 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-09-19 + * @desc description + * @param [array] $params [输入参数] + */ + public function Respond($params = []) + { + $data = empty($_POST) ? $_GET : array_merge($_GET, $_POST); + ksort($data); + + // 参数字符串 + $sign = ''; + foreach($data AS $key=>$val) + { + if ($key != 'sign' && $key != 'sign_type' && $key != 'code') + { + $sign .= "$key=$val&"; + } + } + $sign = substr($sign, 0, -1); + + // 签名 + if(!$this->OutRsaVerify($sign, $data['sign'])) + { + return DataReturn('签名校验失败', -1); + } + + // 支付状态 + $status = isset($data['trade_status']) ? $data['trade_status'] : $data['result']; + switch($status) + { + case 'TRADE_SUCCESS': + case 'TRADE_FINISHED': + case 'success': + return DataReturn('支付成功', 0, $this->ReturnData($data)); + break; + } + return DataReturn('处理异常错误', -100); + } + + /** + * [ReturnData 返回数据统一格式] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2018-10-06T16:54:24+0800 + * @param [array] $data [返回数据] + */ + private function ReturnData($data) + { + // 兼容web版本支付参数 + $buyer_user = isset($data['buyer_logon_id']) ? $data['buyer_logon_id'] : (isset($data['buyer_email']) ? $data['buyer_email'] : ''); + $pay_price = isset($data['total_amount']) ? $data['total_amount'] : (isset($data['total_fee']) ? $data['total_fee'] : ''); + + // 返回数据固定基础参数 + $data['trade_no'] = $data['trade_no']; // 支付平台 - 订单号 + $data['buyer_user'] = $buyer_user; // 支付平台 - 用户 + $data['out_trade_no'] = $data['out_trade_no']; // 本系统发起支付的 - 订单号 + $data['subject'] = $data['subject']; // 本系统发起支付的 - 商品名称 + $data['pay_price'] = $pay_price; // 本系统发起支付的 - 总价 + + return $data; + } + + /** + * 退款处理 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2019-05-28 + * @desc description + * @param [array] $params [输入参数] + */ + public function Refund($params = []) + { + // 参数 + $p = [ + [ + 'checked_type' => 'empty', + 'key_name' => 'order_no', + 'error_msg' => '订单号不能为空', + ], + [ + 'checked_type' => 'empty', + 'key_name' => 'trade_no', + 'error_msg' => '交易平台订单号不能为空', + ], + [ + 'checked_type' => 'empty', + 'key_name' => 'refund_price', + 'error_msg' => '退款金额不能为空', + ], + ]; + $ret = ParamsChecked($params, $p); + if($ret !== true) + { + return DataReturn($ret, -1); + } + + // 退款原因 + $refund_reason = empty($params['refund_reason']) ? $params['order_no'].'订单退款'.$params['refund_price'].'元' : $params['refund_reason']; + + // 退款参数 + $parameter = array( + 'app_id' => $this->config['appid'], + 'method' => 'alipay.trade.refund', + 'format' => 'JSON', + 'charset' => 'utf-8', + 'sign_type' => 'RSA2', + 'timestamp' => date('Y-m-d H:i:s'), + 'version' => '1.0', + ); + $biz_content = array( + 'out_trade_no' => $params['order_no'], + 'trade_no' => $params['trade_no'], + 'refund_amount' => (string) $params['refund_price'], + 'refund_reason' => $refund_reason, + ); + $parameter['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE); + + // 生成签名参数+签名 + $params = $this->GetParamSign($parameter); + $parameter['sign'] = $this->MyRsaSign($params['value']); + + // 执行请求 + $result = $this->HttpRequest('https://openapi.alipay.com/gateway.do', $parameter); + $key = str_replace('.', '_', $parameter['method']).'_response'; + + // 验证签名 + if(!$this->SyncRsaVerify($result, $key)) + { + return DataReturn('签名验证错误', -1); + } + + // 状态 + if(isset($result[$key]['code']) && $result[$key]['code'] == 10000) + { + // 统一返回格式 + $data = [ + 'out_trade_no' => isset($result[$key]['out_trade_no']) ? $result[$key]['out_trade_no'] : '', + 'trade_no' => isset($result[$key]['trade_no']) ? $result[$key]['trade_no'] : '', + 'buyer_user' => isset($result[$key]['buyer_user_id']) ? $result[$key]['buyer_user_id'] : '', + 'refund_price' => isset($result[$key]['refund_fee']) ? $result[$key]['refund_fee'] : 0.00, + 'return_params' => $result[$key], + ]; + return DataReturn('退款成功', 0, $data); + } + + // 直接返回支付信息 + return DataReturn($result[$key]['sub_msg'].'['.$result[$key]['sub_code'].']', -1000); + } + + /** + * [GetParamSign 生成参数和签名] + * @param [array] $data [待生成的参数] + * @return [array] [生成好的参数和签名] + */ + private function GetParamSign($data) + { + $param = ''; + $sign = ''; + ksort($data); + + foreach($data AS $key => $val) + { + $param .= "$key=" .urlencode($val). "&"; + $sign .= "$key=$val&"; + } + + $result = array( + 'param' => substr($param, 0, -1), + 'value' => substr($sign, 0, -1), + ); + return $result; + } + + /** + * [HttpRequest 网络请求] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2017-09-25T09:10:46+0800 + * @param [string] $url [请求url] + * @param [array] $data [发送数据] + * @return [mixed] [请求返回数据] + */ + private function HttpRequest($url, $data) + { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_FAILONERROR, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + + $body_string = ''; + if(is_array($data) && 0 < count($data)) + { + foreach($data as $k => $v) + { + $body_string .= $k.'='.urlencode($v).'&'; + } + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $body_string); + } + $headers = array('content-type: application/x-www-form-urlencoded;charset=UTF-8'); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $reponse = curl_exec($ch); + if(curl_errno($ch)) + { + return false; + } else { + $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if(200 !== $httpStatusCode) + { + return false; + } + } + curl_close($ch); + return json_decode($reponse, true); + } + + /** + * [MyRsaSign 签名字符串] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2017-09-24T08:38:28+0800 + * @param [string] $prestr [需要签名的字符串] + * @return [string] [签名结果] + */ + private function MyRsaSign($prestr) + { + if(stripos($this->config['rsa_private'], '-----') === false) + { + $res = "-----BEGIN RSA PRIVATE KEY-----\n"; + $res .= wordwrap($this->config['rsa_private'], 64, "\n", true); + $res .= "\n-----END RSA PRIVATE KEY-----"; + } else { + $res = $this->config['rsa_private']; + } + return openssl_sign($prestr, $sign, $res, OPENSSL_ALGO_SHA256) ? base64_encode($sign) : null; + } + + /** + * [MyRsaDecrypt RSA解密] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2017-09-24T09:12:06+0800 + * @param [string] $content [需要解密的内容,密文] + * @return [string] [解密后内容,明文] + */ + private function MyRsaDecrypt($content) + { + if(stripos($this->config['rsa_public'], '-----') === false) + { + $res = "-----BEGIN PUBLIC KEY-----\n"; + $res .= wordwrap($this->config['rsa_public'], 64, "\n", true); + $res .= "\n-----END PUBLIC KEY-----"; + } else { + $res = $this->config['rsa_public']; + } + $res = openssl_get_privatekey($res); + $content = base64_decode($content); + $result = ''; + for($i=0; $iconfig['out_rsa_public'], '-----') === false) + { + $res = "-----BEGIN PUBLIC KEY-----\n"; + $res .= wordwrap($this->config['out_rsa_public'], 64, "\n", true); + $res .= "\n-----END PUBLIC KEY-----"; + } else { + $res = $this->config['out_rsa_public']; + } + $pkeyid = openssl_pkey_get_public($res); + $sign = base64_decode($sign); + if($pkeyid) + { + $verify = openssl_verify($prestr, $sign, $pkeyid, OPENSSL_ALGO_SHA256); + openssl_free_key($pkeyid); + } + return (isset($verify) && $verify == 1) ? true : false; + } + + /** + * [SyncRsaVerify 同步返回签名验证] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2017-09-25T13:13:39+0800 + * @param [array] $data [返回数据] + * @param [boolean] $key [数据key] + */ + private function SyncRsaVerify($data, $key) + { + $string = json_encode($data[$key], JSON_UNESCAPED_UNICODE); + return $this->OutRsaVerify($string, $data['sign']); + } +} +?> \ No newline at end of file diff --git a/extend/payment/Gmo3d1pay.php b/extend/payment/Gmo3d1pay.php new file mode 100644 index 000000000..0ff7b20e7 --- /dev/null +++ b/extend/payment/Gmo3d1pay.php @@ -0,0 +1,455 @@ +config = $params; + } + + /** + * 配置信息 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-09-19 + * @desc description + */ + public function Config() + { + // 基础信息 + $base = [ + 'name' => 'Gmo3d1', // 插件名称 + 'version' => '1.0.0', // 插件版本 + 'apply_version' => '不限', // 适用系统版本描述 + 'apply_terminal'=> ['pc','h5', 'ios', 'android', 'toutiao'], // 适用终端 默认全部 ['pc', 'h5', 'ios', 'android', 'alipay', 'weixin', 'baidu', 'toutiao'] + 'desc' => '2.0版本,适用PC+H5+APP+头条小程序,即时到帐支付方式,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金。 立即申请', // 插件描述(支持html) + 'author' => 'liuhj', // 开发者 + 'author_url' => '', // 开发者主页 + ]; + + // 配置信息 + $element = [ + [ + 'element' => 'input', + 'type' => 'text', + 'default' => '', + 'name' => 'host_url', + 'placeholder' => 'host url', + 'title' => 'host url', + 'is_required' => 0, + 'message' => '请输入服务URL', + ] + ]; + + return [ + 'base' => $base, + 'element' => $element, + ]; + } + + /** + * 支付入口 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-09-19 + * @desc description + * @param [array] $params [输入参数] + */ + public function Pay($params = []) + { + // 参数 + if(empty($params)) + { + return DataReturn('参数不能为空', -1); + } + + // 配置信息 + if(empty($this->config) || empty($this->config['host_url']) ) + { + return DataReturn('支付缺少配置', -1); + } + + // 支付方式 + $ret = $this->PayWeb($params); + + return $ret; + } + + /** + * [PayWeb PC支付] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2018-09-28T00:23:04+0800 + * @param [array] $params [输入参数] + */ + private function PayWeb($params = []) + { + // 用户信息 + $user = UserService::LoginUserInfo(); + if(empty($user['token'])) + { + $user = UserService::UserTokenUpdate($user['id'], $user); + } + + // 取引登録 + $entryTranUrl = $this->config['host_url'].'EntryTran.json'; + + $entryTranParameter = [ + 'shopID' => 'tshop00001176', + 'shopPass' => 'e6csh5bt', + 'orderID' => $params['order_no'], + 'jobCd' => 'CAPTURE', + 'itemCode' => '0000990', + 'amount' => $params['total_price'].'', + 'tax' => '10', + 'tdFlag' => '1', + 'tdTenantName' => base64_encode(mb_convert_encoding('テストショップ', 'EUCJP', 'UTF-8')), + 'tds2Type' => '1' + ]; + $entryTranResult = $this->HttpRequestJson($entryTranUrl,$entryTranParameter); + + // エラーがある場合 + if( array_key_exists( 'errCode', $entryTranResult ) ){ + // エラー + return false; + } + + // 決済実行 + + $execTranUrl = $this->config['host_url'].'ExecTran.json'; + + $execTranParameter = [ + 'accessID' => $entryTranResult["accessID"], + 'accessPass' => $entryTranResult["accessPass"], + 'orderID' => $params['order_no'], + 'method' => '1', + 'payTimes' => '0', + 'cardNo' => '4123450131003312', + 'expire' => '2604', + 'securityCode' => '000', + 'token' => '', + 'httpAccept' => 'SampleHttpAccept', + 'httpUserAgent' => 'HttpUserAgent', + 'deviceCategory' => '0', + 'clientField1' => $params['total_price'].'', + 'clientField2' => 'SampleClientField2', + 'clientField3' => 'SampleClientField3', + 'clientFieldFlag' => '1', + 'tokenType' => '1' + // 'retUrl' => $params['call_back_url'] + ]; + $execTranResult = $this->HttpRequestJson($execTranUrl,$execTranParameter); + // エラーがある場合 + if( array_key_exists( 'errCode', $execTranResult ) ){ + // エラー + return false; + } + + // ACS呼出必要 + if($execTranResult["acs"]){ + $this->PayHtml($execTranResult, $params['call_back_url'].'?token='.$user['token']); + } + } + + /** + * 订单自动关闭的时间 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-03-24 + * @desc description + */ + public function OrderAutoCloseTime() + { + return intval(MyC('common_order_close_limit_time', 30, true)).'m'; + } + + /** + * 支付回调处理 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-09-19 + * @desc description + * @param [array] $params [输入参数] + */ + public function Respond($params = []) + { + echo 100; + echo '
';
+        print_r($params);die;
+        // $data = empty($_POST) ? $_GET :  array_merge($_GET, $_POST);
+        // ksort($data);
+
+        // 参数字符串
+        // $prestr = '';
+        // foreach($data AS $key=>$val)
+        // {
+        //     if ($key != 'sign' && $key != 'sign_type' && $key != 'code')
+        //     {
+        //         $prestr .= "$key=$val&";
+        //     }
+        // }
+        // $prestr = substr($prestr, 0, -1);
+
+        // // 签名
+        // if(!$this->OutRsaVerify($prestr, $data['sign']))
+        // {
+        //     return DataReturn('签名校验失败', -1);
+        // }
+
+        // 認証後決済実行
+
+        $secureTranUrl = $this->config['host_url'].'SecureTran.json';
+
+        $secureTranParameter = [
+            'paRes'        => $params["PaRes"],
+            'md'           => $params["MD"]
+        ];
+        $data = $this->HttpRequestJson($secureTranUrl,$secureTranParameter);
+
+        // 支付状态
+        if(!empty($data['tranID']))
+        {
+            $status = false;
+            if(isset($data['approve']))
+            {
+                    $status = true;
+            }
+
+            if($status)
+            {
+                return DataReturn('支付成功', 0, $this->ReturnData($data));
+            }
+        }
+        return DataReturn('处理异常错误', -100);
+    }
+
+    /**
+     * [ReturnData 返回数据统一格式]
+     * @author   Devil
+     * @blog     http://gong.gg/
+     * @version  1.0.0
+     * @datetime 2018-10-06T16:54:24+0800
+     * @param    [array]                   $data [返回数据]
+     */
+    private function ReturnData($data)
+    {
+        // 返回数据固定基础参数
+        $data['trade_no']       = $data['tranID'];        // 支付平台 - 订单号
+        $data['buyer_user']     = '';//$data['seller_id'];       // 支付平台 - 用户
+        $data['out_trade_no']   = $data['orderID'];//$data['out_trade_no'];    // 本系统发起支付的 - 订单号
+        $data['subject']        = isset($data['subject']) ? $data['subject'] : ''; // 本系统发起支付的 - 商品名称
+        $data['pay_price']      = $data['clientField1'];//$data['total_amount'];    // 本系统发起支付的 - 总价
+
+        return $data;
+    }
+
+    /**
+     * 退款处理
+     * @author  Devil
+     * @blog    http://gong.gg/
+     * @version 1.0.0
+     * @date    2019-05-28
+     * @desc    description
+     * @param   [array]           $params [输入参数]
+     */
+    public function Refund($params = [])
+    {
+        
+    }
+
+
+    /**
+     * [HttpRequest 网络请求]
+     * @author   Devil
+     * @blog     http://gong.gg/
+     * @version  1.0.0
+     * @datetime 2017-09-25T09:10:46+0800
+     * @param    [string]          $url  [请求url]
+     * @param    [array]           $data [发送数据]
+     * @return   [mixed]                 [请求返回数据]
+     */
+    private function HttpRequest($url, $data)
+    {
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_FAILONERROR, false);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+
+        $body_string = '';
+        if(is_array($data) && 0 < count($data))
+        {
+            foreach($data as $k => $v)
+            {
+                $body_string .= $k.'='.urlencode($v).'&';
+            }
+            curl_setopt($ch, CURLOPT_POST, true);
+            curl_setopt($ch, CURLOPT_POSTFIELDS, $body_string);
+        }
+        $headers = array('content-type: application/x-www-form-urlencoded;charset=windows-31j');
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        $reponse = curl_exec($ch);
+        var_dump($reponse);
+        if(curl_errno($ch))
+        {
+            return false;
+        } else {
+            $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+            if(200 !== $httpStatusCode)
+            {
+                return false;
+            }
+        }
+        curl_close($ch);
+        return json_decode($reponse, true);
+    }
+
+    /**
+     * 网络请求
+     * @author   Devil
+     * @blog     http://gong.gg/
+     * @version  1.0.0
+     * @datetime 2017-09-25T09:10:46+0800
+     * @param    [string]          $url         [请求url]
+     * @param    [array]           $data        [发送数据]
+     * @param    [int]             $second      [超时]
+     * @return   [mixed]                        [请求返回数据]
+     */
+    private function HttpRequestJson($url, $data, $second = 30)
+    {
+        $ch = curl_init();
+        $header = ['Content-Type: application/json;charset=UTF-8'];
+
+        curl_setopt_array($ch, array(
+            CURLOPT_URL                => $url,
+            CURLOPT_HTTPHEADER         => $header,
+            CURLOPT_POST               => true,
+            CURLOPT_SSL_VERIFYPEER     => false,
+            CURLOPT_SSL_VERIFYHOST     => false,
+            CURLOPT_RETURNTRANSFER     => true,
+            CURLOPT_POSTFIELDS         => json_encode($data),
+            CURLOPT_TIMEOUT            => $second,
+        ));
+        $result = curl_exec($ch);
+
+        //返回结果
+        if($result)
+        {
+            curl_close($ch);
+            return json_decode($result, true);
+        } else {
+            $error = curl_errno($ch);
+            curl_close($ch);
+            return "curl出错,错误码:$error";
+        }
+    }
+    /**
+     * 获取签名内容
+     * @author   Devil
+     * @blog    http://gong.gg/
+     * @version 1.0.0
+     * @date    2019-03-15
+     * @desc    description
+     * @param   [array]          $params [需要签名的参数]
+     */
+    public function GetSignContent($params)
+    {
+        ksort($params);
+        $string = "";
+        $i = 0;
+        foreach($params as $k => $v)
+        {
+            if(!empty($v) && "@" != substr($v, 0, 1))
+            {
+                if ($i == 0) {
+                    $string .= "$k" . "=" . "$v";
+                } else {
+                    $string .= "&" . "$k" . "=" . "$v";
+                }
+                $i++;
+            }
+        }
+        unset($k, $v);
+        return $string;
+    }
+
+    /**
+     * 跳转 
+     * @author   Devil
+     * @blog     http://gong.gg/
+     * @version  1.0.0
+     * @datetime 2019-05-25T00:07:52+0800
+     * @param    [array]                   $pay_data     [支付信息]
+     * @param    [string]                  $redirect_url [支付结束后跳转url]
+     */
+    private function PayHtml($pay_data,$redirect_url)
+    {
+        // 支付代码
+        exit('
+            
+            
+            
+            
+            
+ + + + +
+ + + + '); + } +} +?> \ No newline at end of file diff --git a/extend/payment/SliWeixin.php b/extend/payment/SliWeixin.php deleted file mode 100644 index 206cb728c..000000000 --- a/extend/payment/SliWeixin.php +++ /dev/null @@ -1,353 +0,0 @@ -config = $params; - } - - /** - * 配置信息 - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @date 2018-09-19 - * @desc description - */ - public function Config() - { - // 基础信息 - $base = [ - 'name' => '星链-微信', // 插件名称 - 'version' => '1.0.0', // 插件版本 - 'apply_version' => '不限', // 适用系统版本描述 - 'apply_terminal'=> ['pc','h5'], // 适用终端 默认全部 ['pc', 'h5', 'ios', 'android', 'alipay', 'weixin', 'baidu'] - 'desc' => '适用PC+H5,即时到帐支付方式,跨境支付。 立即申请', // 插件描述(支持html) - 'author' => 'Devil', // 开发者 - 'author_url' => 'http://shopxo.net/', // 开发者主页 - ]; - - // 配置信息 - $element = [ - [ - 'element' => 'input', - 'type' => 'text', - 'default' => '', - 'name' => 'accounts', - 'placeholder' => '登录帐号', - 'title' => '登录帐号', - 'is_required' => 0, - 'message' => '请填写登录帐号', - ], - [ - 'element' => 'input', - 'type' => 'text', - 'default' => '', - 'name' => 'secret', - 'placeholder' => '密钥', - 'title' => '密钥', - 'is_required' => 0, - 'message' => '请填写密钥', - ], - [ - 'element' => 'input', - 'type' => 'text', - 'default' => 'CNY', - 'name' => 'currency', - 'placeholder' => '货币', - 'title' => '货币', - 'is_required' => 0, - 'message' => '请填写货币', - ], - ]; - - return [ - 'base' => $base, - 'element' => $element, - ]; - } - - /** - * 支付入口 - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @date 2018-09-19 - * @desc description - * @param [array] $params [输入参数] - */ - public function Pay($params = []) - { - // 参数 - if(empty($params)) - { - return DataReturn('参数不能为空', -1); - } - - // 配置信息 - if(empty($this->config)) - { - return DataReturn('支付缺少配置', -1); - } - - // 处理支付 - $parameter = [ - 'login' => $this->config['accounts'], - 'orderno' => $params['order_no'], - 'paymode' => $this->pay_type, - 'currency' => $this->config['currency'], - 'amount' => (int) (($params['total_price']*1000)/10), - 'product' => $params['name'], - 'ip' => GetClientIP(), - 'notifyurl' => $params['notify_url'], - 'callbackurl' => $params['redirect_url'], - 'rejecturl' => $params['call_back_url'], - ]; - - // 签名 - $parameter['md5check'] = $this->GetParamSign($parameter); - - $url = 'https://www.sli.money/api/main/v1/payment/request'; - $ret = $this->HttpRequest($url, $parameter); - if($ret['code'] == 0) - { - return DataReturn('success', 0, $ret['data']['payurl']); - } - return $ret; - } - - /** - * 签名生成 - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @date 2018-09-19 - * @desc description - * @param [array] $params [输入参数] - * @param [boolean] $is_ksort [是否需要排序] - * @param [string] $key_field [密钥字段key] - */ - private function GetParamSign($params = [], $is_ksort = false, $key_field = 'secret') - { - $string = ''; - if($is_ksort) - { - ksort($params); - } - foreach($params AS $key=>$val) - { - if(!in_array($key, ['sign'])) - { - $string .= $key.'='.$val.'&'; - } - } - - return md5($string.$key_field.'='.$this->config['secret']); - } - - /** - * 支付回调处理 - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @date 2018-09-19 - * @desc description - * @param [array] $params [输入参数] - */ - public function Respond($params = []) - { - if(empty($this->config)) - { - return DataReturn('配置有误', -1); - } - if(empty($params['refno'])) - { - return DataReturn('支付失败', -1); - } - if(empty($params['sign'])) - { - return DataReturn('签名为空', -1); - } - - // 签名验证 - $sign = $this->GetParamSign($params, true, 'key'); - if($sign != $params['sign']) - { - return DataReturn('签名错误', -1); - } - - // 支付状态 - if(isset($params['errcode'])) - { - switch($params['errcode']) - { - // 收款方报故障单 - case 9040 : - $ret = DataReturn('收款平台故障', -10); - break; - - // 交易取消 - case 9099 : - $ret = DataReturn('交易取消', -20); - break; - - // 成功 - case 9000 : - case 9044 : - case 9046 : - $ret = DataReturn('支付成功', 0, $this->ReturnData($params)); - break; - - // 默认 - default : - $ret = DataReturn('支付错误['.$params['errmsg'].']', -100); - } - } else { - $ret = DataReturn('支付异常错误', -1000); - } - return $ret; - } - - /** - * [ReturnData 返回数据统一格式] - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @datetime 2018-10-06T16:54:24+0800 - * @param [array] $data [返回数据] - */ - private function ReturnData($data) - { - // 返回数据固定基础参数 - $data['trade_no'] = isset($data['refno']) ? $data['refno'] : ''; // 支付平台 - 订单号 - $data['buyer_user'] = ''; // 支付平台 - 用户 - $data['out_trade_no'] = $data['orderno']; // 本系统发起支付的 - 订单号 - $data['subject'] = ''; // 本系统发起支付的 - 商品名称 - $data['pay_price'] = $data['amount']/100; // 本系统发起支付的 - 总价 - - return $data; - } - - /** - * 网络请求 - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @datetime 2017-09-25T09:10:46+0800 - * @param [string] $url [请求url] - * @param [array] $data [发送数据] - * @param [int] $second [超时] - * @return [mixed] [请求返回数据] - */ - private function HttpRequest($url, $data, $second = 30) - { - $ch = curl_init(); - $header = ['Content-Type: application/json;charset=utf-8']; - curl_setopt_array($ch, array( - CURLOPT_URL => $url, - CURLOPT_HTTPHEADER => $header, - CURLOPT_POST => true, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_SSL_VERIFYHOST => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_POSTFIELDS => json_encode($data), - CURLOPT_TIMEOUT => $second, - )); - $result = curl_exec($ch); - - //返回结果 - if($result) - { - curl_close($ch); - $res = json_decode($result, true); - if(empty($res) || empty($res['data']) || empty($res['data']['errcode'])) - { - return DataReturn('请求失败['.$result.']', -1); - } - if($res['data']['errcode'] != 200) - { - return DataReturn($this->ErrorCodeToMsg($res['data']['errcode'], $res['data']['errmsg']), -1); - } - return DataReturn('success', 0, $res['data']); - } else { - $error = curl_errno($ch); - curl_close($ch); - return DataReturn('curl出错,错误码['.$error.']', -1); - } - } - - /** - * 错误处理 - * @author Devil - * @blog http://gong.gg/ - * @version 1.0.0 - * @date 2021-06-08 - * @desc description - * @param [string] $code [错误码] - * @param [string] $msg [错误信息] - */ - public function ErrorCodeToMsg($code, $msg) - { - $data = [ - '4001' => '第三方登录信息不能为空', - '4002' => '第三方登录信息不存在', - '4003' => '第三方订单号信息不能为空', - '4004' => '第三方订单号不能重复', - '4005' => '第三方订单支付方式不能为空', - '4006' => '第三方订单支付方式应该为1-5 ', - '4007' => '第三方订单支付金额不能为空', - '4008' => '第三方订单支付金额应该大于等于0 第三方订单币种汇率不能为空', - '4010' => '第三方订单md5check不能为空', - '4011' => '第三方订单callbackurl不能为空', - '4012' => '第三方订单notifyurl不能为空', - '4013' => '第三方订单rejecturl不能为空', - '4014' => '第三方登录帐号已经关闭', - '4015' => '没有该订单号', - '4016' => '第三方订单号不能大於30位文字', - '4020' => '支付金额大于流量,请先买流量', - '4021' => '支付金额大于最大限额,请把支付金额调小', - '4021' => '请把支付金额调小', - '4023' => '不能用这种支付方式,请找客服确认无效IP地址', - '4030' => '你没有当前货币的权限,请找客服确认', - '4040' => 'md5check错误', - '4041' => '不允许HTTPGET方法', - '4133' => '账户余额不足', - ]; - return (array_key_exists($code, $data) ? $data[$code] : $msg).'['.$code.']'; - } -} -?> \ No newline at end of file diff --git a/sourcecode/weixin/default/components/layout/layout.wxss b/sourcecode/weixin/default/components/layout/layout.wxss index d547fb310..ef7cf9e31 100755 --- a/sourcecode/weixin/default/components/layout/layout.wxss +++ b/sourcecode/weixin/default/components/layout/layout.wxss @@ -678,7 +678,7 @@ .module-title-container .module-title-content{position:relative} .module-title-container .title-main{font-size:16px;font-weight:600;color:#666} .module-title-container .title-vice{color:#999;font-size:12px;margin-left:10px} -.module-title-container .more-content{position:absolute;top:calc(50% - 8px);right:0} +.module-title-container .more-content{position:absolute;top:calc(50% - 8px);right:0;font-size:12px;} /** * 模块内容基础样式