About Apple Pay

本文翻译整理自:About Apple Pay (更新时间:2017-03-16)
https://developer.apple.com/library/archive/ApplePay_Guide/index.html#//apple_ref/doc/uid/TP40014764


文章目录

    • 一、关于 Apple Pay
      • 1、使用 Apple Pay
      • 2、测试 Apple Pay 交易
    • 二、配置您的环境
    • 三、创建付款请求
      • 1、决定用户是否可以付款
      • 2、从基于 Web 的界面进行桥接
      • 3、付款请求包括货币和地区信息
      • 4、付款请求包含付款摘要项目列表
      • 5、Shipping 方式是特殊的付款摘要项目
      • 6、表明您支持的付款处理机制
      • 7、说明需要哪些运输和账单信息
      • 8、存储其他信息
    • 四、授权付款
      • 您的代理更新运输方式和费用
      • 当付款获得授权时,将创建付款令牌
      • 您的代理解散了付款授权视图控制器
    • 五、处理付款


一、关于 Apple Pay

Apple Pay 是一种移动支付技术,它为用户提供了一种简单而安全的方式,让他们可以在 iOS 应用、watchOS 应用和 Safari 网站上为现实世界的商品和服务付款。
本编程指南讨论了 iOS 应用中的 Apple Pay。

对于 web 上的 Apple Pay,请参阅Apple Pay JS。

对于应用内提供的数字商品和服务,请参阅*应用内购买编程指南*。

在这里插入图片描述


1、使用 Apple Pay

使用 Apple Pay 的应用需要在 Xcode 中启用 Apple Pay 功能。
您还需要注册商家 ID 并创建付款处理证书(Payment Processing certificate),这是一个加密密钥,用于安全地将付款数据发送到您的服务器。

要发起付款,您的应用会创建一个付款请求。
此请求包括所购买服务和商品的小计,以及任何额外的税费、运费或折扣费用。
将此请求传递给付款授权视图控制器,该视图控制器向用户显示该请求并提示输入任何所需信息,例如送货地址或帐单地址。
当用户与视图控制器交互时,您的代理会被调用来更新请求。

用户授权付款后,Apple Pay 会立即加密付款信息,以防止未经授权的第三方访问这些信息。
在设备上,Apple Pay 将付款请求发送到安全元件,这是用户设备上的专用芯片。
安全元件会添加指定卡和商家的付款数据,从而创建加密的付款令牌。
然后,它会将此令牌传递到 Apple 的服务器,在那里使用您的付款处理证书对其进行重新加密。
最后,服务器将令牌传回您的应用进行处理。

Apple 的服务器绝不会访问或存储付款令牌。
服务器只会使用您的证书重新加密令牌。
此过程可让您的应用安全地加密付款信息,而无需在应用中分发您的付款处理证书。

有关 Apple Pay 安全性的更多信息,请参阅iOS 安全指南。

在大多数情况下,您的应用会将加密的付款令牌传递给第三方支付解决方案提供商,以解密和处理付款。
但是,如果您的团队有现有的支付基础设施,您可以在自己的服务器上解密和处理付款。

有关支持 Apple Pay 的支付解决方案提供商的信息,请参阅Apple Pay - Apple Developer。


2、测试 Apple Pay 交易

使用 Apple Pay 沙盒环境通过测试支付卡测试您的交易。

  1. 在 App Store Connect 中创建一个测试账户。
    此账户可用于 App Store 和 Apple Pay 测试。
  2. 在有效的测试设备上,使用测试帐户登录 iCloud。
  3. 在 Wallet 应用中,使用手动输入添加新卡。

登录和退出 iCloud 帐户会移除您的卡。
测试卡只能在沙盒环境中使用。
此外,沙盒环境仅测试您的应用与测试卡网络之间的连接。
它不会测试您的应用与支付解决方案提供商之间的连接。

有关更多信息,请参阅Apple Pay 沙盒测试。


二、配置您的环境

商家 ID 可向 Apple Pay 证明您能够接受付款。
与您的商家 ID 关联的付款处理证书用于加密付款信息。
在您的应用可以使用 Apple Pay 之前,您需要注册商家 ID 并创建其付款处理证书。

