Apple Pay开发-项目集成-详细设置

来源:互联网 发布:手机不能用数据上网 编辑:程序博客网 时间:2024/05/18 02:56

今天公司的 WeChatpay and QQWallet 迎来了新的兄弟:Apple Pay

o(╯□╰)o好累啊,都说好不做钱包支付的,结果还是硬做了。

ps:确实比蓝牙控制机器人好做


简单介绍一下:2月18日,苹果公司移动支付服务Apple Pay正式登陆中国。 Apple Pay是苹果公司在2014年发布的一种基于NFC(近距离无线通信)技术的移动支付服务。


话不多说啦,进入正题:

Apple Pay运行环境:操作系统最低iOS9.0以上,iPhone6以上设备。

②用开发者账号申请MerchantID和证书

③开始创建工程并设置:

起名的时候随意,但是要记住的是你的证书和你的bundleID是要对应的

然后在Capability开启Apple Pay(如图)


然后工程中会有配置文件Japan-ApplePay.entitlements


然后开始添加framework


工程配置完了,现在开始进入码代码阶段,直接进入ViewController.m


接下来就是开始写相应内容:

创建两个属性:

<span style="font-size:14px;">@property (nonatomic)NSMutableArray * accountlist;// 账户的账单@property (nonatomic)NSMutableArray * shopway;// 购买的方式</span>
写一个判断方法:

<span style="font-size:14px;">// 开始之前对设备进行判断- (BOOL)AccessApplePay{    // 判断当前设备支持支付或否    if (![PKPaymentAuthorizationViewController class]) {        // 为No的时候,主要是系统不支持,需要在9.0的环境以及iphone6以上机型        return NO;    }    if (![PKPaymentAuthorizationViewController canMakePayments]) {        // 原因同上        return NO;    }        // 判断用户是否可进行四种卡片的支付,分别是Amex、MasterCard、Visa与Union四种卡    NSArray *cardkind = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];    // 下面这步判断的是有没有绑定银行卡    if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:cardkind]) {        NSLog(@"没有绑定卡");        return NO;    }        NSLog(@"判断完成");    return YES;}</span><span style="font-size: 14px;"></span>
在判断方法结束之后执行这个:

<span style="font-size:14px;">// 对手机进行判定以后开始支付流程    if ([self AccessApplePay]) {        [self BeginProcess];    }</span>
已经很详细的设置了每一个参数
<span style="font-size:14px;">// 达到允许条件之后开始进入流程- (void)BeginProcess{    // 支付卡片的四种选项    NSArray *cardkind = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];        // 设置基本信息    PKPaymentRequest *payRequest = [[PKPaymentRequest alloc]init];    payRequest.countryCode = @"CN";         // 国家代码    payRequest.currencyCode = @"CNY";       // 币种        payRequest.merchantIdentifier = @"merchant.Japan-ApplePay";   // 申请的merchantID    payRequest.supportedNetworks = cardkind;                      // 用于支付的卡的种类        payRequest.merchantCapabilities = PKMerchantCapability3DS|PKMerchantCapabilityEMV;  // 设置支持的交易处理协议        payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;  // 送货的信息,设置地址,电话,姓名        // 设置送货方式    // 免费的快递    PKShippingMethod *freeShipping = [PKShippingMethod summaryItemWithLabel:@"EMS包邮" amount:[NSDecimalNumber zero]];    freeShipping.identifier = @"freeshipping";    freeShipping.detail = @"4-6 天";    // 需要加钱的快递    PKShippingMethod *expressShipping = [PKShippingMethod summaryItemWithLabel:@"顺丰速运" amount:[NSDecimalNumber decimalNumberWithString:@"10.00"]];    expressShipping.identifier = @"expressshipping";    expressShipping.detail = @"2-3 天";    // 在这里使用到了_shopway的数组    _shopway = [NSMutableArray arrayWithArray:@[freeShipping, expressShipping]];    //shippingMethods为配送方式列表,类型是 NSMutableArray,这里设置成成员变量,在后续的代理回调中可以进行配送方式的调整。    payRequest.shippingMethods = _shopway;        NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:10000 exponent:-2 isNegative:NO];// 小数点后两位1000.00    PKPaymentSummaryItem *subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"商品价格" amount:subtotalAmount];        NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithString:@"-10"];      // 折扣10    PKPaymentSummaryItem *discount = [PKPaymentSummaryItem summaryItemWithLabel:@"折扣" amount:discountAmount];        NSDecimalNumber *methodsAmount = [NSDecimalNumber zero];    PKPaymentSummaryItem *methods = [PKPaymentSummaryItem summaryItemWithLabel:@"EMS包邮" amount:methodsAmount];        NSDecimalNumber *totalAmount = [NSDecimalNumber zero];    totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];    totalAmount = [totalAmount decimalNumberByAdding:discountAmount];    totalAmount = [totalAmount decimalNumberByAdding:methodsAmount];    PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"喵喵的账户~" amount:totalAmount];// 收款方名字,账户    _accountlist = [NSMutableArray arrayWithArray:@[subtotal, discount, methods, total]];    //_accountlist是存放账单的可变数组,后续的代理中可以进行支付金额的调整。    payRequest.paymentSummaryItems = _accountlist;            // 启用ApplePay的页面控件    PKPaymentAuthorizationViewController *view = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:payRequest];    view.delegate = self;    [self presentViewController:view animated:YES completion:nil];}</span><span style="font-size: 14px;"></span>
最后不要忘记协议代理:

<span style="font-size:14px;">#pragma mark 支付的代理设置- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller                  didSelectShippingContact:(PKContact *)contact                                completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKShippingMethod *> * _Nonnull, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{    //contact送货地址信息,PKContact类型    NSPersonNameComponents *name = contact.name;                //联系人 姓名    CNPostalAddress *postalAddress = contact.postalAddress;     //联系人 地址    NSString *emailAddress = contact.emailAddress;              //联系人 邮箱    CNPhoneNumber *phoneNumber = contact.phoneNumber;           //联系人 手机    NSString *supplementarySubLocality = contact.supplementarySubLocality;        completion(PKPaymentAuthorizationStatusSuccess, _shopway, _accountlist);}- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller                   didSelectShippingMethod:(PKShippingMethod *)shippingMethod                                completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{    // 送货方式回调,如果需要根据不同的送货方式进行支付金额的调整,比如EMS包邮和付费顺丰配送,可以实现该代理    PKShippingMethod *oldShippingMethod = [_accountlist objectAtIndex:2];    PKPaymentSummaryItem *total = [_accountlist lastObject];    total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount];    total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount];        [_accountlist replaceObjectAtIndex:2 withObject:shippingMethod];    [_accountlist replaceObjectAtIndex:3 withObject:total];        completion(PKPaymentAuthorizationStatusSuccess, _accountlist);}// 支付银行卡回调,看情况根据不同的银行调整,然后付费金额-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{        completion(_accountlist);}// 送货地址的回调-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingAddress:(ABRecordRef)address completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKShippingMethod *> * _Nonnull, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{    }- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller                       didAuthorizePayment:(PKPayment *)payment                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion {    // 支付验证    PKPaymentToken *payToken = payment.token; // 与服务器验证支付是否有效        PKContact *billingContact = payment.billingContact;     //账单信息    PKContact *shippingContact = payment.shippingContact;   //送货信息    PKContact *shippingMethod = payment.shippingMethod;     //送货方式        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];}</span><span style="font-size:18px;"></span>

然后我们就可以运行了~效果如下:





0 0