iOS集成ApplePay

Apple Pay正式在国内上线的那天,一起工作的小伙伴就走进了Starbucks,7-11等带有银联闪付的店进行了尝鲜。不管是否要再次输入一次密码,但是它的出现确实给我们带来了极大的便捷。下面就尝试在一个Demo中来集成下Apple Pay的功能。

下面图片是借的别人的

Apple Pay流程

Apple Pay运行环境:

iPhone 6以上设备,当然也包括最新出来的iPhone SE。iOS版本在9.2以上。

Xcode版本号 7.2.1

APP接入ApplePay不需要POS机,但是还是要和银行签约,比如和银联签约。

准备工作

在接入Apple Pay之前,首先要申请MerchantID及对应的证书。

申请Merchant ID

需要以merchant开头的一个字符串

仅在中国使用

申请App ID,这里和Merchant ID填写一样的名字为了辨别

申请好后再权限里面打开ApplePay功能,并配置merchant证书

选择Edit进行相应配置

配置成功后你会看到

配置APP ID和Merchant ID关联成功

搭建工程文件

bundleID设置,对应手动生成的bundleID

Bundle Id设置

Capability中启用Apple Pay权限,并选择merchantID.

Apple Pay使能并勾选对应merchantID

设置需要导入的头文件、引入的库

#import <PassKit/PassKit.h>//用户绑定的银行卡信息

#import <PassKit/PKPaymentAuthorizationViewController.h>//Apple pay的展示控件

#import <AddressBook/AddressBook.h>//用户联系信息相关

在开始Apple Pay支付前需要带代码中进行,系统版本检测,设备是否支持ApplePay检测以及用户是否绑定有对应的银行,三步操作。

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(@"可以支付,开始建立支付请求");

//当以上三种检查都通过后我这里以人民币作为测试

下面是代码:

//
//  ViewController.m
//  PayDemo
//
//  Created by Jackey on 2017/3/2.
//  Copyright ? 2017年 com.zhouxi. All rights reserved.
//

#import <PassKit/PassKit.h>                                 //用户绑定的银行卡信息
#import <PassKit/PKPaymentAuthorizationViewController.h>    //Apple Pay的展示控件
#import <AddressBook/AddressBook.h>                         //用户联系信息相关

#import "ViewController.h"

@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>

@property (nonatomic, strong) NSMutableArray *summaryItems; //账单列表
@property (nonatomic, strong) PKPaymentAuthorizationViewController *payVC;
@property (nonatomic, strong) PKPaymentRequest *payRequest;

@end

@implementation ViewController

@synthesize payRequest;

