Apple Pay 初探之Objective-C/Swift

2.18日 Apple Pay正式登陆中国了,18号就开始绑定绑定卡片,上午坑次坑次的开始试,试了N多次都不行,可能是因为是苹果的Pay,大家都这么激动,CocoaChina 第一时间体验Apple Pay,能秒微信、支付宝?

首先,准备工作,在开发者中心建Merchant IDs 和Apple Pay证书。Merchant IDs的ID在代码中还是会用到的,建议域名的反向解析。

Apple Pay证书新建的时候要注意:创建一个CSR文件(在Mac上的应用程序文件夹,打开Utilities文件夹并启动钥匙串访问。在钥匙串访问下拉菜单中选择钥匙串访问>证书助理>请求从证书颁发机构颁发的证书。)


勾选上让我指定密钥对信息


苹果上规定是用ECC算法大小256位

生成CSR文件,然后上传,成功后,下载,双击。

如果KeyChain Access中显示了警示信息,表示未知授权签发证书或者无效证书发行人,那么要确保你已经在钥匙链中安装了Worldwide Developer Relations-G2和Apple Root CA-G2。你可以在这个地方下载这些东西:apple.com/certificateauthority.


证书
Xcode里边的设置

Xcode的设置,Gapabilities-->Apple Pay变成 ON,勾选Merchant IDs的ID,还要导入PassKit包

PassKit

基本的配置也就这么多了,好了,下边是代码时间,Objective-C与Swift:

Objective-C:

#import <PassKit/Passkit.h>和PKPaymentAuthorizationViewControllerDelegate 

//是否支持ApplePay系统版本,硬件ParentControl或者是否因为家长控制而不能支付

BOOLisSupportPay = [PKPaymentAuthorizationViewControllercanMakePayments];

if(!isSupportPay) {

return;

}else{

// do something

}

//是否支持这些支持方式(可能没有绑定卡)判断用户是否能够使用你提供的支付网络进行支付

NSArray*netwotks =@[PKPaymentNetworkPrivateLabel,PKPaymentNetworkVisa,PKPaymentNetworkMasterCard];

BOOLcanPay = [PKPaymentAuthorizationViewControllercanMakePaymentsUsingNetworks:netwotks];

if(!canPay) {

//setup

PKPaymentButton*setupButton = [PKPaymentButtonbuttonWithType:PKPaymentButtonTypeSetUpstyle:PKPaymentButtonStyleBlack];

[setupButtonaddTarget:selfaction:@selector(applePaySetupButtonPressed:)forControlEvents:UIControlEventTouchUpInside];

[self.viewaddSubview:setupButton];

setupButton.center=CGPointMake(self.view.frame.size.width/2,100);

}else{

//发起支付请求

//PKPaymentRequest

PKPaymentRequest*paymentRequest = [PKPaymentRequestnew];

paymentRequest.currencyCode=@"CNY";

paymentRequest.countryCode=@"CN";

paymentRequest.merchantIdentifier=@"merchant.com.hunk.assistants";

//构造金额

// 2.01 subtotal标签文本是一个用户可阅读的摘要项目描述信息,数额是相对应的支付数额

NSDecimalNumber*subtotalAmount = [NSDecimalNumberdecimalNumberWithMantissa:201exponent:-2isNegative:NO];

PKPaymentSummaryItem*subtotal = [PKPaymentSummaryItemsummaryItemWithLabel:@"Subtotal"amount:subtotalAmount];

// 2.00 discount对于折扣或优惠券,则需要把数额设成负数。

NSDecimalNumber*discountAmount = [NSDecimalNumberdecimalNumberWithMantissa:200exponent:-2isNegative:YES];

PKPaymentSummaryItem*discount = [PKPaymentSummaryItemsummaryItemWithLabel:@"Discount"amount:discountAmount];

// 0.01 grand total总计金额应该使用公司的名称做为其标签,使用所有其它项目的金额总和做为金额

NSDecimalNumber*totalAmount = [NSDecimalNumberzero];

totalAmount = [totalAmountdecimalNumberByAdding:subtotalAmount];

totalAmount = [totalAmountdecimalNumberByAdding:discountAmount];

PKPaymentSummaryItem*total = [PKPaymentSummaryItemsummaryItemWithLabel:@"Gou Min Company"amount:totalAmount];

NSArray*summaryItems =@[subtotal, discount, total];

paymentRequest.paymentSummaryItems= summaryItems;

// Shipping Method (skip now)

//支付标准

paymentRequest.supportedNetworks=@[PKPaymentNetworkPrivateLabel,PKPaymentNetworkMasterCard,PKPaymentNetworkVisa];

// Supports 3DS only还可以设置支持其他的

paymentRequest.merchantCapabilities=PKMerchantCapability3DS;

//配送信息以及mail地址

paymentRequest.requiredBillingAddressFields=PKAddressFieldEmail;

paymentRequest.requiredBillingAddressFields=PKAddressFieldEmail|PKAddressFieldPostalAddress;

PKContact*contact = [[PKContactalloc]init];

NSPersonNameComponents*name = [[NSPersonNameComponentsalloc]init];

name.givenName=@"John";

name.familyName=@"Appleseed";

contact.name= name;

CNMutablePostalAddress*address = [[CNMutablePostalAddressalloc]init];

address.street=@"1234 Laurel Street";

address.city=@"Atlanta";

address.state=@"GA";

address.postalCode=@"30303";

contact.postalAddress= address;

paymentRequest.shippingContact= contact;

// Storing Additional Information

// request.applicationData =

// Authorizing Payment show

PKPaymentAuthorizationViewController*viewController = [[PKPaymentAuthorizationViewControlleralloc]initWithPaymentRequest:paymentRequest];

if(!viewController) {

/* ... Handle error ... */

}else{

viewController.delegate =self;

[selfpresentViewController:viewController animated:YEScompletion:nil];

}

}