注册商户 ID

  1. 在会员中心,选择“Certificates, Identifiers & Profiles.”。
  2. 在标识符下,选择商家 ID。
  3. 单击右上角的添加按钮 (+)。
  4. 输入描述和标识符,然后单击继续。
  5. 检查设置,然后单击“注册”。
  6. 单击完成。

创建付款处理证书

  1. 在会员中心,选择“Certificates, Identifiers & Profiles.”。
  2. 在标识符下,选择商家 ID。
  3. 从列表中选择商家 ID,然后单击编辑。
  4. 在付款处理证书部分,单击创建证书。
    按照说明获取或生成证书签名请求 (CSR),然后单击继续。
  5. 单击“选择文件”,选择您的 CSR,然后单击“生成”。
  6. 单击“下载”下载证书,然后单击“完成”。

如果您在 Keychain Access 中看到警告,提示证书由未知机构签名或颁发者无效,请确保您在钥匙串中安装了 WWDR intermediate 证书 - G2 和 Apple Root CA - G2。
您可以从apple.com/certificateauthority 下载它们。

要在 Xcode 中为您的应用启用 Apple Pay,请打开“功能”窗格。
选择 Apple Pay 行中的开关,然后选择您希望应用使用的商家 ID。

在这里插入图片描述


笔记
进行故障排除时,手动启用 Apple Pay 有时很有帮助。请按照以下步骤手动启用 Apple Pay:

  1. 在会员中心,选择“ Certificates, Identifiers & Profiles”。
  2. 在“标识符”下,选择“应用程序 ID”。
  3. 从列表中选择应用程序 ID,然后单击“编辑”。
  4. 选择 Apple Pay,然后单击“编辑”。
  5. 选择您要使用的商家ID,然后单击继续。
  6. 检查设置,然后单击“分配”。
  7. 单击完成。

三、创建付款请求

付款请求是PKPaymentRequest类的实例。
付款请求包含一系列摘要项,这些摘要项向用户描述要付款的内容、可用的送货方式列表、用户需要提供的送货信息的描述以及有关商家和付款处理商的信息。


1、决定用户是否可以付款

在创建付款请求之前,请通过调用PKPaymentAuthorizationViewController类的canMakePaymentsUsingNetworks:方法 确定用户是否能够使用您支持的网络进行付款。
要检查此设备的硬件和家长控制是否支持 Apple Pay,请使用canMakePayments方法。


笔记

PKPaymentAuthorizationController 类执行与PKPaymentAuthorizationViewController类相同的角色,但它不依赖于 UIKit 框架。
这意味着授权控制器可以在视图控制器无法使用的地方使用(例如,在 watchOS 应用程序中或在 Intents 扩展中)。

如果canMakePayments返回NO,则表示设备不支持 Apple Pay。
不显示 Apple Pay 按钮。而是转而使用其他付款方式。

如果canMakePayments返回YEScanMakePaymentsUsingNetworks:返回NO,则表示设备支持 Apple Pay,但用户尚未为任何请求的网络添加卡。
您可以选择显示付款设置按钮,提示用户设置他们的卡。
一旦用户点击此按钮,就会启动设置新卡的过程(例如,通过调用方法openPaymentSetup)。

否则,一旦用户按下 Apple Pay 按钮,您就必须开始付款授权流程。
在显示付款请求之前,不要要求用户执行任何其他任务。
例如,如果用户需要输入折扣代码,您必须在他们按下 Apple Pay 按钮之前要求输入该代码。

要在 iOS 8.3 或更高版本上创建用于发起付款请求的 Apple Pay 品牌按钮,请使用PKPaymentButton类。
有关使用 Apple Pay 按钮和付款标记的更多指南,请参阅iOS 人机界面指南 中的 Apple Pay。


2、从基于 Web 的界面进行桥接

如果您的应用使用基于 Web 的界面购买商品和服务,则您必须先将请求从 Web 界面移至原生 iOS 代码,然后再处理 Apple Pay 交易。
例 3-1显示了处理来自 Web 视图的请求所需的步骤。

例 3-1从网页视图购买物品

