Apple Pay的实现

首先是搜到的大神写的全套知识点:http://www.jianshu.com/p/8d7b86f1d142

http://www.cnblogs.com/dashunzi/archive/2016/02/23/ApplePay.html

银联和Apple Pay的关系

http://www.voidcn.com/blog/l964968324/article/p-5737385.html

创建AppID

给APP添加Apple Pay的权限

申请创建MerchantID

编辑Merchant ID设置支持的支付的国家地区(即是否支持国外支付,上传一个自己生成的CRS文件加密时使用)

创建描述文件,项目设定中开启支付功能,选择自己创建的Merchant ID这个是多选的,应该是可以针对不同的支付对象吧

注意事项和点项总结:

唤起苹果支付必须使用苹果提供的按钮样式否者奔溃:

 1 //    Type : 类型
 2 
 3 //    PKPaymentButtonTypePlain
 4 
 5 //    PKPaymentButtonTypeBuy
 6 
 7 //    PKPaymentButtonTypeSetUp
 8 
 9     
10 
11 //    style : 样式
12 
13 //    PKPaymentButtonStyleWhite
14 
15 //    PKPaymentButtonStyleWhiteOutline
16 
17 //    PKPaymentButtonStyleBlack
18 
19 
20 
21     PKPaymentButton * payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypePlain style:PKPaymentButtonStyleWhiteOutline];
22 
23     payButton.center = self.view.center;
24 
25     [payButton addTarget:self action:@selector(payAction:) forControlEvents:UIControlEventTouchUpInside];
26 
27     [self.view addSubview:payButton];

唤起支付控件,苹果支付只是达到个信息传递功能,至于支付的完成还有成功还是失败的状态判定,需要通过后台和银行之间的接口调用来实现(银行和后台之间交互实现支付功能,后台和前端交互获取支付结果)

-(void)payAction:(PKPaymentButton *)button
{
    //系统提供了API来判断当前设备是否支持Apple Pay支付的功能。
    if([PKPaymentAuthorizationViewController canMakePayments]){
        //设备支持支付
        //PKPayment类来创建支付请求
        PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
        //国家 //HK 香港   CN :  中国大陆
        request.countryCode = @"CN";
        //人民币 // HKD  港币  CNY : 人民币    USD : 美元
        request.currencyCode = @"CNY";// 其他国家以及币种的缩写自行百度
        ///由商家支持的支付网络 所支持的卡类型
        //此属性限制支付卡,可以支付。
        //        PKPaymentNetworkAmex : 美国运通
        //        PKPaymentNetworkChinaUnionPay : 中国银联
        //        PKPaymentNetworkVisa  : Visa卡
        //        PKPaymentNetworkMasterCard : 万事达信用卡

        //        PKPaymentNetworkDiscover
        //        PKPaymentNetworkInterac
        //        PKPaymentNetworkPrivateLabel
        //        PKEncryptionSchemeECC_V2
        request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkDiscover, PKPaymentNetworkInterac, PKPaymentNetworkMasterCard, PKPaymentNetworkPrivateLabel, PKPaymentNetworkVisa, PKEncryptionSchemeECC_V2];
        
        //        PKMerchantCapability3DS // 美国的一个卡 必须支持
        //        PKMerchantCapabilityEMV // 欧洲的卡
        //        PKMerchantCapabilityCredit //信用卡
        //        PKMerchantCapabilityDebit //借记卡
        
        //商家的支付处理能力
        //PKMerchantCapabilityEMV : 他的旗下有三大银行 : 中国银联 Visa卡 万事达信用卡
        //也就是说merchantCapabilities指的支付的银行卡的范围。
        request.merchantCapabilities =   PKMerchantCapabilityDebit | PKMerchantCapabilityCredit | PKMerchantCapabilityEMV;
        
        //merchantIdentifier 要和你在开发者中心生成的id保持一致
        request.merchantIdentifier = @"merchant.com.ruizhihulian.applePay";
        
        
        //需要的配送信息和账单信息
        request.requiredBillingAddressFields = PKAddressFieldAll;
       //(配送信息非必须)
        request.requiredShippingAddressFields = PKAddressFieldAll;

        //运输方式(没有配送也就没有配送方式)
        NSDecimalNumber * shippingPrice = [NSDecimalNumber decimalNumberWithString:@"0.01"];
        PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"快递公司" amount:shippingPrice];
        method.detail = @"24小时送到!";
        method.identifier = @"kuaidi";
        request.shippingMethods = @[method];
        request.shippingType = PKShippingTypeServicePickup;
        
        
        // 2.9 存储额外信息
        // 使用applicationData属性来存储一些在你的应用中关于这次支付请求的唯一标识信息,比如一个购物车的标识符。在用户授权支付之后,这个属性的哈希值会出现在这次支付的token中。
        request.applicationData = [@"商品ID:123456" dataUsingEncoding:NSUTF8StringEncoding];
        
        
        //添加物品到支付页
        //创建物品并显示,这个对象描述了一个物品和它的价格,数组最后的对象必须是总价格。
        //使用PKPaymentSummaryItem来创建商品信息
        
        PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品一" amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];
        
        PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品二" amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];
        
        PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"收款方名称" amount:[NSDecimalNumber decimalNumberWithString:@"0.02"]];
        
        request.paymentSummaryItems = @[widget1, widget2, total];
        //        request.paymentSummaryItems = @[widget1];
        
        //显示认证视图
        PKPaymentAuthorizationViewController * paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
        paymentPane.delegate = self;
        
        [self presentViewController:paymentPane animated:TRUE completion:nil];
        
    }else{
        //设备不支持支付
        NSLog(@"设备不支持支付");
    }
}

 必须实现两个回调函数,否者会出现找不到方法而程序出错

