• 【Flutter】App内购支付集成 Google和Apple支付和服务器验证全流程

【Flutter】App内购支付集成 Google和Apple支付和服务器验证全流程

2025-04-27 13:57:28 2 阅读

Flutter支付集成

前言:

以谷歌内购为例,我们需要做的总共为三步

  1. 需要在谷歌市场配置商品,设置测试渠道,配置开发者账号,设置对应权限。
  2. 配置完商品之后,如何在 Flutter 中获取到商品,购买指定商品,消耗商品等。
  3. 购买成功之后,如何到服务器校验是否支付成功,后台服务器如何配置通行权限,谷歌市场与谷歌云的关联以及相关校验。

购买交易的生命周期
下面是一次性购买或订阅的典型购买流程:

  1. 向用户展示他们可以购买什么。
  2. 启动购买流程,以便用户接受购买交易。
  3. 在您的服务器上验证购买交易。
  4. 向用户提供内容。
  5. 确认内容已传送给用户。对于消耗型商品,用户要先消耗掉已购商品,才能再次购买。

订阅会自动续订,直到被取消。订阅可处于下面这几种状态:

  • 有效:用户信誉良好,可享用订阅内容。
  • 已取消:用户已取消订阅,但在到期前仍可享用订阅内容。
  • 处于宽限期:用户遇到了付款问题,但仍可享用订阅内容,同时 Google 会重新尝试通过相应的付款方式扣款。
  • 暂时保留:用户遇到了付款问题,不能再享用订阅内容,同时 Google 会重新尝试通过相应的付款方式扣款。
  • 已暂停:用户暂停了其订阅,在恢复之前不能享用订阅内容。
  • 已到期:用户已取消且不能再享用订阅内容。用户在订阅到期时会被视为流失。

支付流程示意图

一 、google开发者平台配置

首先进入谷歌开发者平台
https://developers.google.com/?hl=zh-cn

进入开发者平台之后,点击google play,创建我们的APP

点击登录管理中心

创建完我们的APP之后,就可以开始配置支付的功能。需要注意的是,在进行谷歌支付测试的时候,需要先提交一个封闭测试版本及以上等级(例如公开版本)的包,然后才可以去创建应用内支付的商品,等这个包提交审核通过之后才可以开始进行谷歌支付的测试。

1.1、创建定价模板

在设置页面

找到付款概况之后,如果没有付款账号,我们填写一些信息,姓名,邮箱,账号,等等信息,创建完成之后我们就可以设置定价的模板。
如果能创建模板说明你付款账号没问题,定价模板是非必须的,可有可无,但是定义了模板之后会更加方便,到时候创建商品可以直接关联模板,账号下的每一个子应用的内购商品都能关联对应的模板,有一个统一的定价。
如何创建定价模板如下:

我们创建模板之后,就可以定义模板的价格与标题,选择的金额会有对应的汇率转换,比如我创建的新加坡币,如果用港元支付的话,会根据汇率转换为对应的港元支付。

创建完成之后,我们就能看到对应的定价模板如下图所示:

1.2、上架封闭测试App

点击创建轨道

点击创建新的发布版本

签名选择Google管理签名,然后上传aab格式的release版本的包,aab版本的包在这里生成
点开Build,选择Generate Signed Bundle/APK

然后选择app bundle

然后一路next,最后选择release版本,然后finish

然后在输出控制台的build选项卡,即可找到刚刚打出来的aab包

然后上传就可以了。

1.3、创建应用内购商品

此时就可以配置应用内商品了,点击这里进行添加配置:

添加完成后记得激活,不然即使审核通过之后测试的时候也获取不到该商品

点击这里激活商品

这个时候商品的配置就完成了。

接下来添加测试账户,进入封闭测试页面,切换到【测试用户选项卡】,然后创建测试群组,在群组里添加测试人员账户即可

当你的APP审核通过之后,这个页面下方的测试人员参与方式便会生效,如下所示:

就可以将这些链接发给测试人员,让他们去安装进行测试购买。

最后修改一下测试政策状态

选中测试群组,然后将政策状态改为LICENSED

OK,配置完成

二 、Apple开发者平台添加内购商品

首先使用苹果开发者账户登录苹果开发者平台

https://developer.apple.com/account

点击【App】

添加新的苹果内购商品

添加的时候页面的指引很清晰,就不赘述了,苹果添加内购商品比较简单,加完就可以了。

然后去创建沙盒账户用来做苹果支付测试,回到首页,点击【用户和访问】

点击沙盒,然后添加一个苹果测试账户,这个账户可以是个假的邮箱,不需要是正式的Apple id,比如你可以设置为8888888@qq.com类似之类的账户

添加完点击创建即可

OK,配置完成

三、flutter 代码集成

使用到的官方推出的应用内购插件:

in_app_purchase: ^3.2.0

插件官网地址:https://pub.dev/packages/in_app_purchase

使用起来并不复杂,可以说是 Android 与 iOS 的逻辑是一样样的。

将插件添加至yaml文件,然后执行flutter pub get

执行完了记得去IOS和安卓端分别执行pod install 和 gradle sync同步一下第三方插件

然后在项目中新建dart文件,命名为:BuyEngine.dart

然后将以下代码放入:

import 'dart:async';
import 'dart:io';
 
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart';
import 'package:in_app_purchase_android/in_app_purchase_android.dart';
 
class BuyEngin{
 
  StreamSubscription<List<PurchaseDetails>> _subscription;
  InAppPurchase _inAppPurchase;
  List<ProductDetails> _products; //内购的商品对象集合
 
  //初始化购买组件
  void initializeInAppPurchase() {
 
    // 初始化in_app_purchase插件
    _inAppPurchase = InAppPurchase.instance;
 
    //监听购买的事件
    final Stream<List<PurchaseDetails>> purchaseUpdated = _inAppPurchase.purchaseStream;
    _subscription = purchaseUpdated.listen((purchaseDetailsList) {
      _listenToPurchaseUpdated(purchaseDetailsList);
    }, onDone: () {
      _subscription.cancel();
    }, onError: (error) {
      error.printError();
      print("购买失败了");
    });
  }
 