- (void)viewDidLoad {

    [super viewDidLoad];

    PKPaymentButton *payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleWhiteOutline];
    payButton.center = self.view.center;
    [payButton addTarget:self action:@selector(action) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:payButton];

    PKPaymentButton *setupButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
    setupButton.center = CGPointMake(self.view.center.x, self.view.center.y + 50);
    [setupButton addTarget:self action:@selector(jump2MakePaymentsUsingNetworks) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:setupButton];

    //检测当前系统版本是否支持Apple Pay
    if (![PKPaymentAuthorizationViewController class]) {

        NSLog(@"系统版本太低, 请升级至9.0以上版本, 且iPhone6以上设备才支持");
    } else {

        NSLog(@"恭喜您, 当前系统支持Apple Pay!");
    }

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

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

        NSLog(@"恭喜您, 当前设备支持Apple Pay");
    }

    //检查用户是否可以进行某种银行卡的支付, 是否支持Amex, MasterCard, Visa与银联四中卡
    NSArray *supportedNetworkCards = @[PKPaymentNetworkAmex,
                                       PKPaymentNetworkMasterCard,
                                       PKPaymentNetworkVisa,
                                       PKPaymentNetworkChinaUnionPay];

    if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworkCards]) {

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

        NSLog(@"有绑定支付卡, 可以开始建立支付请求了");
    }

    //开始配置支付信息

    payRequest = [[PKPaymentRequest alloc] init];
    payRequest.countryCode = @"CN";             //国家代码
    payRequest.currencyCode = @"CNY";           //RMB的币种代码
    payRequest.merchantIdentifier = @"merchant.com.zhouxi.PayDemo";
                                                //申请的merchantID
    payRequest.supportedNetworks = supportedNetworkCards;
                                                //用户可以进行支付的银行卡
    payRequest.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV;
                                                //设置支持的交易处理协议, 3DS必须支持, EMV为可选

    //payRequest.requiredShippingAddressFields = \
    PKAddressFieldPostalAddress | PKAddressFieldPhone | PKAddressFieldName;
                                                //设置发货地址

    payRequest.requiredShippingAddressFields = PKAddressFieldNone;
                                                //空发货地址

    payRequest.shippingMethods = @[];           //设置配送方式

    NSDecimalNumber *totalAmount =     [NSDecimalNumber decimalNumberWithString:@"0.01"];
                                                //创建金额

    PKPaymentSummaryItem *total =     [PKPaymentSummaryItem summaryItemWithLabel:@"重庆周希" amount:totalAmount];

    self.summaryItems = [NSMutableArray arrayWithArray:@[total]];

    payRequest.paymentSummaryItems = self.summaryItems;

}

- (void)action {

    //初始化ApplePay控件
    self.payVC =     [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:payRequest];

    self.payVC.delegate = self;

    [self presentViewController:self.payVC animated:YES completion:nil];

}

- (void)jump2MakePaymentsUsingNetworks {

    /**
     *  跳转到添加银行卡界面,系统直接就给我们提供了一个方法,直接创建界面,然后open即可
     */
    PKPassLibrary *library = [[PKPassLibrary alloc] init];

    /**
     * 跳转到绑定银行卡界面
     */
    [library openPaymentSetup];
}

#pragma mark - PKPaymentAuthorizationViewControllerDelegate Methods

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion {

    //支付凭据, 发给服务器端进行验证支付师傅真是有效
    PKPaymentToken *payToken = payment.token;

    //账单信息
    PKContact *billingContact = payment.billingContact;

    //送货信息
    PKContact *shippingContact = payment.shippingContact;

    //送货方式
    PKContact *shippingMethod = payment.shippingMethod;

    //等待服务器返回结果后再进行系统block调用
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        //模拟服务器通信
        completion(PKPaymentAuthorizationStatusSuccess);
    });
}

- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {

    [controller dismissViewControllerAnimated:YES completion:nil];
}

@end
时间: 2024-08-24 23:19:49

iOS集成ApplePay的相关文章

无处不在,详解iOS集成第三方登录(SSO授权登录&lt;无需密码&gt;)

1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例. 这是上次写的iOS第三方社交分享:http://www.cnblogs.com/qingche/p/3727559.html 可以和今天的一起集成使用. 2.集成前的准备工作 2.1.去ShareSDK(现为Mob)注册帐号,下载SDK,然后添加自己的应用后得到AppKey 下载地址:http://sharesdk.cn/Download 2.2.申请第三方登录的Appkey 例如: 新浪微博.腾讯微博.QQ.微信.豆瓣应用.人

iOS 集成银联支付(绕过文档的坑,快速集成)

iOS 集成银联支付(绕过文档的坑,快速集成) 本文是投稿文章,作者:南栀倾寒当初集成支付宝的时候,觉得见了这么丑的代码,加上这么难找的下载地址,在配上几乎为零的文档,寒哥就要吐血了. 下午去集成银联,才知道血吐的早了. 下载地址:https://open.unionpay.com/upload/download/Development_kit85427986.rar 其实我找了半个小时 也不知道怎么就下载好了 这个我在Chrome的下载记录里找到的 解压之后会有这样的目录结构 Paste_Im