// Called when the web view tries to load "myShoppingApp:buyItem"
-(void)webView:(nonnull WKWebView *)webView
decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction
decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler {// Get the URL for the selected link.NSURL *URL = navigationAction.request.URL;// If the scheme and resource specifier match those defined by your app,// handle the payment in native iOS code.if ([URL.scheme isEqualToString:@"myShoppingApp"] &&[URL.resourceSpecifier isEqualToString:@"buyItem"]) {// Create and present the payment request here.// The web view ignores the link.decisionHandler(WKNavigationActionPolicyCancel);}// Otherwise the web view loads the link.decisionHandler(WKNavigationActionPolicyAllow);
}

3、付款请求包括货币和地区信息

付款请求中的所有汇总金额都使用相同的货币,该货币使用PKPaymentRequestcurrencyCode 属性指定。
请使用三字符 ISO 货币代码,例如USD

付款请求的国家代码表示购买发生地或购买处理地。
请使用两个字符的 ISO 国家代码,例如US

您在付款请求中设置的商家 ID 必须与您应用权利中的某个商家 ID 相匹配。

request.currencyCode = @"USD";
request.countryCode = @"US";
request.merchantIdentifier = @"merchant.com.example";

4、付款请求包含付款摘要项目列表

付款摘要项(由PKPaymentSummaryItem类表示)向用户描述付款请求的不同部分。
使用少量摘要项 - 通常是小计、任何折扣、运费、税费和总计。
如果您没有任何额外费用(例如运费或税费),则只需使用购买总额。
在应用的其他地方提供每件商品费用的详细信息。

每个汇总项都有一个标签和一个金额,如例 3-2 所示。
标签是项目汇总内容的用户可读描述。
金额是相应的付款金额。
付款请求中的所有金额都使用付款请求中指定的货币。
对于折扣或优惠券,请将金额设置为负数。

例 3-2 创建付款摘要项

// 12.75 subtotal
NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275 exponent:-2 isNegative:NO];
self.subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"Subtotal" amount:subtotalAmount];// 2.00 discount
NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithMantissa:200 exponent:-2 isNegative:YES];
self.discount = [PKPaymentSummaryItem summaryItemWithLabel:@"Discount" amount:discountAmount];

笔记
付款摘要项使用 NSDecimalNumber类 将金额存储为十进制数量。
可以通过明确指定尾数和指数(如代码例所示)或通过提供字符串数量并指定语言环境来创建此类的实例。
始终使用十进制数字进行财务计算 - 例如,确定 5% 折扣的金额。

尽管看起来更方便,但 IEEE 浮点数据类型(例如float和 )Double并不适合财务计算。
这些数据类型使用以 2 为基数的数字表示,这意味着某些十进制数无法准确表示 - 例如,0.42 必须近似为 0.41999 循环。
这种近似值可能会导致财务计算返回不正确的结果。


列表中的最后一个付款摘要项是总计。
通过将所有其他摘要项的金额相加来计算总计金额。
总计的显示方式与其他摘要项不同:使用您公司的名称作为其标签,并使用所有其他摘要项金额的总和作为其金额。
使用属性将付款摘要项添加到付款请求中paymentSummaryItems

如果您不知道授权付款时的实际费用(例如出租车费),请使用PKPaymentSummaryItemTypePending类型 和0.0金额制作小计汇总项。
对于总计,请使用正非零金额和PKPaymentSummaryItemTypePending类型。
然后系统会将费用显示为待处理,不显示数字金额。

笔记:总计不能为零或负值。

// 10.75 grand total
NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];
totalAmount = [totalAmount decimalNumberByAdding:discountAmount];
self.total = [PKPaymentSummaryItem summaryItemWithLabel:@"My Company Name" amount:totalAmount];self.summaryItems = @[self.subtotal, self.discount, self.total];
request.paymentSummaryItems = self.summaryItems;

5、Shipping 方式是特殊的付款摘要项目

为每种可用的送货方式创建一个PKShippingMethod实例。
与其他付款摘要项一样,送货方式也有一个用户可读的标签,例如“标准送货”或“次日送货”,以及一个运费金额。
与其他摘要项不同的是,送货方式还具有一个detail属性,例如“7 月 29 日前送达”或“24 小时内发货”,用于说明送货方式之间的差异。

要在代理方法中区分送货方式,请使用identifier属性。
此属性仅由您的应用使用 - 框架将其视为不透明值,并且不会显示在 UI 中。
在创建送货方式时,请为其分配一个唯一标识符。
为便于调试,请使用简短或缩写的字符串,例如“discount”、“standard”或“next-day”。

