iOS In-App Purchase 内购之问题总结

uniapp苹果内购获取不到苹果的iap支付通道 根据uniapp文档介绍获取苹果的iap支付通道,开始时未获取到appleiap,此时需要进行下列操作 plus.payment.getChannels( channels => { this.provider = channels; for (let i in channels) { var channel = channels[i]; console.log(channels); if (channel.id === 'appleiap') { 阅读详情

1、内购流程

  • 1、在 AppStore 中创建相应的物品,创建内购沙盒测试账号
  • 2、客户端从后台获取相应的物品 ID (当然也可以再客户端写死,但后期扩展性就受限制了)
  • 3、依据相应的物品 ID 请求商品的相关信息
  • 4、依据商品信息创建订单请求交易
  • 5、依据返回的订单状态处理交易结果
  • 6、请求后台再次验证订单状态
  • 7、依据后台返回结果处理相关逻辑

2、创建内购物品以及沙盒测试账号

3、客户端编写相关代码

  • 再这里我把和支付相关的逻辑都抽取到了一个单例中,在最后贴上个人梳理的相关代码大家一起学习

4、做内购过程中遇到的坑


  • 1、内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗。

    您已购买此 App 内购买项目。此项目将免费恢复。


    解决方法:在使用

    [[SKPaymentQueue defaultQueue] addPayment:payment];

    将支付信息添加进苹果的支付队列后,苹果会自动完成后续的购买请求,在用户购买成功或者点击取消购买的选项后回调

     - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction;

    方法返回响应的结果信息,在该方法内除了得到响应的支付信息编写自身的业务的代码外还要记得调用

    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

    方法通知苹果的支付队列该交易已经完成,否者就会已发起相同 ID 的商品购买就会有此项目将免费恢复的提示。


  • 2、每次启动一个新的内购支付流程,刚发起的时候系统就会调用- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction;这个方法,结果扰乱一部分的支付业务逻辑


    在 SKPaymentQueue 被启动并且添加了 addObserver之后,如果其判断到有未完成的交易,会主动调用paymentQueue updatedTransactions 这个方法来继续完成相关的交易流程,所以如果在上面那种情况下得到结果后不去调用 finish 接口,下次重新开启支付流程就会检查未完成的支付并调用该接口。

    解决方法:

    1.在得到支付结果后及时调用 finish 方法

    2.添加一个是否是新发起的支付流程的条件,在条件符合的情况下才触发应用的相关逻辑的代码

    (PS:在拿到苹果的支付结果凭据的时候最好在客户端做一份持久化的数据备份,等待后台验证完成后再清除掉,避免出现验证中间出现问题导致用户支付成功但后台相关的增值处理没有完成导致用户金钱损失的问题)


  • 3、如何区分购买物品的是 沙盒测试账号 还是 真实账号 


    后台再验证支付凭据的时候要区分是沙盒测试账号购买的还是用户真实账号购买的,所以在传凭据的时候还需要告诉后台当前购买的账号性质。

    解决方法:通过在配置文件中定义相关的宏定义并结合 Debug 与 Release 的编译环境确定相关的参数

    
       
    [objc] view plain copy 在CODE上查看代码片 派生到我的代码片
    1. // 苹果内购是否为沙盒测试账号,打开就代表为沙盒测试账号,注意上线时注释掉  
    2. #define APPSTORE_ASK_TO_BUY_IN_SANDBOX 1  
    3.           
    4. // 生成订单参数,注意沙盒测试账号与线上正式苹果账号的验证途径不一样,要给后台标明   
    5.     NSNumber *sandbox;  
    6. #if (defined(APPSTORE_ASK_TO_BUY_IN_SANDBOX) && defined(DEBUG))  
    7.     sandbox = @(0);  
    8. #else  
    9.     sandbox = @(1);  
    10. #endif  

    个人没有找到相关的方法可以打完包后动态的检测购买物品的账号性质,希望知道的朋友分享一下,感谢 ^_^


5、iOS7 客户端验证的订单状态

  • 苹果在iOS7提升了购买凭据的安全性,可以直接单独在客户端完成订单正确性的验证,但是处于金钱考虑,购买完成后,建议还是要做凭据的后台验证工作。

    [objc]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #pragma mark 客户端验证购买凭据  
    2. - (void)verifyTransactionResult  
    3. {  
    4.     // 验证凭据,获取到苹果返回的交易凭据  
    5.     // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址  
    6.     NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];  
    7.     // 从沙盒中获取到购买凭据  
    8.     NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];  
    9.     // 传输的是BASE64编码的字符串  
    10.     /** 
    11.      BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性 
    12.      BASE64是可以编码和解码的 
    13.      */  
    14.     NSDictionary *requestContents = @{  
    15.                                       @"receipt-data": [receipt base64EncodedStringWithOptions:0]  
    16.                                       };  
    17.     NSError *error;  
    18.     // 转换为 JSON 格式  
    19.     NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents  
    20.                                                           options:0  
    21.                                                             error:&error];  
    22.     // 不存在  
    23.     if (!requestData) { /* ... Handle error ... */ }  
    24.       
    25.     // 发送网络POST请求,对购买凭据进行验证  
    26.     NSString *verifyUrlString;  
    27. #if (defined(APPSTORE_ASK_TO_BUY_IN_SANDBOX) && defined(DEBUG))  
    28.     verifyUrlString = @"https://sandbox.itunes.apple.com/verifyReceipt";  
    29. #else  
    30.     verifyUrlString = @"https://buy.itunes.apple.com/verifyReceipt";  
    31. #endif  
    32.     // 国内访问苹果服务器比较慢,timeoutInterval 需要长一点  
    33.     NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:[[NSURL alloc] initWithString:verifyUrlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];  
    34.       
    35.     [storeRequest setHTTPMethod:@"POST"];  
    36.     [storeRequest setHTTPBody:requestData];  
    37.       
    38.     // 在后台对列中提交验证请求,并获得官方的验证JSON结果  
    39.     NSOperationQueue *queue = [[NSOperationQueue alloc] init];  
    40.     [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue  
    41.                            completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {  
    42.                                if (connectionError) {  
    43.                                    NSLog(@"链接失败");  
    44.                                } else {  
    45.                                    NSError *error;  
    46.                                    NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];  
    47.                                    if (!jsonResponse) {  
    48.                                        NSLog(@"验证失败");  
    49.                                    }  
    50.                                      
    51.                                    // 比对 jsonResponse 中以下信息基本上可以保证数据安全  
    52.                                    /* 
    53.                                     bundle_id 
    54.                                     application_version 
    55.                                     product_id 
    56.                                     transaction_id 
    57.                                     */  
    58.                                      
    59.                                    NSLog(@"验证成功");  
    60.                                }  
    61.                            }];  
    62.       
    63. }  