iOS集成支付宝

需要企业和支付宝签约这个是需要审核的[3天左右   以邮件形式告知你] 使用支付宝进行一个完整的支付功能,大致有以下步骤: 1>先与支付宝签约,获得商户ID(partner)和账号ID(seller) (这个主要是公司的负责) 2>下载相应的公钥私钥文件(加密签名用) 3>下载支付宝SDK(登录网站:http://club.alipay.com/)里面提供了非常详细的文档.如何签约.如何获得公钥私钥.如何调用支付接口. 4>生成订单信息 5>调用支付宝客户端,由支付宝客户端跟

iOS- 无处不在,详解iOS集成第三方登录(SSO授权登录&lt;无需密码&gt;)

1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例. 这是上次写的iOS第三方社交分享:http://www.cnblogs.com/qingche/p/3727559.html 可以和今天的一起集成使用. 2.集成前的准备工作 2.1.去ShareSDK(现为Mob)注册帐号,下载SDK,然后添加自己的应用后得到AppKey 下载地址:http://sharesdk.cn/Download 2.2.申请第三方登录的Appkey 例如: 新浪微博.腾讯微博.QQ.微信.豆瓣应用.人

iOS集成极光推送

iOS集成极光推送 一.配置APNs 苹果APNs(英文全称:Apple Push Notification Service) 1.配置开发证书 ![Uploading apns_13_803165.png -] 2.配置生产证书 和配置开发证书的流程相同. 3.将配置好的证书导出为 .p12 文件 一.注册极光推送帐号 可登录 极光推送官网 注册帐号. 注册成功后进入控制台 二.集成极光推送SDK sdk地址 我使用的是JPush-iOS-SDK-2.1.0.下载的文件里有个pdf文件iOS+

iOS 集成百度地图 位置偏移问题

iOS 集成百度SDK 请参考 百度地图官方文档 ,这里不就多啰嗦了 本文介绍的是在百度地图上根据经纬度,自定义气泡时,气泡位置的偏移,在我们天朝这种事是很常见的,也见怪不怪了,在项目中使用的百度地图的SDK,位置各种不对,百度地图和其他地图,如高德,他们都有自己的偏移算法,网上也有很多譬如 火星坐标转换之类的,都不能达到准备显示的效果. 其实百度SDK 有他自己偏移算法,使用百度偏移转换就可以了 BMKPointAnnotation *annotation = [[BMKPointAnnota

iOS集成alipay无线应用sdk错误问题

今天下载alipay无线应用sdk,首选感觉:我靠,藏的真深!下载后commad+R发现报错了.具体错误信息如图: 解决办法是将library search paths 里面的东西去掉所有的\\\  坑爹啊!如图: iOS集成alipay无线应用sdk错误问题

IOS:IOS集成开发和环境的介绍

集成开发环境的介绍 Xcode :iOS集成开发环境,也是编辑器,负责管理应用程序工程. Interface Builder:快速原型开发工具,可视化的组装用户UI接口的工具,在 Xcode 4.0以后集成到了Xcode中. Instruments:功能强大的性能调试工具,以及内存分析工具. iPhone Simulator:Mac OS X平台应用程序,它是模拟应用程序在真机上运行的 一个环境,但是并不能完全模拟所有功能. iOS SDK:iOS软件开发工具包

shareinstall之IOS集成

提示:以下代码(配置)由shareinstall根据当前应用动态生成,开发者可直接使用:按照以下步骤指引,10分钟即可完成IOS SDK集成.一.产品原理精确的App安装来源与携带参数安装 :shareInstall的核心价值在于,帮助Android/iOS开发者通过shareInstall提供的sdk,精确的获取app每一次安装的分享(或推广)来源.原理如下:开发者在分享的h5页面上集成 shareInstall web sdk,发布分享链接时在url上动态的拼接任意的自定义参数(如推广渠道号