热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IOSApplePay

运行环境##iphone6以及以上,iOS9.2以上。目前不支持企业证书添加。支持模拟器测试。环境配置##1、 Xcode7.2.1以及以上打开项目,在Capabilities里将

运行环境##

iphone 6 以及以上,iOS 9.2 以上。目前不支持企业证书添加。
支持模拟器测试。

环境配置##

1、 Xcode 7.2.1 以及以上打开项目,在 Capabilities里将Apple Pay设置为on,如下图,

 

IOS Apple Pay

2、 图一我们看到了有个 Merchant ID 选项,而且新建时候是没有配置的,那么需要到哪里去配置呢?
1、访问苹果开发账号,证书中心。
Identifiers -->Merchant IDs
输入描述 和 ID,ID 必须以merchant. 开头 

IOS Apple Pay

 

Continue 到下一步,前方高能警报,嘀嘀嘀~~~~ 坑一出现:报错!!!!!!!

IOS Apple Pay

 

说明苹果对这个ID 格式是有要求的。多试几次。其实仔细看 图 -3 底下有一行小字,We recommend using a reverse-domain name style string (i.e.,merchant.com.example.merchantname).最好按照官方要求 merchant.com.example.merchantname这个格式来。

IOS Apple Pay

 

 一步一步往下走。
这时候 会提示你 Identifier:merchant.com.Demo.applepaydemo已经生成。

 

IOS Apple Pay

 

 点击 Done 

IOS Apple Pay

 

 根据上面的提示,点击Edit,接下去应该是需要建证书了。
首次添加时候 会询问你是否 在中国使用。选择 YES(截图是默认状态-NO),一直 continue 。

 

IOS Apple Pay

3、新建证书
创建 ** Creating a Certificate Signing Request (CSR) CSR 证书,**
生成CSR证书,这个证书一般是接入第三方银联生成的CSR ,上传到这里就行了

 

IOS Apple Pay

 

代码集成##

这里要说的 重点不在下半部分,而是 Buy with XXPay这个按钮,我们知道苹果是一个有情(偏)怀(执)的处女座公司,对很多的设计或则交互都有自己的一套规则,ApplePay 的响应 按钮也不例外。不要以为随便 弄个 设计个按钮 就能上线了,这个时候 美工和老板说了都不算,要听苹果的ApplePay 设计规范。不然审核也过不了。


导入头文件,(xcode 7.0 以上已经自动帮我们导入了库,所以我们只需要导入头文件即可)
#import 

2、
PKPaymentAuthorizationViewController Apple pay的展示控件,也是核心类。直接看代码

if(![PKPaymentAuthorizationViewController class]) {

//PKPaymentAuthorizationViewController需iOS8.0以上支持

NSLog(@"操作系统不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");

return;

}

//检查当前设备是否可以支付
if(![PKPaymentAuthorizationViewController canMakePayments]) {

//支付需iOS9.0以上支持

NSLog(@"设备不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");

return;

}

//检查用户是否可进行某种卡的支付,是否支持Amex、MasterCard、Visa与银联四种卡,根据自己项目的需要进行检测
NSArray*supportedNetworkCards =@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];

if(![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworks]) {

NSLog(@"没有绑定支付卡");

return;

}

