当前位置: 首页 > news >正文

ios内购支付-支付宝APP支付提现

文章目录

  • 前言
  • 一、IOS内购支付(ios订单生成自己写逻辑即可)
    • 1.支付回调票据校验controller
    • 1.支付回调票据校验server
  • 二、安卓APP支付宝支付
    • 1.生成订单返回支付宝字符串(用于app拉起支付宝,这里用的是证书模式)
    • 2.生成订单返回支付宝字符串server方法
    • 3.支付宝回调处理
  • 三、支付宝APP提现(没有授权,直接填用户账户信息)
    • 1.支付宝APP提现controller方法
    • 2.支付宝APP提现server方法


前言

这里用的是thinkphp5,但是支付这个其他框架或版本也可以参考,只需要改下写法即可

一、IOS内购支付(ios订单生成自己写逻辑即可)

在苹果内购支付中第一步先生成一个内部订单,然后把订单信息给到IOS客户端,内购支付只要是回调校验票据出路,这个票据会返给IOS客户端,让客户端把票据及订单信息一起传过来,注意订单号唯一即可

1.支付回调票据校验controller

public function payResult()
{//苹果内购的验证收据 orders模型换成自己的订单模型,字段换成自己的订单字段即可$receipt_data = $this->request->post('receipt-data');//票据$orderSn = $this->request->post('order_sn');//订单号// 验证支付状态$result = (new IosCheckServer())->payMoneyCheck($receipt_data, $orderSn);if($result['status']){$this->success('支付成功');}else{$this->error($result['message']);}}

1.支付回调票据校验server

/*** @param $receipt_data* @param $orderSn* @return array* @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException* @throws \think\exception\PDOException* ios充值消费燃币支付回调票据校验*/public function payMoneyCheck($receipt_data, $orderSn){//苹果内购的验证收据 orders模型换成自己的订单模型,字段换成自己的订单字段即可$orderinfo = Orders::where(['order_sn' => $orderSn])->find();if($orderinfo){if($orderinfo['pay_status'] == Orders::PAY_STATUS_PAID){return ['status' => false,'message' => '订单已成功支付,请勿重复发起申请'];}}else{return ['status' => false,'message'=>'订单异常'];}// 验证支付状态$result = $this->validate_apple_pay($receipt_data);if($result['status']){/*业务逻辑*/Db::startTrans();try {$orderinfo->pay_status = Orders::PAY_STATUS_PAID;$orderinfo->paid_at = time();$orderinfo->save();/*处理自己内部业务逻辑*//*处理自己内部业务逻辑*//*处理自己内部业务逻辑*/Db::commit();} catch (\Exception $e) {Db::rollback();return ['status' => false,'message' => '支付失败,请联系管理员'];}return ['status' => true,'message' => '支付成功'];}else{return ['status' => false,'message' => $result['message']];}}/*** @param $receipt_data* @param $orderinfo* @return array* @throws \think\exception\PDOException* 校验票据*/public function validate_apple_pay($receipt_data){// 验证参数if (strlen($receipt_data) < 20){return ['status' => false, 'message' => '非法参数'];}// 请求验证$html = $this->acurl($receipt_data);$data = json_decode($html,true);// 如果是沙盒数据 则验证沙盒模式if($data['status'] == '21007'){// 请求验证$html = $this->acurl($receipt_data, 1);$data = json_decode($html,true);$data['sandbox'] = '1';}//找出时间最大的数组$receiptitem = $data['receipt']['in_app'];//这个是排序的方法  下面回帖出来 苹果会把这个会员往期的订单信息全部返回,需要找出来最近的那一组信息$item = $this->arraySort($receiptitem,'purchase_date','desc');//判断一下过期时间 延长会员时间$orderThird = $item['transaction_id'];                //本次订阅的订单号$orderThirdFirst = $item['original_transaction_id'];  //这个是原始订单号if($orderThird == $orderThirdFirst){                  //首次订阅 两个相等return ['status' => true,'message' => '支付成功'];}else{//判断过期时间和当前时间比较   expires_date_ms是毫秒单位if($item['expires_date_ms']/1000 > time()){return ['status' => true,'message' => '支付成功'];}else{//过期处理  票据失效return ['code' => false,'message' => '票据失效,请联系管理员'];}}}/*** @param $receipt_data* @param int $sandbox* @return bool|string* 数据校验*/public function acurl($receipt_data, $sandbox = 0){/*** 21000 App Store不能读取你提供的JSON对象* 21002 receipt-data域的数据有问题* 21003 receipt无法通过验证* 21004 提供的shared secret不匹配你账号中的shared secret* 21005 receipt服务器当前不可用* 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送* 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务* 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务*///小票信息$POSTFIELDS = array("receipt-data" => $receipt_data);$POSTFIELDS = json_encode($POSTFIELDS);$url_buy     = "https://buy.itunes.apple.com/verifyReceipt";//正式购买地址$url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";//沙盒购买地址$url = $sandbox ? $url_sandbox : $url_buy;//curl - post$ch = curl_init($url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);$result = curl_exec($ch);curl_close($ch);return $result;}/*** @param $arr* @param $key* @param string $type* @return mixed* 查找最新数据*/public static function arraySort($arr,$key,$type='asc'){$keyArr = []; // 初始化存放数组将要排序的字段值foreach ($arr as $k => $v) {$keyArr[$k] = $v[$key]; // 循环获取到将要排序的字段值}if ($type == 'asc') {asort($keyArr); // 排序方式,将一维数组进行相应排序} else {arsort($keyArr);}foreach ($keyArr as $k => $v) {$newArray[$k] = $arr[$k]; // 循环将配置的值放入响应的下标下}$newArray = array_merge($newArray); // 重置下标return $newArray[0]; // 数据返回}

二、安卓APP支付宝支付

前期准备工作:

  1. 获取 App ID 和 商户私钥
  2. 申请并下载支付宝公钥证书和应用证书
  3. 如果站点有ssl更好,没有的话可以下载一个cacert.pem证书放到配置文件对应的地址里面,https://curl.se/docs/caextract.html
  4. 完成之后修改一下php.ini的配置curl.cainfo = /etc/pki/tls/certs/cacert.pem
    这里的地址时我按照原配置文件直接用的,放其他地方的话只要保证配置文件里面一致即可,支付宝的证书我是直接放项目里面的,引用的时候保证路径没问题即可

1.生成订单返回支付宝字符串(用于app拉起支付宝,这里用的是证书模式)

controller方法(订单逻辑部分可以自己处理)

	/*** @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException* 会员订单创建 - android*/public function memberOrderByAndroid(){/*** 生成订单数据*/$result = [];Db::startTrans();try {$model = new Orders($arr);$res = $model->save($arr);if ($res === false){Db::rollback();$this->error('订单创建失败');}$server = new AlipayServer();//订单号,金额,回调地址$res = $server->payMemberOrder($model->order_sn, number_format($model->amount, 2), '****/api/v1/member/notify');if ($res['code']){$result['orderStr'] = $res['data'];}Db::commit();}catch (\Exception $exception){Db::rollback();$this->error('订单创建失败');}$this->success('操作成功', $result);}

2.生成订单返回支付宝字符串server方法

	/*** @param $out_trade_no 订单号* @param $total_amount 金额* @param $notify_url 回调地址* @return array* 燃币充值 - 安卓 - 支付宝*/public function payMemberOrder($out_trade_no, $total_amount, $notify_url){require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v2/aop/AopCertClient.php';require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v2/aop/request/AlipayTradeAppPayRequest.php';/** 初始化 **/$aop = new \AopCertClient;/** 支付宝网关 **/$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";/** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/$aop->appId = config('alipay.app_id');/** 密钥格式为pkcs1,如何获取私钥请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554  **/$aop->rsaPrivateKey = trim(config('alipay.private_key'));/** 应用公钥证书路径,下载后保存位置的绝对路径  **/$appCertPath = __PUBLIC__ . '/cert/appCertPublicKey_2021004170664201.crt';/** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/$alipayCertPath = __PUBLIC__ . '/cert/alipayCertPublicKey_RSA2.crt';/** 支付宝根证书路径,下载后保存位置的绝对路径 **/$rootCertPath = __PUBLIC__ . '/cert/alipayRootCert.crt';/** 设置签名类型 **/$aop->signType= "RSA2";/** 设置请求格式,固定值json **/$aop->format = "json";/** 设置编码格式 **/$aop->charset= "utf-8";/** 调用getPublicKey从支付宝公钥证书中提取公钥 **/$aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);/** 是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内 **/$aop->isCheckAlipayPublicCert = true;/** 调用getCertSN获取证书序列号 **/$aop->appCertSN = $aop->getCertSN($appCertPath);/** 调用getRootCertSN获取支付宝根证书序列号 **/$aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay **/$request = new \AlipayTradeAppPayRequest();/** 设置业务参数 **/$request->setBizContent("{" ./**  商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/"\"out_trade_no\":\"{$out_trade_no}\"," ./** 销售产品码,固定值:QUICK_MSECURITY_PAY **/"\"product_code\":\"QUICK_MSECURITY_PAY\"," ./** 订单金额,精确到小数点后两位 **/"\"total_amount\":\"{$total_amount}\"," ./** 订单标题(可自定义) **/"\"subject\":\"会员充值\"," ./** 订单描述(可自定义) **/"\"body\":\"会员充值\"" ."}");/** 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/$request->setNotifyUrl($notify_url);try {/** 调用SDK生成支付链接,可在浏览器打开链接进入支付页面 **/$result = $aop->sdkExecute($request);$result = str_replace('&amp;', '&', htmlspecialchars($result));/** response.getBody()打印结果就是orderString,可以直接给客户端请求,无需再做处理。如果传值客户端失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/89 **/return ['code' => 1, 'data' => $result, 'msg' => ''];} catch (\Exception $e) {return ['code' => 0, 'data' => $e->getMessage(), 'msg' => ''];}}

返回APP客户端示例:
在这里插入图片描述

3.支付宝回调处理

	/*** @return string* 安卓充值支付回调*/public function notify(){if(isset($_POST['out_trade_no']) && empty($order_sn)){$order_sn = $_POST['out_trade_no'];}Db::startTrans();try {$order = Orders::where('order_sn', $order_sn)->find();if(!$order){Db::rollback();return 'false';}$order->save(['pay_status' => Orders::PAY_STATUS_PAID]);//处理自己的业务逻辑Db::commit();}catch (\Exception $exception){Db::rollback();return 'false';}return 'success';}

三、支付宝APP提现(没有授权,直接填用户账户信息)

这里设计的是让用户输入支付宝账户和绑定的用户名,授权的话可以参考支付宝文档https://opendocs.alipay.com/common/02nk10?pathHash=a7475006

1.支付宝APP提现controller方法

	/*** 提现到支付宝*/public function alipayToUser(){$redis = new \Redis();$redis->connect('127.0.0.1', 6379);$redis->auth('Hd20240306');$lockKey = 'box_lock_' . $this->user->id;$lockValue = uniqid(); // 生成唯一值,用于解锁验证$expireTime = 10; // 锁的超时时间,秒// 尝试获取锁$isLocked = $redis->setnx($lockKey, $lockValue);if ($isLocked) {$redis->expire($lockKey, $expireTime); // 设置锁的过期时间,以避免死锁Db::startTrans();try {$out_biz_no = $this->request->post('out_biz_no');//商户端的唯一订单号$payee_type = $this->request->post('payee_type');//收款方账户类型(支付宝账户)$payee_account = $this->request->post('payee_account');//收款方支付宝账号$name = $this->request->post('name');//收款方支付宝账号if (!$name || $name == ''){throw new Exception('请输入支付宝绑定的真实用户名');}$cash = (new Cash())->where('order_sn', $out_biz_no)->find();if (!$cash){throw new Exception('订单有误');}$amount = number_format($cash->amount, 2);//转账金额//用户 -$num = number_format($amount * config('money.other'), 2);$memo = '提现'.$num.'燃币';$user_info = \app\common\model\User::where('id', $this->user->id)->find();if ($user_info->money < number_format($cash->amount * config('money.other'), 2)){throw new Exception('余额不足');}//业务逻辑处理//提现(new AlipayServer())->payToUser($out_biz_no, $payee_account, $amount, $payee_type, $name);//订单状态变更$cash->payee_account = $payee_account;$cash->real_name = $name;$cash->pay_status = 2;$cash->save();Db::commit();}catch (\Exception $exception){Db::rollback();Log::info('alipayToUser-to' . $exception->getMessage());$this->error($exception->getMessage());}$this->success('提现成功');} else {$this->error('操作过于频繁,请稍后再试');}}

2.支付宝APP提现server方法

	/*** @param $outBizNo - 订单号* @param $payeeAccount - 账户* @param $amount - 金额* @param $payeeType - 账户类型* @param $name - 账户绑定的实名信息* @param string $remark - 备注*/public function payToUser($outBizNo, $payeeAccount, $amount, $payeeType, $name, $remark = '提现'){require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Util/AlipayConfigUtil.php';require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Util/AlipayLogger.php';require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Api/AlipayFundTransUniApi.php';require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Model/AlipayFundTransUniTransferModel.php';require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Model/Participant.php';// 初始化SDK$alipayConfigUtil = new AlipayConfigUtil($this->getPayConfig());// 构造请求参数以调用接口$apiInstance = new AlipayFundTransUniApi(new Client());// 设置AlipayConfigUtil$apiInstance->setAlipayConfigUtil($alipayConfigUtil);$data = new AlipayFundTransUniTransferModel();// 设置商家侧唯一订单号$data->setOutBizNo($outBizNo);//自己定义的转账外部单号// 设置订单总金额$data->setTransAmount($amount);// 设置描述特定的业务场景$data->setBizScene("DIRECT_TRANSFER");// 设置业务产品码$data->setProductCode("TRANS_ACCOUNT_NO_PWD");// 设置转账业务的标题$data->setOrderTitle($remark);// 设置收款方信息$payeeInfo = new Participant();$payeeInfo->setIdentity($payeeAccount);$payeeInfo->setIdentityType($payeeType);$payeeInfo->setName($name);$data->setPayeeInfo($payeeInfo);// 设置业务备注$data->setRemark($remark);// 设置转账业务请求的扩展参数$data->setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");try {//屏蔽日志打印AlipayLogger::setNeedEnableLogger(false);$result = $apiInstance->transfer($data);$result = json_decode($result, true);if ($result['status'] == 'SUCCESS'){return true;}else{throw new Exception($result['message']);}} catch (ApiException $e) {throw new Exception('操作失败' . $e->getMessage());}}

相关文章:

ios内购支付-支付宝APP支付提现

文章目录 前言一、IOS内购支付&#xff08;ios订单生成自己写逻辑即可&#xff09;1.支付回调票据校验controller1.支付回调票据校验server 二、安卓APP支付宝支付1.生成订单返回支付宝字符串&#xff08;用于app拉起支付宝&#xff0c;这里用的是证书模式&#xff09;2.生成订…...

新课发布|鸿蒙HarmonyOS Next商城APP应用开发实战

2024年年初&#xff0c;鸿蒙HarmonyOS Next星河版强势发布&#xff0c;随着鸿蒙系统的普及和应用场景的拓展&#xff0c;市场需求将持续增加。鸿蒙系统已经应用于华为的智能手机、平板电脑、智能家居等多个领域&#xff0c;并有望在未来拓展到智能汽车、物联网等更多领域。这为…...

基于Java,SpringBoot,Vue智慧校园健康驿站体检论坛请假管理系统

摘要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xf…...

【数据分享】2001-2023年我国省市县镇四级的逐月平均气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月平均气温栅格数据&#xff0c;该数据来源于国家青藏高原科学数据中心。为方便大家使用&#xff0c;我们还基于上述平均气温栅格数据将数据处理为Shp和Excel格式的省市县三级逐月平均气温数据&#xff08;可查看之前的文章获悉详情&#…...

c#代码介绍23种设计模式_16迭代器模式

目录 1、迭代器模式的介绍 2、迭代器模式的定义 3、迭代器模式的结构 4、代器模式角色组成 5、迭代器实现 6、迭代器模式的适用场景 7、迭代器模式的优缺点 8、.NET中迭代器模式的应用 9、实现思路 1、迭代器模式的介绍 迭代器是针对集合对象而生的,对于集合对象而言…...

408算法题leetcode--第23天

236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先\思路&#xff1a;递归&#xff0c;如注释时间和空间&#xff1a;O(n) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) …...

帝国CMS系统开启https后,无法登陆后台的原因和解决方法

今天本地配置好了帝国CMS7.5&#xff0c;传去服务器后&#xff0c;使用http访问一切正常。但是当开启了https&#xff08;SSL&#xff09;后&#xff0c;后台竟然无法登陆进去了。 输入账号密码后&#xff0c;点击登陆&#xff0c;跳转到/e/admin/ecmsadmin.php就变成页面一片…...

根据视频id查询播放量

声明&#xff1a;文章仅用于学习交流,如有侵权请联系删除 如何根据视频ID查询视频的播放数量 在数字化时代&#xff0c;视频内容的消费已成为人们日常生活的重要组成部分。无论是社交媒体平台上的短视频&#xff0c;还是视频分享网站上的长视频&#xff0c;了解视频的播放数量…...

初始爬虫11

1.斗鱼selenium爬取 # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By import timeclass Douyu(object):def __init__(self):self.url https://www.douyu.com/directory/allself.driver webdriver.Chrome()self.driver…...

SSY20241002提高组T4题解__纯数论

题面 题目描述 有一天 p e o p 1 e peop1e peop1e 学长梦到了一个丑陋的式子&#xff1a; ∑ i 1 n ( ∑ m 1 R F m ) ! i ! ∑ l 0 i ∑ j 0 ∑ t 1 R F t { K i − l } l ! { i ∑ w 1 R F w − j } j ! \sum_{i1}^n (\sum_{m1}^R F_m)!\times i!\times \sum_{l…...

Python:lambda 函数详解 以及使用

一、lambda 语法 lambda 函数的语法只包含一个语句&#xff0c;表现形式如下&#xff1a; lambda [arg1 [,arg2,.....argn]]:expression 其中&#xff0c;lambda 是 Python 预留的关键字&#xff0c;[arg…] 和 expression 由用户自定义。 具体如下: [arg…] 是参数列表&#…...

【C++】空指针和野指针

文章目录 1.空指针2.野指针总结 1.空指针 概念&#xff1a;指针变量指向内存中编号为0的空间。 用途&#xff1a;初始化指针变量。 注意&#xff1a;空指针指向的内存是不可以访问的。 示例&#xff1a; int main(){//指针变量p指向内存地址编号为0的空间int *PNULL&#…...

大模型提示词

纯输入版提示工程词 输出一个九九乘法口诀表 当然可以&#xff01;以下是九九乘法口诀表&#xff1a; 1 x 1 1 1 x 2 2 2 x 2 4 1 x 3 3 2 x 3 6 3 x 3 9 1 x 4 4 2 x 4 8 3 x 4 12 4 x 4 16 1 x 5 5 2 x 5 10 3 x 5 15 4 x 5 20 5 …...

在线css像素px到Em的转换器

具体请前往&#xff1a;在线Px转Em工具--将绝对像素(px)长度单位转换为相对长度em...

回溯算法解决排列组合及子集问题

216. 组合总和 III39. 组合总和40. 组合总和 II46. 全排列47. 全排列 II77. 组合 78. 子集 90. 子集 II 以上是力扣设计相关问题的题目。排列组合还是子集问题无非就是从序列 nums 中以给定规则取若干元素&#xff0c;主要有以下几类&#xff1a; 元素无重不可复选&#xff0…...

Unity中Mesh多种网格绘制模式使用方法参考

Unity中MeshFilter中的Mesh默认情况下使用MeshTopology.Trigangles类型绘制网格&#xff0c;就是通常的绘制三角形网格&#xff0c;实际上Mesh有五种绘制模式&#xff0c;对应MeshTopology的枚举&#xff0c;分别是 Triangles网格由三角形构成。Quads网格由四边形构成。Lines网…...

【Spring Security】基于SpringBoot3.3.4版本②如何配置免鉴权Path

基于Spring Boot 3.3.4,详细说明Spring Security 6.3.3的使用 摘要本地开发环境说明SecurityFilterChain介绍application.ymlWen3SecurityProperties.java修改DemoWen3Security修改SecurityFilterChainIgnoredPathController.javaIgnoredPathController2.java启动工程测试测试…...

信息学奥赛复赛复习11-CSP-J2020-04方格取数-动态规划、斐波那契数列、最优子结构、重叠子问题、无后效性

PDF文档回复:20241004 1 P7074 [CSP-J2020] 方格取数 [题目描述] 设有 nm 的方格图&#xff0c;每个方格中都有一个整数。现有一只小熊&#xff0c;想从图的左上角走到右下角&#xff0c;每一步只能向上、向下或向右走一格&#xff0c;并且不能重复经过已经走过的方格&#x…...

Hive数仓操作(十二)

一、Hive 中的行列转换 1. 行转列&#xff1a; collect_list() collect_list() 函数用于将一个列中的数据收集成一个数组。 示例数据文件 假设有一个名为 orders.txt 的文件&#xff0c;内容如下&#xff1a; 1,101 1,101 1,103 2,104 2,105导入数据到 Hive 表 首先&…...

计算机毕业设计 基于SpringBoot和Vue的课程教学平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

有状态(Session) VS 无状态(Token)

目录 概念 JWT Token在项目中使用 概念 有状态和无状态服务是两种不同的服务架构&#xff0c;两者的不同之处在于对于服务状态的处理。 1、有状态服务 是指程序在执行过程中生成的中间数据&#xff0c;服务器端一般都要保存请求的相关信息&#xff0c;每个请求可以默认地使…...

天坑!Spark+Hive+Paimon+Dolphinscheduler

背景: 数据中台项目使用Spark+Hive+Paimon做湖仓底层,调度任务使用的是基于Dolphinscheduler进行二开。在做离线脚本任务开发时,在Paimon库下执行非查询类SQL报错。 INSERT报错 DELETE报错 现状: 原始逻辑为数据中台中选择的Paimon数据源,实际上在Dolphinscheduler中是…...

JAVA——IO框架

目录 一、框架 二、导入框架步骤 三、测试 一、框架 框架就是为了解决某类问题&#xff0c;编写的一套类、接口等。大多数框架都是第三方研发的 好处: 在框架的基础上开发&#xff0c;提高开发效率 框架的形式&#xff1a;一般是把类、接口编译成class形式&#xff0c;再…...

项目管理系统如何实现项目申报流程自动化?

传统的项目申报流程往往繁琐复杂&#xff0c;涉及众多环节和部门间的协作&#xff0c;不仅耗时费力&#xff0c;还容易因人为疏忽而导致错误或延误。随着信息技术的飞速发展&#xff0c;项目管理系统的出现为项目申报流程的自动化提供了可能&#xff0c;极大地提升了申报效率和…...

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作&#xff08;不敢称为项目&#xff09;代号&#xff0c;其中3表示是第3种数据库。 多年前&#xff0c;对在役民航客机中的某型机载导航数据库的二进制文件进行分析&#xff0c;弄明白它的数据结构后做了几个工具&#xff0c…...

C++:const成员

const修饰成员变量&#xff0c;要在初始化列表中进行初始化。 const修饰成员函数&#xff0c;要放在函数后&#xff0c;称为常函数。常函数不能修改普通成员变量。 const修饰的对象&#xff0c;称为常对象。常对象不能修改普通成员变量&#xff0c;只能读取。 常对象只能使用…...

基于ROS的激光雷达点云物体检测

环境 RTX 2060&#xff08;后面关于算力&#xff09; ubuntu 18.04 ROS melodic &#xff08;ubuntu 18.04安装ROS melodic可以参看我这篇文章ubuntu 18.04安装ROS系统&#xff09; CUDA 10.0 cudnn 7.6.5 caffe cmake 3.18.0&#xff08;不能低于3.12.2&#xff09; opencv 3…...

大模型训练环境搭建

硬件资源说明 本教程基于GPU 3090的服务器 资源类型 型号 核心指标 CPU Intel(R) Xeon(R) Bronze 3204 CPU 1.90GHz 12核 内存 / 125Gi GPU NVIDIA GeForce RTX 3090 24G显存 注意&#xff1a;接下来的部分命令需要使用科学上网&#xff0c;需要事先配置好。 安…...

使用Java调用GeoTools实现全球国家矢量数据入库实战

目录 前言 一、相关数据介绍 1、无空间参考的数据 2、有空间参考的数据 3、空间信息表物理模型 二、全球国家空间数据入库 1、后台实体类图 2、后台实体对象关键代码 三、时空数据入库实践 1、读取无空间参考数据 2、入库成果及注意事项 四、总结 前言 在当今世界&…...

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...