有些送货方式并非在所有地区都可用,或者不同地址的费用也不同。
您可以在用户选择送货地址或送货方式时更新此信息,如Your Delegate Updates Shipping Methods and Costs 中所述。


6、表明您支持的付款处理机制

通过使用字符串常量数组 填充supportedNetworks属性来指示您支持哪些支付网络。
通过设置merchantCapabilities属性的值,来指示您支持哪些支付处理协议。
您必须支持 3DS;仅当您在中国支持 Apple Pay 时才指定 EMV。

商家功能是位掩码,组合如下:

request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkDiscover, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];// Supports 3DS only
request.merchantCapabilities = PKMerchantCapability3DS;// Supports both 3DS and EMV (add EMV only if you support Apple Pay in China)
request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV;

7、说明需要哪些运输和账单信息

填充付款授权视图控制器的requiredBillingAddressFieldsrequiredShippingAddressFields属性,以指示需要哪些帐单和送货信息。
当您显示此视图控制器时,它会提示用户提供所请求的帐单和送货信息。
字段常量组合如下,以设置这些属性的值:

request.requiredBillingAddressFields = PKAddressFieldEmail;
request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;

笔记

仅请求处理付款和交付产品或服务所需的账单和送货信息。
请求不必要的信息会增加交易的复杂性。
每增加一个步骤,用户取消付款的可能性就会增加。


如果您有最新的账单和送货联系信息,您可以在付款请求中设置这些信息。
Apple Pay 默认使用此信息;但是,用户仍然可以在付款授权过程中选择其他联系信息。

PKContact *contact = [[PKContact alloc] init];NSPersonNameComponents *name = [[NSPersonNameComponents alloc] init];
name.givenName = @"John";
name.familyName = @"Appleseed";contact.name = name;CNMutablePostalAddress *address = [[CNMutablePostalAddress alloc] init];
address.street = @"1234 Laurel Street";
address.city = @"Atlanta";
address.state = @"GA";
address.postalCode = @"30303";contact.postalAddress = address;request.shippingContact = contact;

笔记:在 iOS 中,地址信息可以来自各种来源。使用前请务必验证信息。


8、存储其他信息

要存储特定于您的应用的付款请求信息(例如购物车标识符),请使用applicationData属性。
系统将此属性视为不透明值。
用户授权付款请求后,应用程序数据的哈希值将显示在付款令牌中。


四、授权付款

付款授权流程是付款授权视图控制器与其代理之间的协作。
付款授权视图控制器执行两项操作:它让用户选择付款请求所需的账单和送货信息,并让用户授权进行付款。
当用户与视图控制器交互时,将调用代理方法,以便您的应用可以更新显示的信息 - 例如,在选择送货地址时更新运费。
用户授权付款请求后,也会调用代理。


笔记:当您实现代理方法时,请记住它们可以被调用多次,并且调用的顺序取决于用户操作的顺序。


在授权过程中调用的所有代理方法都会传递一个完成块作为其参数之一。
付款授权视图控制器会等待其代理完成对一个方法的响应(通过调用完成块),然后再调用任何其他代理方法。
paymentAuthorizationViewControllerDidFinish:方法是唯一的例外:它不需要完成块,并且可以随时调用。

完成块接受一个参数,该参数允许您根据可用信息指定事务的当前状态。
如果事务没有问题,则传递值PKPaymentAuthorizationStatusSuccess;否则,传递一个标识问题的值。

要创建PKPaymentAuthorizationViewController类的实例,请将付款请求传递给视图控制器的初始化程序。
为视图控制器设置一个代理,然后呈现它。


笔记

PKPaymentAuthorizationController类执行与PKPaymentAuthorizationViewController 类相同的角色,但它不依赖于 UIKit 框架。
这意味着授权控制器可以在视图控制器无法使用的地方使用(例如,在 watchOS 应用程序中或在 Intents 扩展中)。

要使用PKPaymentAuthorizationController类,请分配一个采用 PKPaymentAuthorizationControllerDelegate 协议的对象作为代理,并调用presentWithCompletion:方法以显示付款表。
完成后,调用dismissWithCompletion:方法以关闭付款表。
否则,API 是相同的。

PKPaymentAuthorizationViewController *viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
if (!viewController) { /* ... Handle error ... */ }
viewController.delegate = self;
[self presentViewController:viewController animated:YES completion:nil];