NSLog(@"可以支付,开始建立支付请求");
- (void)actionApplePay:(UIButton *)button {

  if ([PKPaymentAuthorizationViewController canMakePayments]) {

    NSLog(@"Woo! Can make payments!");

    if ([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[
          PKPaymentNetworkChinaUnionPay,
          PKPaymentNetworkMasterCard,
          PKPaymentNetworkVisa
        ]]) {

    } else {
      NSLog(@"用户未添加银行卡");
      return;
    }

    PKPaymentRequest *request = [[PKPaymentRequest alloc] init];

    PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem
        summaryItemWithLabel:@"Widget 1"
                      amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];

    PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem
        summaryItemWithLabel:@"Widget 2"
                      amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];

    PKPaymentSummaryItem *total = [PKPaymentSummaryItem
        summaryItemWithLabel:@"Grand Total"
                      amount:[NSDecimalNumber decimalNumberWithString:@"0.02"]];

    request.paymentSummaryItems = @[ widget1, widget2, total ];
    request.countryCode = @"CN";
    request.currencyCode = @"CHW";

    //能支付的币种
    request.supportedNetworks = @[
      PKPaymentNetworkChinaUnionPay,
      PKPaymentNetworkMasterCard,
      PKPaymentNetworkVisa
    ];
      
    //Merchant ID
    request.merchantIdentifier = @"merchant.com.Carman.Paydemo";

    // 询问你的付款处理器 (PKMerchantCapabilityCredit
    // 信用卡,PKMerchantCapabilityDebit 借记卡)

    /*
     PKMerchantCapabilityCredit NS_ENUM_AVAILABLE_IOS(9_0)   = 1UL <<2,   //
     支持信用卡
     PKMerchantCapabilityDebit  NS_ENUM_AVAILABLE_IOS(9_0)   = 1UL <<3    //
     支持借记卡
     */
    request.merchantCapabilities = PKMerchantCapabilityCredit;
    // 添加联系人邮箱 及送货地址信息
    //request.requiredShippingAddressFields = PKAddressFieldAll;

    PKPaymentAuthorizationViewController *paymentPane =
        [[PKPaymentAuthorizationViewController alloc]
            initWithPaymentRequest:request];
    paymentPane.delegate = self;
    [self presentViewController:paymentPane animated:TRUE completion:nil];

  } else {
    NSLog(@"设备不支持支付");
  }
}
1、[PKPaymentAuthorizationViewController canMakePayments] 判断设备支持不支持 ApplePay。中国区 是 iphone 6 及以上,iOS9.2
2、canMakePaymentsUsingNetworks: 判断 设备上用户有没有添加银行卡,如果没添加,不写这个判断,真机上会crash。
PKPaymentNetworkChinaUnionPay//中国银联卡
PKPaymentNetworkMasterCard//Master卡
PKPaymentNetworkVisa//Visa卡
3、支付的类目以及总额

PKPaymentRequest *request = [[PKPaymentRequest alloc] init];

    PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem
        summaryItemWithLabel:@"Widget 1"
                      amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];

    PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem
        summaryItemWithLabel:@"Widget 2"
                      amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];

    PKPaymentSummaryItem *total = [PKPaymentSummaryItem
        summaryItemWithLabel:@"Grand Total"
                      amount:[NSDecimalNumber decimalNumberWithString:@"0.02"]];

    request.paymentSummaryItems = @[ widget1, widget2, total ];
4、countryCode国家 code ,中国的是 CN ,不太清楚定义的可以查看 countryCode查询网站
5、currencyCode支付币种 ,人民币 CHW
6、supportedNetworks能支持的卡种,同 2
7、merchantIdentifier,终于出现这货了,申请半天的 Merchant ID ,请注意保持一致。
8、
merchantCapabilities
询问你的付款处理器
PKMerchantCapabilityCredit//支持信用卡
PKMerchantCapabilityDebit//支持借记卡
9、requiredShippingAddressFields添加联系人信息
typedef NS_OPTIONS(NSUInteger, PKAddressField) {
    PKAddressFieldNone                              = 0UL,      // No address fields required.
    PKAddressFieldPostalAddress                     = 1UL <<0, // Full street address including name, street, city, state/province, postal code, country.
    PKAddressFieldPhOne= 1UL <<1,
    PKAddressFieldEmail                             = 1UL <<2,
    PKAddressFieldName NS_ENUM_AVAILABLE_IOS(8_3)   = 1UL <<3,
    PKAddressFieldAll                               = (PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldEmail|PKAddressFieldName)
} NS_ENUM_AVAILABLE(NA, 8_0);

10、调起 ** PKPaymentAuthorizationViewController**

 PKPaymentAuthorizationViewController *paymentPane =
        [[PKPaymentAuthorizationViewController alloc]
            initWithPaymentRequest:request];
    paymentPane.delegate = self;
      
    [self presentViewController:paymentPane animated:TRUE completion:nil];

当然,我们要实现 代理

#pragma mark-- PKPaymentAuthorizationViewControllerDelegate
- (void)
    paymentAuthorizationViewController:
        (PKPaymentAuthorizationViewController *)controller
                   didAuthorizePayment:(PKPayment *)payment
                            completion:
                                (void (^)(PKPaymentAuthorizationStatus status))
                                    completion {
  NSLog(@"Payment was authorized: %@", payment);

  // do an async call to the server to complete the payment.
  // See PKPayment class reference for object parameters that can be passed
  BOOL asyncSuccessful = FALSE;

  if (asyncSuccessful) {
    completion(PKPaymentAuthorizationStatusSuccess);

    NSLog(@"支付成功");

  } else {
    completion(PKPaymentAuthorizationStatusFailure);
    NSLog(@"支付失败");
  }
}

- (void)paymentAuthorizationViewControllerDidFinish:
        (PKPaymentAuthorizationViewController *)controller {
  // hide the payment window
  [controller dismissViewControllerAnimated:TRUE completion:nil];
}
1、paymentAuthorizationViewController:didAuthorizePayment:
completion