#pragma mark -PKPaymentAuthorizationViewControllerDelegate
//这个代理方法指的是支付过程中会进行调用
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
    //payment:代表的是一个支付对象, 支付相关的所有信息都在他的身上:1.token.   2.address
     
    //completion : 是一个回调的block  ,block回调的参数,直接影响到界面结果的展示。
    
    /*PKPaymentAuthorizationStatus 交易状态
    
    PKPaymentAuthorizationStatusSuccess, // 成功交易
    PKPaymentAuthorizationStatusFailure // 没有授权交易
    PKPaymentAuthorizationStatusInvalidBillingPostalAddress  // 拒绝账单地址
    PKPaymentAuthorizationStatusInvalidShippingPostalAddress, // 拒绝收货地址
    PKPaymentAuthorizationStatusInvalidShippingContact //提供的信息不够
    PKPaymentAuthorizationStatusPINRequired  // 交易需要指纹输入
    PKPaymentAuthorizationStatusPINIncorrect // 输入不正确,重新输入.
    PKPaymentAuthorizationStatusPINLockout// 输入次数超出
    */
    
    PKPaymentToken * token = payment.token;
    NSLog(@"获取token---%@", token);
    //获取订单地址
    NSString * address = payment.billingContact.postalAddress.city;
    NSLog(@"获取到地址: %@", address);
    NSLog(@"验证通过后, 需要开发者继续完成交易");
    // 在这个位置, 我们开发人员需要把token值和商品的其他信息如:地址 id  这些 , 上传到自己公司的服务器。然后公司的服务器和银行的商家接口进行接口的调用,并将接口调用返回的支付结果信息返回到这里。
    //根据不同的支付结果状态,让block调用不同的交易状态;
    //比如说:服务器调用支付结果是成功的, 就让        completion(PKPaymentAuthorizationStatusSuccess);          如果失败 调用        completion(PKPaymentAuthorizationStatusFailure);
    //如:
    BOOL isSuccess = YES;
    if (isSuccess) {
        completion(PKPaymentAuthorizationStatusSuccess);
    }else
    {
        completion(PKPaymentAuthorizationStatusFailure);
    }
}
// 当授权成功之后或者取消授权之后会调用这个代理方法
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
    NSLog(@"取消或者交易完成");
    [self dismissViewControllerAnimated:YES completion:nil];
}

 

posted @ 2017-07-06 15:15  雨筱逸悠  阅读(303)  评论(0编辑  收藏  举报