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]; }