支付 状态回调在这里处理,支付成功和失败,订单的地址 以及和 服务器传输数据-token。
2、paymentAuthorizationViewControllerDidFinish:支付结束,关闭 支付弹框。

token支付成功之后的回执,需要上传给服务器。
billingAddress用户账单地址
billingContact用户账单信息
shippingAddress送货地址
shippingContact送货信息
shippingMethod送货方式
以上的 信息 可以根据自己的需求 上传到服务器

 
 
 
 
 

银联Apple Pay控件开发包####

下载 银联的Apple Pay 控件开发包,里面有非常详细的 介绍,如何接入ApplePay。

银联支付控件 SDK 模式 Apple Pay 支付的实现方式###

 
IOS Apple Pay
1-2、 商户生成订单,通过商户SERVER端将订单信息发送给银联支付网关;
3-4、银联支付网关记录订单信息,返回用来标识订单的 TN 号,经由商户 SERVER 返回至给商户 APP;
5、 商户 APP 调用银联 SDK,将 TN 号传递给银联 SDK
6、 银联 SDK 向 Apple 公司的 PASSKIT FRAMEWORK 发起支付请求;
7、 接口返回加密的支付 Token 信息;
8-9、银联 SDK 将支付 Token 传递给银联支付网关,完成交易认证;
10-12、银联将支付结果返回给商户 APP,商户 SERVER,商户 APP 负责提示用户交易结果。
 
 
 
  • 添加银联SDK 并加入依赖的库文件

a、添加 Apple Pay 版本静态库文件
包含文件:
UPAPayPlugin.h
UPAPayPluginDelegate.h
libUPAPayPlugin.a

b、添加 CFNetwork.framework 、 libUPAPayPlugin.a 、 PassKit.framework 、 SystemConfiguration.framework 到商户 App 工程中

c、http 请求设置,设置NSAllowsArbitraryLoads 属性值为 YES

注意:如果工程的 compile source as 选项的值不是 Objective–C++,则引用此头文件的文件类型都要 改为.mm

  • 接口调用

a、商户 App 从商户服务器获取 tn,当 tn 不为空时,调用支付接口。

//当获得的tn不为空时,调用支付接口
if (tn != nil && tn.length > 0) {
if([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkChinaUnionPay]] )
{
//调用银联支付控件
[UPAPayPlugin startPay:tn mode:self.testMode viewController:self delegate:self andAPMechantID:kAppleMechantID]; }
}

处理支付结果

银联手机支付控件结果回调函数有四个支付状态返回值,在 UPPayResult 类中有关于 UPPaymentResultStatus 的详细说明。

商户 App 通过在工程中添加头文件 “UPAPayPluginDelegate.h”,然后在处理交易结果界面中根据该头文件中定义的回调函数:-(void)UPAPayPluginResult:(UPPayResult *)result 来实现回调方法,从而根据支付结果的不同进行相应的处理。

-(void)UPAPayPluginResult:(UPPayResult *)result
{
    if(result.paymentResultStatus == UPPaymentResultStatusSuccess) {
        NSString *otherInfo = result.otherInfo?result.otherInfo:@"";
        NSString *successInfo = [NSString stringWithFormat:@"支付成功\n%@",otherInfo];
        [self showAlertMessage:successInfo];
    }
    else if(result.paymentResultStatus == UPPaymentResultStatusCancel){

        [self showAlertMessage:@"支付取消"];
    }
    else if (result.paymentResultStatus == UPPaymentResultStatusFailure) {
        
        NSString *errorInfo = [NSString stringWithFormat:@"%@",result.errorDescription];
        [self showAlertMessage:errorInfo];
    }
    else if (result.paymentResultStatus == UPPaymentResultStatusUnknownCancel)  {
        
        //TODO UPPAymentResultStatusUnknowCancel表示发起支付以后用户取消,导致支付状态不确认,需要查询商户后台确认真实的支付结果
        NSString *errorInfo = [NSString stringWithFormat:@"支付过程中用户取消了,请查询后台确认订单"];
        [self showAlertMessage:errorInfo];
        
    }
}

 


推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 阿里云虚拟主机安装多个织梦系统的方法
    本文介绍了在阿里云虚拟主机上安装多个织梦系统的方法。通过创建不同名称的文件夹并将不同的域名解析到对应的目录,可以实现多个系统的安装。在安装过程中需要注意修改数据库前缀,并在系统设置中还原数据库。同时还介绍了阿里云虚拟主机二级域名绑定二级目录和域名重定向的用法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
author-avatar
黄初伦伟彦宜婷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有