6、内购验证凭据返回结果状态码说明

  • 苹果反馈的状态码:

    [objc]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. 21000 App Store无法读取你提供的JSON数据  
    2. 21002 收据数据不符合格式  
    3. 21003 收据无法被验证  
    4. 21004 你提供的共享密钥和账户的共享密钥不一致  
    5. 21005 收据服务器当前不可用  
    6. 21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中  
    7. 21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证  
    8. 21008 收据信息是产品环境中使用,但却被发送到测试环境中验证  


更为详细的信息请参考

ios 应用内支付(In-App Purchase,沙盒测试,后台验证)

【IOS一气呵成】之IAP集成:内购和内购恢复

另附:苹果官网内购 API 链接

7、如何恢复购买

  • 注:此部分内容后期再详细添加 ^_^

备注:

相关代码:

XYPayManager.h

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //  
  2. //  XYPayManager.h  
  3. //  xingyun  
  4. //  
  5. //  Created by 郑亚恒 on 15/11/2.  
  6. //  Copyright © 2015年 郑亚恒. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. // 苹果内购是否为沙盒测试账号,打开就代表为沙盒测试账号,注意上线时注释掉!!  
  12. #define APPSTORE_ASK_TO_BUY_IN_SANDBOX 1  
  13.   
  14. typedef void(^payCompleteBlock)(NSDictionary *resultDic, BOOL isSuccess);  
  15.   
  16. @interface XYPayManager : NSObject  
  17.   
  18. + (instancetype)sharedPayManager;  
  19.   
  20. /// 苹果内购  
  21. - (void)requestAppleStoreProductDataWithString:(NSString *)productIdentifier payComplete:(payCompleteBlock)payCompletionBlock;  
  22. /// 验证苹果支付订单凭证  
  23. - (void)checkAppStorePayResultWithBase64String:(NSString *)base64String;  
  24.   
  25. @end  