当用户与视图控制器交互时,视图控制器会调用其代理方法。


笔记

在 Xcode 7.0 或更高版本中,您可以在模拟器中测试付款授权视图控制器。
它为所有受支持的付款网络提供模拟卡,并以纯文本形式返回虚拟付款数据。
在设备上,此数据使用您的商家标识符加密,必须在您的服务器上或由您的付款处理器解密。

使用 Apple Pay 沙盒环境在带有测试卡的设备上测试您的应用。

尽管这些技术提供了快速、便捷的方法来测试您的代码,但您仍然需要在实际的物理设备上使用生产卡彻底测试 Apple Pay。


您的代理更新运输方式和费用

当用户提供送货信息时,授权视图控制器会调用您的代理paymentAuthorizationViewController:didSelectShippingContact:completion:paymentAuthorizationViewController:didSelectShippingMethod:completion: 方法。
使用这些方法根据新信息更新付款请求。

- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controllerdidSelectShippingContact:(CNContact *)contactcompletion:(void (^)(PKPaymentAuthorizationStatus, NSArray *, NSArray *))completion
{self.selectedContact = contact;[self updateShippingCost];NSArray *shippingMethods = [self shippingMethodsForContact:contact];completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, self.summaryItems);
}- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controllerdidSelectShippingMethod:(PKShippingMethod *)shippingMethodcompletion:(void (^)(PKPaymentAuthorizationStatus, NSArray *))completion
{self.selectedShippingMethod = shippingMethod;[self updateShippingCost];completion(PKPaymentAuthorizationStatusSuccess, self.summaryItems);
}

笔记

为了保护隐私,paymentAuthorizationViewController:didSelectShippingContact:completion: 中提供的送货信息是匿名的。
返回的联系人包含足够的信息来计算运费,而不会泄露有关用户的敏感信息。
直到用户批准付款后,您才能获得用户的完整送货信息。
此外,联系人中可用的数据因国家/地区而异,并且可能因版本而异。
请务必对您的应用进行适当的测试。


当付款获得授权时,将创建付款令牌

当用户授权付款请求时,框架会与 Apple 的服务器和安全元件协作,创建一个付款令牌。
您可以在paymentAuthorizationViewController:didAuthorizePayment:completion: 代理方法中,将此付款令牌以及处理购买所需的任何其他信息(例如送货地址和购物车标识符)发送到您的服务器。
该过程如下:

  • 框架将支付请求发送到安全元件。
    只有安全元件才能访问标记化的特定设备支付卡号。
  • 安全元件会汇总指定卡和商户的支付数据,对其进行加密,以便只有 Apple 可以读取,然后将其发送给框架。
    框架随后会将支付数据发送给 Apple 的服务器。
  • Apple 的服务器使用您的付款处理证书重新加密付款数据。
    只有您和与您共享付款处理证书的人才能读取该令牌。
    然后,服务器签署付款令牌,并将其返回给设备。
  • 框架通过调用 paymentAuthorizationViewController:didAuthorizePayment:completion:方法将令牌传递给您的代理。
    您的代理将令牌发送到您的服务器。

服务器上的操作取决于您是自行处理付款还是使用付款平台。
在这两种情况下,您的服务器都会处理订单并将状态发送回设备,然后您的代理会将该状态传递给其完成处理程序,如处理付款 中所述。

- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controllerdidAuthorizePayment:(PKPayment *)paymentcompletion:(void (^)(PKPaymentAuthorizationStatus))completion
{NSError *error;ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress, kABPersonAddressProperty);NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];// ... Send payment token, shipping and billing address, and order information to your server ...PKPaymentAuthorizationStatus status;  // From your servercompletion(status);
}

您的代理解散了付款授权视图控制器

框架显示交易状态后,授权视图控制器将调用您的代理的 paymentAuthorizationViewControllerDidFinish:方法。
在您的实现中,关闭授权视图控制器,然后显示您自己的特定于应用程序的订单确认页面。

- (void) paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{[controller dismissViewControllerAnimated:YES completion:nil];
}

五、处理付款

处理付款涉及几个步骤:

  1. 将付款信息以及处理订单所需的其他信息发送到您的服务器
  2. 验证支付数据的哈希值和签名
  3. 解密加密的支付数据
  4. 将支付数据提交至支付处理网络
  5. 将订单提交至订单跟踪系统