  void resumePurchase(){
    _inAppPurchase.restorePurchases();
  }
 
  /// 加载全部的商品
  void buyProduct(String productId) async {
 
    print("请求商品id " + productId);
 
    List<String> _outProducts = [productId];
 
    final bool available = await _inAppPurchase.isAvailable();
    if (!available) {
      // ToastUtil.showToast("无法连接到商店");
      print("无法连接到商店");
      return;
    }
 
    //开始购买
    // ToastUtil.showToast("连接成功-开始查询全部商品");
    print("连接成功-开始查询全部商品");
    List<String> _kIds = _outProducts;
 
    final ProductDetailsResponse response = await _inAppPurchase.queryProductDetails(_kIds.toSet());
    print("商品获取结果  " + response.productDetails.toString());
    if (response.notFoundIDs.isNotEmpty) {
      // ToastUtil.showToast("无法找到指定的商品");
      print("无法找到指定的商品");
      // ToastUtil.showToast("无法找到指定的商品 数量 " + response.productDetails.length.toString());
 
      return;
    }
 
    // 处理查询到的商品列表
    List<ProductDetails> products = response.productDetails;
    print("products ==== " + products.length.toString());
    if (products.isNotEmpty) {
      //赋值内购商品集合
      _products = products;
    }
 
    print("全部商品加载完成了,可以启动购买了,总共商品数量为:${products.length}");
 
    //先恢复可重复购买
    // await _inAppPurchase. ();
 
    startPurchase(productId);
  }
 
 
  // 调用此函数以启动购买过程
  void startPurchase(String productId) async {
 
    print("购买的商品id为" + productId);
    if (_products != null && _products.isNotEmpty) {
      // ToastUtil.showToast("准备开始启动购买流程");
      try {
        ProductDetails productDetails = _getProduct(productId);
 
        print("一切正常,开始购买,信息如下:title: ${productDetails.title}  desc:${productDetails.description} "
            "price:${productDetails.price}  currencyCode:${productDetails.currencyCode}  currencySymbol:${productDetails.currencySymbol}");
        _inAppPurchase.buyConsumable(purchaseParam: PurchaseParam(productDetails: productDetails));
      } catch (e) {
        e.printError();
        print("购买失败了");
      }
    } else {
      print("当前没有商品无法调用购买逻辑");
    }
  }
 
  // 根据产品ID获取产品信息
  ProductDetails _getProduct(String productId) {
    return _products.firstWhere((product) => product.id == productId);
  }
 
  /// 内购的购买更新监听
  void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList) async {
    for (PurchaseDetails purchase in purchaseDetailsList) {
      if (purchase.status == PurchaseStatus.pending) {
        // 等待支付完成
        _handlePending();
      } else if (purchase.status == PurchaseStatus.canceled) {
        // 取消支付
        _handleCancel(purchase);
      } else if (purchase.status == PurchaseStatus.error) {
        // 购买失败
        _handleError(purchase.error);
      } else if (purchase.status == PurchaseStatus.purchased || purchase.status == PurchaseStatus.restored) {
        // ToastUtil.showToast(DataConfig.getShowName("Pay_Success_Tip"));
        //完成购买, 到服务器验证
        if (Platform.isAndroid) {
          var googleDetail = purchase as GooglePlayPurchaseDetails;
          checkAndroidPayInfo(googleDetail);
        } else if (Platform.isIOS) {
          var appstoreDetail = purchase as AppStorePurchaseDetails;
          checkApplePayInfo(appstoreDetail);
        }
      }
    }
  }
 
  /// 购买失败
  void _handleError(IAPError iapError) {
    // ToastUtil.showToast("${DataConfig.getShowName("Purchase_Failed")}:${iapError?.code} message${iapError?.message}");
  }
 
  /// 等待支付
  void _handlePending() {
    print("等待支付");
  }
 
  /// 取消支付
  void _handleCancel(PurchaseDetails purchase) {
    _inAppPurchase.completePurchase(purchase);
  }
 
  /// Android支付成功的校验
  void checkAndroidPayInfo(GooglePlayPurchaseDetails googleDetail) async {
    _inAppPurchase.completePurchase(googleDetail);
    print("安卓支付交易ID为" + googleDetail.purchaseID);
    print("安卓支付验证收据为" + googleDetail.verificationData.serverVerificationData);
  }
 
  /// Apple支付成功的校验
  void  checkApplePayInfo(AppStorePurchaseDetails appstoreDetail) async {
    _inAppPurchase.completePurchase(appstoreDetail);
 
    print("Apple支付交易ID为" + appstoreDetail.purchaseID);
    print("Apple支付验证收据为" + appstoreDetail.verificationData.serverVerificationData);
  }
 
 
  @override
  void onClose() {
    if (Platform.isIOS) {
      final InAppPurchaseStoreKitPlatformAddition iosPlatformAddition =
      _inAppPurchase.getPlatformAddition<InAppPurchaseStoreKitPlatformAddition>();
      iosPlatformAddition.setDelegate(null);
    }
    _subscription.cancel();
  }
 
}

至此集成完毕,开始测试谷歌支付

三 、支付测试

在调用支付的地方提前初始化购买插件:

BuyEngin _buyEngin = BuyEngin();
_buyEngin.initializeInAppPurchase();

然后调用即可:

_buyEngin.buyProduct("应用内商品ID");

应用内商品ID就是你在google开发者中心或APP Store Connect 配置的应用内购买商品的product ID

如果一切正常,则会正常唤醒谷歌或苹果支付

支付完成后可以看到可以正常获取到交易的ID和交易的验证收据,为了避免被第三方恶意刷购买接口来进行非法购买,建议将该收据上传后端服务器进行验证,验证通过之后再去更新用户的购买信息。

Ok ,集成完毕,功德+1