XYPayManager.m

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //  
  2. //  XYPayManager.m  
  3. //  xingyun  
  4. //  
  5. //  Created by 郑亚恒 on 15/11/2.  
  6. //  Copyright © 2015年 郑亚恒. All rights reserved.  
  7. //  
  8.   
  9. #import "XYPayManager.h"  
  10. #import <StoreKit/StoreKit.h>  
  11.   
  12. @interface XYPayManager() <SKPaymentTransactionObserver, SKProductsRequestDelegate>  
  13.   
  14. // 苹果内购  
  15. @property (nonatomic, copy) NSString *appleProductIdentifier;  
  16. @property (nonatomic, copy) payCompleteBlock payComplete;  
  17.   
  18. @end  
  19.   
  20. @implementation XYPayManager  
  21.   
  22. + (instancetype)sharedPayManager {  
  23.     static XYPayManager *payManager;  
  24.     static dispatch_once_t once = 0;  
  25.     dispatch_once(&once, ^{  
  26.         payManager = [[XYPayManager alloc] init];  
  27.         // 注册苹果内购  
  28.         [[SKPaymentQueue defaultQueue] addTransactionObserver:payManager];  
  29.           
  30.     });  
  31.     return payManager;  
  32. }  
  33.   
  34. - (void)dealloc {  
  35.     [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];  
  36. }  
  37.   
  38. #pragma mark - 苹果支付充值  
  39. //请求商品  
  40. - (void)requestAppleStoreProductDataWithString:(NSString *)productIdentifier payComplete:(payCompleteBlock)payCompletionBlock {  
  41.     if(![SKPaymentQueue canMakePayments]) {  
  42.         NSLog(@"不允许程序内付费");  
  43. //        [APPCONTEXT.hudHelper showHudOnWindow:@"不允许程序内付费" image:nil acitivity:NO autoHideTime:DEFAULTTIME];  
  44.           
  45.         return;  
  46.     }  
  47.       
  48.     NSLog(@"-------------请求对应的产品信息----------------");  
  49.     self.startBuyAppleProduct = YES;  
  50.     self.payComplete = payCompletionBlock;  
  51.     self.appleProductIdentifier = productIdentifier;  
  52.       
  53.     NSLog(@"生成产品信息");  
  54.     NSArray *product = [[NSArray alloc] initWithObjects:productIdentifier, nil nil];  
  55.     NSSet *nsset = [NSSet setWithArray:product];  
  56.     SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];  
  57.     request.delegate = self;  
  58.     [request start];  
  59.       
  60. }  
  61.   
  62. //收到产品返回信息  
  63. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{  
  64.       
  65.     NSLog(@"--------------收到产品反馈消息---------------------");  
  66.     NSArray *productArray = response.products;  
  67.     if([productArray count] == 0){  
  68.         NSLog(@"--------------没有商品------------------");  
  69.         return;  
  70.     }  
  71.       
  72.     NSLog(@"productID:%@", response.invalidProductIdentifiers);  
  73.     NSLog(@"产品付费数量:%lu",(unsigned long)[productArray count]);  
  74.       
  75.     SKProduct *product = nil;  
  76.     for (SKProduct *pro in productArray) {  
  77.         NSLog(@"%@", [pro description]);  
  78.         NSLog(@"%@", [pro localizedTitle]);  
  79.         NSLog(@"%@", [pro localizedDescription]);  
  80.         NSLog(@"%@", [pro price]);  
  81.         NSLog(@"%@", [pro productIdentifier]);  
  82.           
  83.         if([pro.productIdentifier isEqualToString:self.appleProductIdentifier]){  
  84.             product = pro;  
  85.         }  
  86.     }  
  87.       
  88.     SKPayment *payment = [SKPayment paymentWithProduct:product];  
  89.       
  90.     NSLog(@"发送购买请求");  
  91.     [[SKPaymentQueue defaultQueue] addPayment:payment];  
  92. }  
  93.   
  94. //请求失败  
  95. - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{  
  96.     NSLog(@"------------------错误-----------------:%@", error);  
  97. }  
  98.   
  99. - (void)requestDidFinish:(SKRequest *)request{  
  100.     NSLog(@"------------反馈信息结束-----------------");  
  101. }  
  102.   
  103. //监听购买结果  
  104. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction {  
  105.     for(SKPaymentTransaction *paymentTransactionp in transaction){  
  106.           
  107.         switch (paymentTransactionp.transactionState) {  
  108.             case SKPaymentTransactionStatePurchased:  
  109.             {  
  110.                 NSLog(@"交易完成-restoreCompletedTransactions");  
  111.                 /* your code */  
  112.                 [self buyAppleStoreProductSucceedWithPaymentTransactionp:paymentTransactionp];  
  113.                   
  114.                 [self completeTransaction:paymentTransactionp];  
  115.             }  
  116.                   
  117.                 break;  
  118.                   
  119.             case SKPaymentTransactionStatePurchasing:  
  120.                 NSLog(@"商品添加进列表");  
  121.                   
  122.                 break;  
  123.                   
  124.             case SKPaymentTransactionStateRestored:  
  125.                 NSLog(@"已经购买过商品");  
  126.                   
  127.                 break;  
  128.                   
  129.             case SKPaymentTransactionStateFailed:  
  130.             {  
  131.                 NSLog(@"交易失败");  
  132.                 /* your code */  
  133.                 [self completeTransaction:paymentTransactionp];  
  134.             }  
  135.                 break;  
  136.         }  
  137.     }  
  138. }  
  139.   
  140. // 苹果内购支付成功  
  141. - (void)buyAppleStoreProductSucceedWithPaymentTransactionp:(SKPaymentTransaction *)paymentTransactionp {  
  142.   
  143.     /* 获取相应的凭据,并做 base64 编码处理 */  
  144.     NSString *base64Str = [paymentTransactionp.transactionReceipt base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];  
  145.     NSLog(@"苹果内购凭据号\n\n\n\n\n\n%@\n\n\n\n\n\n",base64Str);  
  146.   
  147.     [self checkAppStorePayResultWithBase64String:base64Str];  
  148. }  
  149.   
  150.   
  151. - (void)checkAppStorePayResultWithBase64String:(NSString *)base64String {  
  152.       
  153.     /* 生成订单参数,注意沙盒测试账号与线上正式苹果账号的验证途径不一样,要给后台标明 */  
  154.     NSNumber *sandbox;  
  155. #if (defined(APPSTORE_ASK_TO_BUY_IN_SANDBOX) && defined(DEBUG))  
  156.     sandbox = @(0);  
  157. #else  
  158.     sandbox = @(1);  
  159. #endif  
  160.       
  161.     NSMutableDictionary *prgam = [[NSMutableDictionary alloc] init];;  
  162.     [prgam setValue:sandbox forKey:@"sandbox"];  
  163.     [prgam setValue:base64String forKey:@"reciept"];  
  164.       
  165.     /* 
  166.      请求后台接口,服务器处验证是否支付成功,依据返回结果做相应逻辑处理 
  167.      */  
  168.   
  169. }  
  170.   
  171. //交易结束  
  172. - (void)completeTransaction:(SKPaymentTransaction *)transaction{  
  173.     NSLog(@"交易结束");  
  174.     [[SKPaymentQueue defaultQueue] finishTransaction:transaction];  
  175. }  
  176.   
  177. @end  