Swift:

import passkit 和PKPaymentAuthorizationViewControllerDelegate

//

letisSupportPay:Bool=PKPaymentAuthorizationViewController.canMakePayments()

if!isSupportPay {

return;

}else{

//do something

}

letnetWork:Array= [PKPaymentNetworkPrivateLabel,PKPaymentNetworkVisa,PKPaymentNetworkMasterCard]

letcanPay:Bool=PKPaymentAuthorizationViewController.canMakePaymentsUsingNetworks(netWork)

if!canPay {

//setup

letsetupButton =PKPaymentButton(type:PKPaymentButtonType.SetUp, style:PKPaymentButtonStyle.Black)

setupButton.addTarget(self, action:"applePaySetupButtonPressed:", forControlEvents:UIControlEvents.TouchUpInside)

self.view.addSubview(setupButton)

setupButton.center=CGPointMake(UIScreen.mainScreen().bounds.width/2,150)

}else{

//PKPaymentRequest

letpaymentRequest =PKPaymentRequest()

paymentRequest.currencyCode="CNY"

paymentRequest.countryCode="CN"

// merchantIdentifier

paymentRequest.merchantIdentifier="merchant.com.hunk.assistants"

paymentRequest.merchantCapabilities= [PKMerchantCapability.Capability3DS,PKMerchantCapability.CapabilityEMV]

paymentRequest.requiredShippingAddressFields=PKAddressField.All

//support Networks

paymentRequest.supportedNetworks= [PKPaymentNetworkVisa,PKPaymentNetworkMasterCard,PKPaymentNetworkAmex]

//subtotal

letsubTotal =PKPaymentSummaryItem(label:"Subtotal", amount:NSDecimalNumber(string:"101.00"))

//discount

letdicount =PKPaymentSummaryItem(label:"Discount", amount:NSDecimalNumber(string:"100.00"))

//tax

lettax =PKPaymentSummaryItem(label:"Tax", amount:NSDecimalNumber(string:"2.00"))

paymentRequest.paymentSummaryItems= [subTotal,dicount,tax]

//show the apple pay controller

letpayAuth =PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)

payAuth.delegate=self

self.presentViewController(payAuth, animated:true, completion:nil)

}

代码可以直接复制粘贴,但是配置的还需要亲力亲为。

参照:

官方:https://developer.apple.com/apple-pay/

http://www.open-open.com/lib/view/open1422324034345.html

Demo:

Swift :https://github.com/Billerlin/Swift_ApplePayDemo

OC:https://github.com/Billerlin/OCApplePayDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容