四、 服务器校验相关流程

为什么要加后端校验?客户端支付成功了,服务端怎么知道,万一用接口的方式通信,如果被抓包岂不是可以无限加金币了。太不安全了,所以才有服务器校验这一步。

iOS的校验不用说,很简单,拿到支付完成的票据直接发起请求即可,而 Android 的服务端校验就相对麻烦,需要配置谷歌云,以及对应的通行权限。

谷歌结算文档:https://developer.android.com/google/play/billing?hl=zh-cn
谷歌支付校验AI:https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products?hl=zh-cn
如果我们直接在API中调用校验接口,那肯定是直接报错:

{
  "error": {
    "code": 403,
    "message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console.",
    "errors": [
      {
        "message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console.",
        "domain": "androidpublisher",
        "reason": "projectNotLinked"
      }
    ]
  }
}


没有授权,接下来开始授权

4.1、Google Cloud关联

首先需要配置 Google Cloud 并且配置相关的账号,对应指定的应用。
点击项目的 API Access 中

如果这一步你没有 Google Cloud 账号,可以创建或关联已有的 Google Cloud 账号,这里我没有就直接创建了Google Cloud 账号。关联之后我们就能看到上图所示的画面。

我们可以直接在谷歌市场控制台中的 API Access 中直接进入谷歌云后台,也能 直接输入网址 https://code.google.com/apis/console/ 是一样的效果。

我们关联 Google Cloud 账号之后,默认就已经开通 Google Play Developer API 权限。

所以我们不需要再次去授权了。

如果觉得不保险,也能在里面搜索 Billing ,然后启动相关的支付服务权限

4.2 、创建 web-OAuth 授权

当我们在谷歌市场的后台关联谷歌云的时候,就已经帮我们初始化了很多配置,已经都有了
我们再谷歌云后台,在APIs & auth 项中找到 Credentials,直接查看即可:

我们点击 Web 授权进去配置相关配置。
主要是配置左侧的上下两个 URI 地址,上面的配置后台域名:

下面的是固定写法,callback的地址一定是可用域名 + /oauth2callback。

创建完成之后,记得记录你的三个重要字段,client_id 和 client_secret 以及 redirect_uri ,后面会用到。
通过访问一下的网页获取到一个oauth2callback:

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&
redirect_uri=https://api.whatsapp.sg/oauth2callback&client_id=816630003638-5p27m684jfpfa6sh6l9chbpreq2hg9ov.apps.googleusercontent.com 

返回一个code:

https://api.whatsapp.sg/oauth2callback?code=4/CpVOd8CljO_gxTRE1M5jtwEFwf8gRD44vrmKNDi4GSS.kr-GHuseD-oZEnp6UADFXm0E0MD3FlAI

拿到后面的 code 字段。

code=4/CpVOd8CljO_gxTRE1M5jtwEFwf8gRD44vrmKNDi4GSS.kr-GHuseD-oZEnp6UADFXm0E0MD3FlAI

我们手动的在 postman 之类的工具上,通过固定的参数,拿到 refresh_token(重点,后期全靠它)

{
        'grant_type':'authorization_code',
        'code':'4/CpVOd8CljO_gxTRE1M5jtwEFwf8gRD44vrmKNDi4GSS.kr-GHuseD-oZEnp6UADFXm0E0MD3FlAI',//上一步获取的,
        'client_id':'816630003638-5p27m684jfpfa6sh6l9chbpreq2hg9ov.apps.googleusercontent.com',
        'client_secret':'36WnPnojshgj56uhghj-xCo',
        'redirect_uri':'https://api.whatsapp.sg/oauth2callback',
}
    


向以下的网址发起 Post 请求。

https://accounts.google.com/o/oauth2/token

一定要保证网络畅通,只有一次机会,返回的json对象如下

{
"access_token" : "",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/zaaHNytlC3SEBX7F2cfrHcqJEa3KoAHYeXES6nmho"
}

refresh_token 就拿到了,注意一定要保存好,只有这一次机会,如果再次调用此接口 refresh_token 就是空了,不会返回了。

4.3、web-OAuth校验支付是否成功

拿到这个refresh_token就可以调用真正的校验接口了,例如我们后端调用的是否支付成功:

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{purchaseToken}?access_token={$access_token}"


这里的packageName,productId,purchaseToken 大家都很熟悉了,就是Android 支付成功之后返回给我们的,直接传递给后端即可,而access_token其实就是我们上面拿到的 refresh_token。

我们需要拿到第一次返回的 refresh_token 保存起来,后续以刷新的方式来获取新的 refresh_token ,用于访问真正的API。

后台调用验证接口完成之后得到的对象如下:

{
  "kind": string,
  "purchaseTimeMillis": string,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string,
  "orderId": string,
  "purchaseType": integer,
  "acknowledgementState": integer,
  "purchaseToken": string,
  "productId": string,
  "quantity": integer,
  "obfuscatedExternalAccountId": string,
  "obfuscatedExternalProfileId": string,
  "regionCode": string
}

只需要验证状态即可:

consumptionState == 0 purchaseState == 0