原文地址:http://blog.csdn.NET/jiisd/article/details/50527426

关于苹果内购(IAP)的一些问题以及那些坑 IAP,无法连接到iTunes store ,RMStore,SKErrorUnknown,Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/html" 阅读详情

相关推荐

一个FlowLayout带你学会自定义ViewGroup

在Android的世界里,系统是没有提供类似FlowLayout布局的容器的。当然了,现在官方给我们提供了更强大也更复杂的FlexLayout了。不过嘛,本篇博客是总结一个自定本篇博客是总结一个自定义ViewGroup的实现流程,所以需要找一个难易适中的实例来进行分析,也就是FlowLayout了。

蘑菇君的学习之路 5832

No space left on device: mod_rewrite: could not create rewrite_log_lock

 When you see the error;No space left on device: mod_rewrite: could not create rewrite_log_lockin your Apache logs or when Apache fails to start, try the following;ipcs -s—

吴遥的专栏 10万+

ios内购(iap)关于问题“您已经购买了此程序内购买(In App Purchase)项目,但尚未下载"的解决方案

近日在项目内购中遇到“您已经购买了此程序内购买(In App Purchase)项目,但尚未下载”的问题,查阅google和百度各种文章,没找到合适的解决方案,折腾一整天,终于解决,解决方案贴出来,供大家参考。也是为了验证这个方案的正确性。欢迎拍砖! 首先说说出现这个问题的原因,一般是购买成功后业务逻辑出了问题(或者是逻辑依赖网络,网络出了问题),没有成功调用finishTransaction,