您有两种处理付款的方式:您可以利用支付平台来处理付款,也可以自己处理付款。
支付处理平台通常会处理上面列出的大部分步骤。

读取、验证和处理付款信息需要了解加密的几个领域,例如计算 SHA-1 哈希、读取和验证 PKCS #7 签名以及执行椭圆曲线 Diffie-Hellman 密钥交换。
如果您没有加密背景,请考虑使用为您执行这些操作的支付平台。
有关支持 Apple Pay 的支付平台的信息,请参阅 developer.apple.com/apple-pay/ 。

用于处理付款的信息具有嵌套数据结构,如图5-1所示。
付款令牌是该类的一个PKPaymentToken实例。
其属性的值paymentData是一个 JSON 字典,该字典具有用于验证的信息的标头和加密的付款数据。
加密数据包括金额和持卡人姓名等信息以及用于特定付款处理协议的其他信息。


图5-1支付数据结构

在这里插入图片描述


有关支付数据结构格式的详细信息,请参阅*支付令牌格式参考*。


2024-06-14(五)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3整合SpringDoc实现在线接口文档

写在前面 在现目前项目开发中,一般都是前后端分离项目。前端小姐姐负责开发前端,苦逼的我们负责后端开发 事实是一个人全干,在这过程中编写接口文档就显得尤为重要了。然而作为一个程序员,最怕的莫过于自己写文档和别人不写文档…

【数据结构(邓俊辉)学习笔记】二叉搜索树02——查找、插入和删除

文章目录 1.概述2. 查找2.1 查找:算法2.2 查找:理解2.3 查找:实现2.4 查找:语义 3. 插入3.1 插入:算法3.2 插入:实现 4. 删除4.1 删除:框架4.2 删除:单分支4.3 删除:双分…

Pyqt QCustomPlot 简介、安装与实用代码示例(一)

目录 简介安装实用代码示例带有填充的简单衰减正弦函数及其红色的指数包络线具有数据点的 sinc 函数、相应的误差条和 2--sigma 置信带几种散点样式的演示展示 QCustomPlot 在设计绘图方面的多功能性 结语 所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转…

RERCS系统开发实战案例-Part05 FPM Application的Feeder Class搜索组件的实施

1、通过事务码 SE24对Feeder Class实施 1)接口页签的简单说明: ① IF_FPM_GUIBB:通用UI构建块,整个UIBB模块的基础接口; ② IF_FPM_GUIBB_SEARCH:通用搜索UI构建块,搜索组件UIBB的基础接口&…

期末复习GGG-----查找子串

郭的 char *search( char *s, char *t ){int i0;while(s[i]){int j0;if(s[i]t[0]){while(s[ij]t[j]&&t[j]){j;}if(t[j]\0)return si;}i;}return NULL; } AI的 #include <stdio.h> #include <string.h> #define MAXS 30char *search(char *s, char *t);in…

ctfshow web七夕杯

web签到 执行命令没有回显&#xff0c;我们直接写文件就可以了 有字符长度限制 ls />a nl /*>a访问url/api/a下载文件 easy_calc <?phpif(check($code)){eval($result."$code".";");echo($result); }function check(&$code){$num1…

Golang | Leetcode Golang题解之第164题最大间距

题目&#xff1a; 题解&#xff1a; type pair struct{ min, max int }func maximumGap(nums []int) (ans int) {n : len(nums)if n < 2 {return}minVal : min(nums...)maxVal : max(nums...)d : max(1, (maxVal-minVal)/(n-1))bucketSize : (maxVal-minVal)/d 1// 存储 (…

aasist-bladedisc 音频反欺骗算法模型

AASIST 论文 参考ASIST: Audio Anti-Spoofing using Integrated Spectro-Temporal Graph Attention Networks https://arxiv.org/pdf/2110.01200.pdf 模型结构 aasist是一种开源的音频反欺诈的模型&#xff0c;主要的模型结构如下所示&#xff1a; 算法原理 环境配置 Dock…

CVE-2023-38836(文件上传+命令执行)