说明这个商品已经购买了,并且也没有被消耗,那么此时就可以给移动端返回true,让移动端执行消耗操作。
后端PHP的校验谷歌内购是否成功示例代码:

   public function checkGooglePay(){  
         $google_public_key    = "你的公钥(google后台在你的应用下获取)";  
         $inapp_purchase_data  = $_REQUEST['signtureTemp'];   
         $inapp_data_signature = $_REQUEST['signtureDataTemp'];   
          $key        = "-----BEGIN PUBLIC KEY-----
".chunk_split($google_public_key, 64,"
").'-----END PUBLIC KEY-----';  
          $key        = openssl_pkey_get_public($key);   
          $signature  = base64_decode($inapp_data_signature);  
          $ok         = openssl_verify($inapp_purchase_data,$signature,$key,OPENSSL_ALGO_SHA1);      
          if (1 == $ok) {  
             // 支付验证成功!   
             //进行二次验证,订单查询     
             
           // 1.获取access_token(3600秒有效期)
             $access_token_url = "https://accounts.google.com/o/oauth2/token";
            $data_tmp2 = array(
                 'grant_type'=>'refresh_token',
                 'refresh_token'=>'',//长效token
                 'client_id'=>'',    //客户端id    
                'client_secret'=>'',//客户端密钥
                 );
             $http = new http($access_token_url,'POST',5);
             $http->setContent($data_tmp2);
             $result = $http->exec();
            $result = json_decode($contents,true);
             $access_token = $result['access_token'];

             //2.通过获得access_token 就可以请求谷歌的API接口,获得订单状态
             $packageName=""//包名
            $productId="" //产品Id
             $purchaseToken=""
        
              $url = "https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{purchaseToken}?access_token={$access_token}";
               $http = new http($url,'GET',5);
             $http->setContent($data);
             $contents = $http->exec();
             $contents = json_decode($contents,true);
              
            if($contents['consumptionState'] == 0 && $contents['purchaseState'] == 0){
                //验证成功  购买成功并且没有消耗  google支付中客户端如果没有进行消耗是不能再次购买该商品
                 //处理游戏逻辑 发钻石,通知客户端进行消耗
             }else{
                 //订单验证失败
             }             
         }else{  
             //签名验证失败
 
         }           
     }

  • 第一步是可选的,校验APK的签名,当前应用是不是谷歌市场下载的,如果不是从谷歌市场下载的那么支付不生效。如果你想要的校验APK来源就加上,不想校验也可以。

  • 第二步就是开始校验谷歌内购支付订单的状态,拿到本地长期保存的refresh_token 以及之前获取到的client_id 和 client_secret 就可以到哪授权的 access_token 。

  • 第三部就是拿到 access_token 以及 客户端传递的包名,产品id,支付凭证,调用校验接口,拿到订单的当前状态。
    然后就是根据订单的状态判断返回给客户端是否有效,让客户端执行消耗操作。
    如果您觉得有必要,也可以消耗之后再次调用接口校验,是否已购买,是否已消耗。

4.4、 创建Service Account的授权

其实之前的之前的 Web-OAuth 的方式来进行验证不是不行,但是步骤相对比较复杂,而更推荐的方式则是创建服务的方式来进行校验。
我们把视角拉回谷歌市场控制台,找到 Api Access 选项

其实我们在下面的访问权限就可以看到 Service Account 的选项。如果你已有 Service Account 就可以看到全部的关联的 Service Account 。如果你没有此服务,那么就可以点击创建服务去谷歌云创建。当我们到谷歌云里面点击创建 Service Account:

我们点击创建 Service Account 会走到创建服务的流程:

第一步随便写,关键是第二步:

选择角色为 Service Account Admin

第三步不填,直接提交:

你就能看到你创建的服务啦,接下来就是创建Key,Json的方式创建,然后下载到Json给到后台人员。

再下一步就回到谷歌商店控制台的 Api Access 看 Service Account 是否已经关联上了:

如果有这样的信息,说明关联上了,才是正确的流程,如果你创建了 Service Account,但是这里并没有展示,那么就肯定会错:

{  
  "code" : 401,  
  "errors" : [ {  
    "domain" : "androidpublisher",  
    "message" : "The current user has insufficient permissions to perform the requested operation.",  
    "reason" : "permissionDenied"  
  } ],  
  "message" : "The current user has insufficient permissions to perform the requested operation."  
}

之后正常显示了服务,说明你的服务才能访问到谷歌市场这一边,接下来就是点击授予访问权限。
重点是要把财务信息的两项勾选上,这样才能访问到应用内支付校验的相关权限,如图所示:

点击保存修改之后就完成了,由于我们关联账号的时候已经勾选了 Google Play Android Developer API 权限,我们现在直接就能用了。

后端的用法各平台的使用方式不同,但是都是很简单的,直接集成谷歌的API,然后总共就两步,第一步设置Config属性把这个 Service Account 生成的Json文件传入,第二步直接调用 GoogleAPI 内置的校验方法即可,都是API内置了的更方便。

当我们客户端把packageName ,prodectId,purchaseToken 三个字段传给后端,他们直接调用 API 就能直接校验,相比 Web-OAuth 的方式要更简单一些。
校验结果如下:

OK,两种方法 Web-OAuth 的授权方式,以及 Service Account 的授权方式,两种都可以达到效果,用哪种都可以。
至此谷歌内购全部流程已结束。

丢单问题处理

使用
_inAppPurchase.purchaseStream是用来监听消息队列的回调的,也就是所有订单的状态以及信息回调,in_app_purchase这个属性的文档中这么说到:

IMPORTANT! You must subscribe to this stream as soon as your app launches,
preferably before returning your main App Widget in main(). Otherwise you
will miss purchase updated made before this stream is subscribed to.
重要!你必须在应用程序启动后立即订阅此流,
最好在main()中返回主应用程序小部件之前。
否则你将错过订阅此流之前更新的购买。

也就是说当我们的App在第一次启动的时候可以订阅此流来完成补单的操作,但是如果用户是之前丢单了,然后把App又卸载了,再次下载打开App后并没有进行登录操作,那用户的登录信息都拿不到怎么进行补单操作呢?

补单解决方案

让后端出一个补单的接口,在补单时只需要传一个订单号即可,那App都删除了,之前的订单号客户端怎么获取呢?使用flutter_keychain来实现,flutter_keychain就是使用的iOS的钥匙串来实现的,当用户在苹果服务器下单时,在钥匙串中保存后端生成的订单号,然后再商品成功发货后删除钥匙串里面的订单号,完成一个完整的购买过程,再购买时任何一环出了问题钥匙串里面缓存的订单号都不会被清空,这样在App下一次启动时,在首页或者main函数中使用_inAppPurchase.purchaseStream 监听,在拿到flutter_keychain中保存的订单号完成补单过程。