dfgjava的专栏 3万+

Unicode字符集和多字节字符集关系(一)

另外可参考: 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词 http://blog.youkuaiyun.com/smonster/archive/2008/10/31/3194587.aspx   unicode、ucs-2、ucs-4、utf-16、utf-32、utf-8 http://stallman.blogbus.com/logs/41709878.html U

Road2010的专栏 7536

halcon 检测直线

图中后三个对象既是检测出的图像;

qq_59062726的博客 666

奇迹MU单机版开服全流程:从零搭建到分辨率调整(附GM工具使用技巧)

本文详细介绍了奇迹MU单机版从零搭建到分辨率调整的完整流程,包括环境配置、服务端启动、GM工具使用技巧等关键步骤。特别针对现代高分辨率显示器提供了优化方案,帮助玩家轻松搭建个性化游戏环境,重温经典MMORPG的独特魅力。

b3n4m5q6w7的博客 678

iOS In-App Purchase 内购之 问题总结

1、内购流程 1、在 AppStore 中创建相应的物品,创建内购沙盒测试账号2、客户端从后台获取相应的物品 ID (当然也可以再客户端写死,但后期扩展性就受限制了)3、依据相应的物品 ID 请求商品的相关信息4、依据商品信息创建订单请求交易5、依据返回的订单状态处理交易结果6、请求后台再次验证订单状态7、依据后台返回结果处理相关逻辑 2、创建内购物品以及沙盒测试账号 已经有朋友写出

zzzzzdddddxxxxx的专栏 5020

Android 13 SPRD 源码默认打开多用户实际无效果问题修复

【代码】Android 13 SPRD 源码默认打开多用户实际无效果问题修复。

m0_60898338的博客 449

关于IOS内购的使用小结

以下的IAP功能是基于Flutter的in_app_purchase实现的。由于配置和调试过程遇到不少问题所以归纳一些文档和问题解决建议。