简介 BoidCMS v.2.0.0 存在文件上传漏洞&#xff0c;远程攻击者可通过添加 GIF 头部绕过 MIME 类型检查&#xff0c;执行任意代码。 过程 打开靶场 对网站进行目录扫描 发现后台&#xff0c;登录弱口令账号密码 admin/password 发现文件上传位置 根据简介提示&#xff0c;…

CentOS 7.9检测硬盘坏区、实物定位(三)

系列文章目录 CentOS 7.9上创建JBOD&#xff08;一&#xff09; CentOS 7.9上创建的JBOD阵列恢复&#xff08;二&#xff09; 文章目录 系列文章目录前言一、在系统中找到硬盘对应的盘符二、使用命令定位实物1.badblocks检测坏块2.对2T以上的硬盘检测&#xff08;对本篇非必要…

我用chatgpt写了一款程序

众所周知&#xff0c;Chatgpt能够帮助人们写代码&#xff0c;前几天苏音试着完全用Chatgpt写一款Python程序 有一句话我很赞同&#xff0c;未来能代替人的不是AI&#xff0c;是会使用AI的人。 最终&#xff0c;写下来效果还不错&#xff0c;完全提升了我的办公效率。 开发前…

0X0-基于Sklearn的机器学习入门:聚类(上)

本节及后续章节将介绍深度学习中的几种聚类算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍几种相对基础的聚类算法&#xff0c;包括K-均值算法和均值漂移算法。 目录 X.1 聚类概述 X.1.1 聚类的种类 X.1.2 Sklearn聚类子模块 …

设计模式1

1、面向对象三大特性&#xff1a;封装、继承、多态 2、什么是接口&#xff1f; 3、面向对象的SOLID五大原则 4、简单工厂模式 5、工厂方法模式

网络安全:数据库安全性

文章目录 网络安全&#xff1a;数据库安全性引言数据库安全性的重要性常见的数据库安全威胁数据库安全性的最佳实践数据加密访问控制审计和监控 结语 网络安全&#xff1a;数据库安全性 引言 在前两篇文章中&#xff0c;我们讨论了SQL注入的概念和防范措施。本篇文章将聚焦于…

又一个SQL Developer中调试存储过程的例子

此例基于OBE&#xff08;Oracle By Example&#xff09;的示例。是在SQL Developer中调试存储过程一文的进阶。复习了前文的一些基本概念&#xff0c;并纠正了官方示例的一个错误。 本文使用的是标准的HR 示例 Schema&#xff0c;调试的存储过程源代码如下&#xff1a; CREAT…

【PB案例学习笔记】-22制作一个语音朗读金额小应用

写在前面 这是PB案例学习笔记系列文章的第22篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

关于在word中使用Axmath的报错的解决

介绍 Axmath是数学公式编辑器软件。官网如下。 AxMath/AxGlyph/AxCells (amyxun.com) 支持正版。 在word中使用Axmath 点击word中的“文件”→“选项”。 选择“加载项” 选择“word加载项” 在Axmath默认的安装目录如下&#xff1a; C:\Program Files (x86)\AxMathhao&am…

【头歌】HBase扫描与过滤答案 解除复制粘贴限制

解除复制粘贴限制 当作者遇到这个限制的时候火气起来了三分&#xff0c;然后去网上搜索答案&#xff0c;然后发现了一位【碳烤小肥肠】居然不贴代码&#xff0c;XX链接&#xff0c;贴截图&#xff0c;瞬时火气冲顶&#xff0c;怒写此文 首先启动万能的控制台&#xff0c;然后C…

5年Android 开发者的社招面经总结(值得你记录收藏)

4. 分别代表什么含义&#xff0c;他们有什么区别&#xff1f; 5. 了解过 Java 的集合吗&#xff1f; 6. 说说 HashMap 的底层实现原理&#xff1f; 7. ArrayList 和 LinkedList 的区别&#xff1f; 8. Java 集合中哪些是线程安全的&#xff1f; 9. JVM 的内存…

中年帕金森:守护健康,从容面对生活挑战

在快节奏的现代生活中&#xff0c;中年人群面临着越来越多的健康挑战。其中&#xff0c;帕金森病作为一种常见的神经系统疾病&#xff0c;逐渐引起了人们的关注。帕金森病不仅影响患者的身体健康&#xff0c;还对其日常生活造成极大的困扰。那么&#xff0c;我们该如何应对中年…