注意点

1.在完成苹果服务器付款流程后通知到自己服务器接口也就是验单的接口返回的是成功或者不成功都要调用_inAppPurchase.completePurchase(purchaseDetails)这个方法,不然下次就掉不起苹果支付来了,当然肯定会在失败的判断里面写明白让用户自己去走苹果退款流程的文案(概率较小,但是也得考虑)

2.商品类型如果是非消耗品的话,在下单完之后一定写一个按钮供点击调用复原的方法,要是不复原的话每次下的订单,订单号都是一样的(需要注意下)。

参考:

Flutter插件:
pay 2.0.0 :https://pub.dev/packages/pay
in_app_purchase 3.2.0:https://pub.dev/packages/in_app_purchase

Google pay:
https://developers.google.com/pay/api/android/overview?hl=zh-cn
https://developer.android.com/google/play/billing

Apple pay:
https://developer.apple.com/documentation/passkit_apple_pay_and_wallet/apple_pay/setting_up_apple_pay
https://developer.apple.com/in-app-purchase/

教程:
https://juejin.cn/post/7290009513470623800
https://juejin.cn/post/7020651416276434958
https://blog.csdn.net/mumubumaopao/article/details/136112183
https://juejin.cn/post/7233310081809760317

本文地址:https://www.vps345.com/3420.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge python MCP llama 算法 opencv 自然语言处理 神经网络 语言模型 阿里云 网络 网络安全 网络协议 ubuntu ssh deepseek Ollama 模型联网 API CherryStudio RTSP xop RTP RTSPServer 推流 视频 进程 操作系统 进程控制 Ubuntu numpy harmonyos 华为 开发语言 typescript 计算机网络 flutter 数据库 centos oracle 关系型 安全 分布式 android 鸿蒙 fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 vim ide c++ django flask web3.py jmeter 软件测试 live555 rtsp rtp sqlserver macos adb Hyper-V WinRM TrustedHosts 计算机外设 电脑 mac 软件需求 web安全 Kali Linux 黑客 渗透测试 信息收集 vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 docker 容器 windows 人工智能 产品经理 agi microsoft asm github 创意 社区 cpu 内存 实时 使用 Windsurf Flask FastAPI Waitress Gunicorn uWSGI Uvicorn react.js 前端面试题 node.js 持续部署 ssl java 机器学习 pytorch transformer Dell R750XS 科技 ai 个人开发 物联网 iot YOLO 深度学习 udp unity websocket 笔记 C 环境变量 进程地址空间 uni-app 深度优先 图论 并集查找 换根法 树上倍增 ollama llm php ffmpeg 音视频 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 spring boot 后端 tomcat pycharm vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 pip conda AI Agent jenkins rust http 前端框架 目标检测 计算机视觉 LDAP HCIE 数通 maven intellij idea 智能路由器 外网访问 内网穿透 端口映射 nginx 监控 自动化运维 tcp/ip 运维开发 json html5 firefox golang 面试 性能优化 jdk intellij-idea 架构 WSL win11 无法解析服务器的名称或地址 微服务 springcloud GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 嵌入式 linux驱动开发 arm开发 嵌入式硬件 mysql c语言 redis 云原生 pyqt java-ee WebRTC gpt 低代码 vscode ux 多线程 kubernetes 学习方法 经验分享 程序人生 protobuf 序列化和反序列化 安装 腾讯云大模型知识引擎 Deepseek 华为od OD机试真题 华为OD机试真题 服务器能耗统计 指令 开源 curl wget DeepSeek 服务器繁忙 oceanbase 传统数据库升级 银行 webrtc 服务器数据恢复 数据恢复 存储数据恢复 北亚数据恢复 oracle数据恢复 chatgpt AIGC oneapi 强制清理 强制删除 mac废纸篓 DeepSeek-R1 API接口 mongodb devops springboot 设置代理 实用教程 pdf 多线程服务器 Linux网络编程 android studio 1024程序员节 springsecurity6 oauth2 授权服务器 token sas FTP 服务器 visualstudio prometheus list 数据结构 YOLOv12 自动化 k8s zabbix raid5数据恢复 磁盘阵列数据恢复 Trae IDE AI 原生集成开发环境 Trae AI 3d fpga开发 测试工具 编辑器 鸿蒙系统 minicom 串口调试工具 DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 apache Kylin-Server 国产操作系统 服务器安装 stm32 单片机 qt EasyConnect Cline ecmascript nextjs react reactjs https 流式接口 交互 openwrt GCC crosstool-ng bash 系统开发 binder 车载系统 framework 源码环境 hadoop mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 Google pay Apple pay wsl2 wsl 搜索引擎 ssrf 失效的访问控制 代码调试 ipdb 源码剖析 rtsp实现步骤 流媒体开发 gpu算力 微信 微信分享 Image wxopensdk c# virtualenv NPS 雨云服务器 雨云 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 能力提升 面试宝典 技术 IT信息化 环境迁移 直播推流 es jvm LLM 大模型面经 大模型 职场和发展 大模型学习 jar tcpdump 相差8小时 UTC 时间 Java kvm 无桌面 命令行 串口服务器 git gitea 媒体 微信公众平台 excel word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 C语言 svn 状态管理的 UDP 服务器 Arduino RTOS ci/cd 负载均衡 跨域 matlab 学习 gitee bootstrap html web Socket YOLOv8 NPU Atlas800 A300I pro asi_bench jupyter ollama下载加速 mybatis 宕机切换 服务器宕机 VR手套 数据手套 动捕手套 动捕数据手套 WSL2 虚拟机 VMware 统信UOS 麒麟 bonding 链路聚合 压力测试 ecm bpm HarmonyOS Next av1 电视盒子 机顶盒ROM 魔百盒刷机 ddos 数学建模 stm32项目 k8s集群资源管理 云原生开发 向日葵 idm 命名管道 客户端与服务端通信 express 远程桌面 ansible playbook iDRAC R720xd freebsd 蓝耘科技 元生代平台工作流 ComfyUI debian PVE zotero WebDAV 同步失败 代理模式 硬件架构 系统架构 safari Mac 系统 ArcTS 登录 ArcUI GridItem IIS .net core Hosting Bundle .NET Framework vs2022 XFS xfs文件系统损坏 I_O error rabbitmq 测试用例 功能测试 AI编程 部署 服务器配置 华为云 wireshark 显示过滤器 ICMP Wireshark安装 dell服务器 go Samba NAS 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 剧本 集成学习 集成测试 生物信息学 openEuler AI大模型 minio sql KingBase pygame 小游戏 五子棋 elasticsearch DevEco Studio jetty undertow UOS 统信操作系统 yum rc.local 开机自启 systemd kylin RAID RAID技术 磁盘 存储 智能手机 Termux Linux Qwen2.5-coder 离线部署 dify threejs 3D 软件工程 llama3 Chatglm 开源大模型 音乐服务器 Navidrome 音流 ping++ 爬虫 数据集 Dify ruoyi 混合开发 环境安装 JDK DeepSeek行业应用 Heroku 网站部署 postgresql 僵尸进程 ESXi Dell HPE 联想 浪潮 postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 ESP32 VMware安装Ubuntu Ubuntu安装k8s mysql离线安装 ubuntu22.04 mysql8.0 nuxt3 实时音视频 centos-root /dev/mapper yum clean all df -h / du -sh asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 IIS服务器 IIS性能 日志监控 next.js 部署next.js 温湿度数据上传到服务器 Arduino HTTP 基础入门 编程 银河麒麟服务器操作系统 系统激活 缓存 企业微信 Linux24.04 deepin 博客 数据库系统 unix gitlab 漏洞 .net 安全威胁分析 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 vscode 1.86 Ubuntu Server Ubuntu 22.04.5 Reactor 设计模式 C++ spring 豆瓣 追剧助手 迅雷 nas eNSP 网络规划 VLAN 企业网络 unity3d 银河麒麟 kylin v10 麒麟 v10 linux环境变量 网络穿透 云服务器 Nuxt.js SSH Xterminal CPU 主板 电源 网卡 多进程 远程 命令 执行 sshpass 操作 okhttp CORS k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 spring cloud 远程工作 firewalld Docker Compose docker compose docker-compose 虚拟化 半虚拟化 硬件虚拟化 Hypervisor 大模型微调 腾讯云 code-server MQTT mosquitto 消息队列 .netcore 微信小程序 TRAE sqlite dubbo gateway Clion Nova ResharperC++引擎 Centos7 远程开发 大数据 大数据平台 echarts 信息可视化 数据分析 网页设计 pillow 文件系统 路径解析 shell kamailio sip VoIP AI代码编辑器 W5500 OLED u8g2 TCP服务器 统信 虚拟机安装 cuda cudnn anaconda RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 saltstack DeepSeek r1 Open WebUI cd 目录切换 边缘计算 rocketmq 其他 RustDesk自建服务器 rustdesk服务器 docker rustdesk 机器人 visual studio code CH340 串口驱动 CH341 uart 485 宝塔 超融合 mcu ftp 深度求索 私域 知识库 Linux环境 VPS DNS 孤岛惊魂4 uniapp vue 恒源云 tcp 进程信号 鲲鹏 昇腾 npu vscode1.86 1.86版本 ssh远程连接 frp CLion 远程连接 医疗APP开发 app开发 open Euler dde RTMP 应用层 LLM Web APP Streamlit eclipse big data 图像处理 ui 模拟器 教程 arm opensearch helm 游戏引擎 飞书 游戏服务器 TrinityCore 魔兽世界 sysctl.conf vm.nr_hugepages adobe 大语言模型 LLMs 游戏程序 ios 单一职责原则 kafka Linux的基础指令 Python 网络编程 聊天服务器 套接字 TCP 客户端 自动驾驶 IPMITOOL BMC 硬件管理 opcua opcda KEPServer安装 报错 open webui 系统安全 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 Ark-TS语言 spark HistoryServer Spark YARN jobhistory Headless Linux linux安装配置 XCC Lenovo asp.net大文件上传下载 kali 共享文件夹 课程设计 群晖 文件分享 中间件 iis VSCode 繁忙 解决办法 替代网站 汇总推荐 AI推理 移动云 CDN 云服务 可信计算技术 密码学 xml JAVA dba linux 命令 sed 命令 EMUI 回退 降级 升级 银河麒麟操作系统 国产化 权限 zookeeper nfs npm 服务器部署ai模型 自动化任务管理 SSL 域名 skynet rsyslog Anolis nginx安装 linux插件下载 虚拟显示器 远程控制 NFS prompt easyui langchain cmos 硬件 ruby 安全架构 embedding ragflow 僵尸世界大战 游戏服务器搭建 单元测试 selenium 重启 排查 系统重启 日志 原因 飞牛nas fnos r语言 aws 驱动开发 硬件工程 嵌入式实习 VMware安装mocOS macOS系统安装 灵办AI yum源切换 更换国内yum源 链表 阿里云ECS v10 镜像源 软件 IO模型 LORA NLP n8n 工作流 workflow 多个客户端访问 IO多路复用 回显服务器 TCP相关API 网络工程师 华为认证 黑客技术 图形化界面 URL eureka gcc 本地部署 api 架构与原理 tensorflow MI300x trae 数据挖掘 数据可视化 ip命令 新增网卡 新增IP 启动网卡 SSE docker命令大全 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 5G 3GPP 卫星通信 网工 压测 ECS DocFlow 服务器主板 AI芯片 信息与通信 xrdp 单例模式 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap Unity Dedicated Server Host Client 无头主机 开发环境 SSL证书 selete 高级IO 多层架构 解耦 elk 网络攻击模型 Linux PID LInux vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 崖山数据库 YashanDB VMware创建虚拟机 视频编解码 分析解读 监控k8s 监控kubernetes Ubuntu 24.04.1 轻量级服务器 redhat tidb GLIBC 线程 自动化测试 性能测试 odoo 服务器动作 Server action 视觉检测 Docker Hub docker pull daemon.json 常用命令 文本命令 目录命令 远程看看 远程协助 rpc 远程过程调用 Windows环境 Claude AnythingLLM AnythingLLM安装 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 毕设 midjourney AI写作 WebUI DeepSeek V3 netty 宠物 毕业设计 免费学习 宠物领养 宠物平台 cnn DenseNet risc-v 小艺 Pura X GPU CrewAI qemu libvirt 佛山戴尔服务器维修 佛山三水服务器维修 ipython 蓝桥杯 bug 策略模式 wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 三级等保 服务器审计日志备份 efficientVIT YOLOv8替换主干网络 TOLOv8 FTP服务器 MacMini 迷你主机 mini Apple 联想开天P90Z装win10 can 线程池 Invalid Host allowedHosts 计算机 干货分享 黑客工具 密码爆破 软考 并查集 leetcode gradle css C# MQTTS 双向认证 emqx linux上传下载 camera Arduino 电子信息 飞牛 IDEA USB网络共享 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 监控k8s集群 集群内prometheus 执法记录仪 智能安全帽 smarteye tailscale derp derper 中转 triton 模型分析 无人机 矩阵 线性代数 电商平台 Redis Desktop C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 Minecraft DOIT 四博智联 ssh漏洞 ssh9.9p2 CVE-2025-23419 网络结构图 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 vmware 卡死 SSH 服务 SSH Server OpenSSH Server 7z cursor lua 自动化编程 MCP server C/S 软件构建 windows日志 输入法 matplotlib keepalived etl thingsboard ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 宝塔面板 H3C fd 文件描述符 音乐库 ros2 moveit 机器人运动 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 arkUI 历史版本 下载 服务网格 istio 磁盘监控 kind chrome devtools chromedriver 前后端分离 xcode 交换机 telnet 远程登录 uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 nvidia FunASR ASR perf file server http server web server hive DBeaver 数据仓库 kerberos X11 Xming 网络用户购物行为分析可视化平台 大数据毕业设计 Cursor rdp 实验 mariadb 王者荣耀 Wi-Fi Spring Security 技术共享 openstack Xen KVM 语法 c/c++ 串口 ISO镜像作为本地源 黑苹果 模拟实现 云电竞 云电脑 todesk 支付 微信支付 开放平台 sdkman 设备 PCI-Express Logstash 日志采集 阻塞队列 生产者消费者模型 服务器崩坏原因 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 SysBench 基准测试 c Erlang OTP gen_server 热代码交换 事务语义 技能大赛 MNN Qwen ROS ip 代码托管服务 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 alias unalias 别名 SWAT 配置文件 服务管理 网络共享 源码 实时互动 gaussdb 银河麒麟桌面操作系统 Kylin OS xss regedit 开机启动 程序员 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 政务 分布式系统 监控运维 Prometheus Grafana 游戏机 pppoe radius hugo 版本 Netty 即时通信 NIO micropython esp32 mqtt AI agent Hive环境搭建 hive3环境 Hive远程模式 思科模拟器 思科 Cisco 交叉编译 gpt-3 文心一言 vasp安装 匿名管道 AI作画 QQ 聊天室 京东云 大模型应用 ocr GoogLeNet 算力 IPv4 子网掩码 公网IP 私有IP 服务器管理 配置教程 网站管理 etcd 数据安全 RBAC Radius googlecloud 互信 qt项目 qt项目实战 qt教程 muduo 金融 seatunnel flash-attention 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP VS Code windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 根服务器 clickhouse docker run 数据卷挂载 交互模式 社交电子 工业4.0 epoll 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 EMQX 通信协议 hibernate 弹性计算 计算虚拟化 弹性裸金属 junit 安防软件 移动魔百盒 chfs ubuntu 16.04 USB转串口 飞牛NAS 飞牛OS MacBook Pro 键盘 显示管理器 lightdm gdm 双系统 GRUB引导 Linux技巧 小智AI服务端 xiaozhi TTS 同步 备份 建站 AD 域管理 网站搭建 serv00 laravel grafana 直流充电桩 充电桩 微信开放平台 微信公众号配置 IPMI 需求分析 规格说明书 裸金属服务器 弹性裸金属服务器 p2p 火绒安全 dns 大模型入门 HTTP 服务器控制 ESP32 DeepSeek 备选 网站 调用 示例 AD域 vSphere vCenter 软件定义数据中心 sddc 反向代理 致远OA OA服务器 服务器磁盘扩容 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 我的世界服务器搭建 minecraft 自学笔记 小米 澎湃OS Android iftop 网络流量监控 make命令 makefile文件 查询数据库服务IP地址 SQL Server AutoDL iphone 安卓 Playwright MS Materials pgpool openssl 业界资讯 端口测试 模拟退火算法 g++ g++13 nac 802.1 portal Cookie 田俊楠 ArkTs ArkUI 目标跟踪 OpenVINO 推理应用 银河麒麟高级服务器 外接硬盘 Kylin flink 开机自启动 华为机试 outlook AISphereButler Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer 自定义客户端 SAS ue4 着色器 ue5 虚幻 ukui 麒麟kylinos openeuler rust腐蚀 框架搭建 mamba Vmamba bot Docker yaml Ultralytics 可视化 UDP的API使用 Jellyfin Java Applet URL操作 服务器建立 Socket编程 网络文件读取 MacOS录屏软件 armbian u-boot 大模型教程 ceph remote-ssh CentOS rustdesk OpenManus 抓包工具 项目部署到linux服务器 项目部署过程 CVE-2024-7347 jina x64 SIGSEGV xmm0 web3 miniapp 真机调试 调试 debug 断点 网络API请求调试方法 apt 国内源 autodl docker desktop image bcompare Beyond Compare webstorm 网络建设与运维 su sudo IMM xpath定位元素 composer bat 智能音箱 智能家居 开发 python3.11 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 嵌入式Linux IPC 强化学习 word 相机 中兴光猫 换光猫 网络桥接 自己换光猫 IM即时通讯 剪切板对通 HTML FORMAT 多端开发 智慧分发 应用生态 鸿蒙OS nlp GIS 遥感 WebGIS log4j ubuntu24.04.1 大大通 第三代半导体 碳化硅 Windows ai工具 java-rocketmq ros ldap Ubuntu共享文件夹 共享目录 Linux共享文件夹 Xinference RAGFlow vr edge浏览器 内网环境 h.264 元服务 应用上架 换源 Debian fast mq ubuntu24 vivado24 fstab less 免费域名 域名解析 网卡的名称修改 eth0 ens33 kotlin cpp-httplib SRS 流媒体 直播 perl 防火墙 NAT转发 NAT Server Deepseek-R1 私有化部署 推理模型 李心怡 本地部署AI大模型 deekseek IMX317 MIPI H265 VCU Linux的权限 ShenTong db dash 正则表达式 nvm whistle Python基础 Python教程 Python技巧 WLAN react native css3 idea 信创 信创终端 中科方德 sentinel 知识图谱 sqlite3 软链接 硬链接 信号 rime WebVM swoole 基础环境 流水线 脚本式流水线 加解密 Yakit yaklang HarmonyOS 我的世界 我的世界联机 数码 程序员创富 信号处理 问题解决 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 KylinV10 麒麟操作系统 Vmware ssh远程登录 服务器时间 流量运营 浏览器开发 AI浏览器 aarch64 编译安装 HPC 程序 性能分析 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 iBMC UltraISO rclone AList webdav fnOS 企业网络规划 华为eNSP 烟花代码 烟花 元旦 树莓派 VNC 性能调优 安全代理 sonoma 自动更新 lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 xshell termius iterm2 软件卸载 系统清理 neo4j 数据库开发 database 域名服务 DHCP 符号链接 配置 glibc iventoy VmWare OpenEuler 磁盘清理 powerpoint dity make Unity插件 实战案例 searxng PPI String Cytoscape CytoHubba 合成模型 扩散模型 图像生成 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 序列化反序列化 uv 人工智能生成内容 镜像 个人博客 抗锯齿 拓扑图 OpenHarmony 产测工具框架 IMX6ULL 管理框架 ubuntu20.04 ros1 Noetic 20.04 apt 安装 鸿蒙开发 移动开发 firewall AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 UDP top Linux top top命令详解 top命令重点 top常用参数 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK cfssl TCP协议 P2P HDLC Typore 游戏开发 用户缓冲区 milvus QT 5.12.12 QT开发环境 Ubuntu18.04 带外管理 sequoiaDB PX4 deep learning 捆绑 链接 谷歌浏览器 youtube google gmail 影刀 #影刀RPA# grub 版本升级 扩容 图形渲染 MVS 海康威视相机 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 prometheus数据采集 prometheus数据模型 prometheus特点 cocoapods 大模型推理 聚类 SenseVoice 实习 yolov8 figma llama.cpp 虚拟局域网 dns是什么 如何设置电脑dns dns应该如何设置 Kali 渗透 win服务器架设 windows server 迁移指南 proxy模式 OpenSSH webgl 分布式训练 考研 onlyoffice 在线office 金仓数据库 2025 征文 数据库平替用金仓 显卡驱动 容器技术 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 SVN Server tortoise svn 私有化 状态模式 SSH 密钥生成 SSH 公钥 私钥 生成 主从复制 玩机技巧 软件分享 软件图标 Ubuntu22.04 开发人员主页 trea MySql UOS1070e 物联网开发 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 iperf3 带宽测试 wps HAProxy seleium 代码 对比 工具 meld DiffMerge SEO hexo harmonyOS面试题 docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos 邮件APP 免费软件 本地知识库部署 DeepSeek R1 模型 环境配置 lio-sam SLAM 代理服务器 内网服务器 内网代理 内网通信 软负载 AI-native Docker Desktop HiCar CarLife+ CarPlay QT RK3588 云桌面 微软 AD域控 证书服务器 Node-Red 编程工具 流编程 毕昇JDK deepseek r1 端口 查看 ss deployment daemonset statefulset cronjob 粘包问题 vpn 读写锁 语音识别 AI Agent 字节智能运维 办公自动化 自动化生成 pdf教程 远程服务 rnn 健康医疗 互联网医院 MacOS arcgis wpf EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 查看显卡进程 fuser ArtTS pyautogui wsgiref Web 服务器网关接口 rag ragflow 源码启动 运维监控 navicat Mac内存不够用怎么办 ABAP 代理 MQTT协议 消息服务器 TrueLicense Attention Linux find grep 钉钉 做raid 装系统 存储维护 NetApp存储 EMC存储 ardunio BLE System V共享内存 进程通信 西门子PLC 通讯 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 云耀服务器 接口优化 k8s二次开发 gnu hosts 极限编程 HarmonyOS NEXT 原生鸿蒙 数字证书 签署证书 解决方案 智能电视 vllm docker部署Python CentOS Stream 搭建个人相关服务器 风扇控制软件 yum换源 开机黑屏 AI员工 热榜 macOS 网络爬虫 服务器正确解析请求体 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR 沙盒 MDK 嵌入式开发工具 论文笔记 sublime text 离线部署dify 虚幻引擎 virtualbox 欧标 OCPP Sealos 论文阅读 嵌入式系统开发 nosql 推荐算法 js 网络搭建 神州数码 神州数码云平台 云平台 IO MobaXterm 搜狗输入法 中文输入法 Qwen2.5-VL 项目部署 dock 加速 本地化部署 yolov5 kernel ranger MySQL8.0 达梦 DM8 visual studio 多路转接 conda配置 conda镜像源 稳定性 看门狗 大模型部署 rpa 端口聚合 windows11