BAStriver的博客 1891

YOLOv11改进 | 特殊场景检测篇 | 利用图像去雾网络UnfogNet改进yolov11图像雾天检测能力(全网独家首发改进)

本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv11针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv11的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可以忽略不计这是非常难得的,因为其也算是一种图像增强算法,同时本文的内容不影响其它的模块改进可以作为工作量凑近大家的论文里,非常的适用,图像去雾检测为群友最近提出的需要的改进。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 1628

SAP Single Sign-On 全景指南:从传统 SAP SSO 到 SAP Secure Login Service for SAP GUI 的架构、场景与迁移实践

本文系统梳理了SAP生态下的单点登录技术方案,重点分析了SAP GUI的云化替代方案SAP Secure Login Service(SLS)。内容涵盖SNC、Kerberos/SPNEGO、SAML 2.0等核心协议的技术实现,对比了传统SAP SSO与新型SLS for SAP GUI的架构差异,并给出AS ABAP系统的具体实施路径。针对SAP GUI访问、浏览器访问Fiori/移动端等不同场景,提供了详细的协议选型建议和配置指南,帮助团队构建安全可靠且适应云时代的统一认证体系。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

ios内购二次验证安全性问题_iOS In-App Purchase(IAP)内购服务端二次验证注意事项...

前端iOS完成对应的商品购买之后,会得到一个Transaction(交易)的数据结构指针,后端实际上只需要这个结构内的一个东西,那就是 transaction.transactionReceipt。前端将它进行Base64编码之后,再请求后端的HTTP接口就行了,我这里着重讲一下后端需要做的一些事情。首先,拿到这个Base64的字符串之后,不用任何修改,只需要将它原封不动的请求给苹果的验证接口就行...

weixin_32753181的博客 1032

31.华为路由器:PPPOE配置模拟实验及NAT配置

实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 The number of interface

迷逝 8116

[IPA]IOS In App Purchase(内购)验证

参考我之前的笔记苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证。 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功。 当应用向Apple服务器请求购买,成功之后,Apple会返回以下四个数据给应用 四个验证数据 productIdentifier:cosmosbox.strikehero.gems60 state: Purchased...

THMAIL的博客 2137

15、远程操作水下航行器(ROV)的非线性控制系统设计

本文探讨了远程操作水下航行器(ROV)的非线性控制系统设计,重点介绍了多变量PID控制、改进的PD控制和滑模控制三种方法。详细阐述了各控制策略的原理、建模与仿真过程,并通过对比分析其在稳态误差、振荡、抖振及跟踪效果等方面的性能表现。文章还提出了针对不同控制方法的优化建议,并给出了选择合适控制策略的决策流程,为ROV高精度运动控制提供了系统性解决方案。

sun99的博客 156

GIS常用符号化色带(超级色带)根据python制作

GIS自带的色带比较单一,今天分享一款色带,应用之后大家出图的时候可以选择更多的配色,符号化/点击色块/样式引用/将样式添加至列表即可。色带类型比较多,大家可以自己尝试下不同的风格。简单符号化一下,看看效果。以中国县级行政区划为例,

J_Giser的博客 2637

iOS in-app purchase详解

in-app purchase教程: http://www.appcoda.com/in-app-purchase-tutorial/   3.后台服务器验证收据的正确性 IOS 内支付有两种模式: 1) 内置模式 2) 服务器模式 内置模式的流程可以简单的总结为以下几步: 1) app从app store 获取产品信息 2) 用户选择需要购买的产品 3) app发送支付请求到...

weixin_33978016的博客 152

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

AppStore SDK

ios审核被拒4.3 http://www.cocoachina.com/bbs/read.php?tid-1731757.html ios审核4.3被拒? 别担心 这几步让你的 App 顺利过审 https://cloud.tencent.com/info/2dbb940817ab7a53e18cc64c42d6ebdf.html https://blog.youkuaiyun.com/she...

weixin_30652491的博客 637

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

html5 api集成ios,IOS 应用内支付(IAP)接口使用说明

IOS平台最新集成了苹果官方提供的应用内支付(In-App Purchase),新的插件是在plus.payment的基础上进行了扩展,但是在使用方法上与原有的支付API的使用流程稍有区别,下面对IAP插件的使用方法进行说明HBuilder 里的调试基座默认不带IAP支付通道,如果需要调试IAP需要使用开发证书生成一个自定义调试基座,用来实现IAP的开发和调试。自定义调试基座使用方法请参考文档ht...

weixin_33484711的博客 1212

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IOS 内支付那点事

转自:http://www.cnblogs.com/raylau/archive/2013/05/21/3090687.html 1.IOS purchase 介绍 所谓的IOS 内支付就是在应用中内嵌Store,在iOS APP 中使用Store Kit framework来实现In-App Purchase,Store Kit会连接App Store,代替应用安全地完成

GrimRaider的专栏 650

<span class=“js_title_inner“>记第一个IOS应用成功上线及流程和心得</span>

被这个问题拒绝了两次,其实因为长期做小程序开发的,随着小程序开发的审核越来越规范,相关的用户协议之类的我在每次开发都是会默认加上了,可是苹果对这方面的要求要更加严格一些。好了接下来说一下开发吧,同样借用了ai辅助,不过这次真的只是辅助,从UI到逻辑以及代码都进行反复的修改和调整,说真的现在的ai确实强大,但有时候真得很令人头疼,别听那些不懂代码的人也可以用AI写出完整的项目,那特么真是扯淡了,我一个懂代码的人也只是稍微提高了一下工作效率,不懂代码稍微遇到一点小问题,真得有你头疼的。元数据里的app描述。

小创果技术交流博客 881

iOS 内购(In-App Purchase)详解

IAP 全称:In-App Purchase,是指苹果 App Store 的应用内购买,是苹果为 App 内购买虚拟商品或服务提供的一套交易系统。适用范围:在 App 内需要付费使用的产品功能或虚拟商品/服务,如游戏道具、电子书、音乐、视频、订阅会员、App的高级功能等需要使用 IAP,而在 App 内购买实体商品(如淘宝购买手机)或者不在 App 内使用的虚拟商品(如充话费)或服务(如滴滴叫车)则不适用于 IAP。简而言之,苹果规定:适用范围内的虚拟商品或服务,必须使用 IAP 进行购买支付,不允许使用

lichuanliangios的专栏 2万+

UNIApp项目集成苹果内购 In-App Purchase支付流程指南

In-App Purchase (IAP) 是苹果提供的应用内购买服务,允许用户在应用内购买虚拟商品、订阅服务等。本文档详细介绍如何在UNIApp项目中集成苹果内购功能。环境配置: 开发环境和苹果开发者后台的配置代码实现: 完整的服务类、组件和页面实现支付流程: 详细的购买流程和状态管理测试验证: 沙盒测试和生产环境验证问题解决: 常见问题的诊断和解决方案最佳实践: 用户体验、安全性和性能优化建议通过遵循本指南,您可以成功在UNIApp项目中集成苹果内购功能,为用户提供安全、便捷的应用内购买体验。

chenchuang0128的博客 1681

IOS 内购开发:In-App Purchase

前述:最近刚刚和后台的同事完成了IOS的内购项目功能开发,用以替换之前的支付宝、微信支付功能。这里,梳理出大体的步骤,已经其中踩过的坑。我只梳理了什么事IAP、为什么要用IAP、IAP功能的架构设计、IAP的具体实现代码以及IAP的一些问题 一》 In-App Purchase的相关知识 这里我就不罗列大量的理论了,只谈谈我自己的认识。首先,In-App Purchase功能是用来在IOS生态内...

chqj_163的专栏 1087
上一篇: IOS地图自定义弹出框
下一篇: swift3.0 入门学习笔记之二 闭包
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值