Apple Pay 在线远程支付_远程申办苹果终端支付业务是有什坏处-程序员宅基地

技术标签: 技术类  苹果  支付  Apple-Pay  ios  

Apple Pay 详细集成文档

Apple pay刚推出的时候可以说“绑定的过程很崩溃,用的时候很心碎”,为什么要这样说呢?因为刚一推出,就有大量的人同时绑定,银行和银联又处理不过来,就会出现以下界面,用的时候很心碎是指太TMD方便了,几百块说没就没呀,你说心碎不!哭:

这里写图片描述

这里写图片描述

一:适用于以下设备

这里写图片描述

注:操作系统必须iOS9.2以上版本watch OS 2.1以上版本,可以在模拟器上面运行,xcode7.2.1以上 + iPhone6S 以上 + 9.2系统以上,系统会绑定几种虚拟的银行卡,和几个联系人,方便调试,支付也不会发生真实的付款。

二:金融交易分为:在线远程支付和近场支付

1.在线远程支付:是指在应用内完成物品的购买,一般在电商应用内比较常见(Apple Pay 远程支付商户入网采取大商户、大行业优先、直联接入优先的原则。同时, 优先发展零售业、住宿/餐饮和休闲娱乐业、居民服务和商业服务、教育/卫生行业。暂时限制接 入互联网金融(基金、理财、直销银行、P2P、信贷还款、融资租赁等)、信用卡还款、货款回 缴、烟草、房地产、彩票以及其他苹果公司限制接入 Apple Pay 的行业及应用场景
)。
这里写图片描述

这里写图片描述

环境配置:在接入Apple Pay之前,首先要申请MerchantID。

第一步:首先明确,你要为哪一个应用做或者增加Apple Pay功能:

这里写图片描述

第二步:使该应用具备Apple Pay的能力:

这里写图片描述

第三步:配置Merchant IDs

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这时回到你的应用,选择上面配置好的Merchant IDs

这里写图片描述

当你完成上面操作时,再回到apple ID时,这时查看你的应用你会发现如下界面:

这里写图片描述

到这里环境配置已经完毕。

二:代码体现

1.首先导入头文件:

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

2.代码展示

//点击支付按钮要执行的事件

- (IBAction)ApplePayBtnClicked:(id)sender {

    if (![PKPaymentAuthorizationViewController class]) {

        //PKPaymentAuthorizationViewController需iOS8.0以上支持
        NSLog(@"操作系统不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");

        return;
    }
    //检查当前设备是否可以支付
    if (![PKPaymentAuthorizationViewController canMakePayments]) {
        //支付需iOS9.0以上支持
        NSLog(@"设备不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");
        return;
    }

    //创建支付请求
    //设置币种、国家码及merchant标识符等基本信息
    PKPaymentRequest *payRequest = [[PKPaymentRequest alloc]init];
    payRequest.countryCode = @"CN";     //国家代码
    payRequest.currencyCode = @"CNY";       //RMB的币种代码
    payRequest.merchantIdentifier = @"申请的merchantID";  //申请的merchantID
    //配置请求的支付网络

    //检查用户是否可进行某种卡的交易,是否支持Amex、MasterCard、Visa与银联四种卡,根据项目需要进行校验
    NSArray *supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];

    if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworks]) {
        NSLog(@"你需要绑定支付卡");
        return;
    }


    payRequest.supportedNetworks = supportedNetworks;   //用户可进行支付的银行卡

    payRequest.merchantCapabilities = PKMerchantCapability3DS|PKMerchantCapabilityEMV;      //设置支持的交易处理协议,3DS必须支持,EMV为可选,目前国内的话还是使用两者吧

    //    payRequest.requiredBillingAddressFields = PKAddressFieldEmail;
    //如果需要邮寄账单可以选择进行设置,默认PKAddressFieldNone(不邮寄账单)

    payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;
    //送货地址信息,这里设置需要地址和联系方式和姓名,如果需要进行设置,默认PKAddressFieldNone(没有送货地址)
    //
    //设置配送方式可以设置多种供用户选择
    PKShippingMethod *free = [PKShippingMethod summaryItemWithLabel:@"顺丰包邮" amount:[NSDecimalNumber zero]];
    free.identifier = @"free";
    free.detail = @"一天内送达";

    PKShippingMethod *quick = [PKShippingMethod summaryItemWithLabel:@"极速送达" amount:[NSDecimalNumber decimalNumberWithString:@"15.00"]];
    quick.identifier = @"quick";
    quick.detail = @"1 小时内 送达";

//    self.shippingMethod = [NSMutableArray arrayWithCapacity:@[free,quick]];

    //shippingMethods为配送方式列表,类型是 NSMutableArray,这里设置成成员变量,在后续的代理回调中可以进行配送方式的调整。
    payRequest.shippingMethods = @[free,quick];



    NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:8888 exponent:-2 isNegative:NO];   //88.88
    PKPaymentSummaryItem *subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"商品价格" amount:subtotalAmount];


    NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithString:@"-66.66"];      //-66.66
    PKPaymentSummaryItem *discount = [PKPaymentSummaryItem summaryItemWithLabel:@"优惠折扣" amount:discountAmount];

    NSDecimalNumber *methodsAmount = [NSDecimalNumber zero];
    PKPaymentSummaryItem *methods = [PKPaymentSummaryItem summaryItemWithLabel:@"顺丰包邮" amount:methodsAmount];

    NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
    totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];
    totalAmount = [totalAmount decimalNumberByAdding:discountAmount];
    totalAmount = [totalAmount decimalNumberByAdding:methodsAmount];
    PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"Obama" amount:totalAmount];  //要支付给谁

    summaryItems = [NSMutableArray arrayWithArray:@[subtotal, discount, methods, total]];
    //summaryItems为账单列表,类型是 NSMutableArray,这里设置成成员变量,在后续的代理回调中可以进行支付金额的调整。
    payRequest.paymentSummaryItems = summaryItems;


    //ApplePay控件
    PKPaymentAuthorizationViewController *view = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:payRequest];

    //view可能创建不成功,因为payRequest可能创建失败或无效
    if (!view) {

        return;
    }

    view.delegate = self;

    [self presentViewController:view animated:YES completion:nil];


}



#pragma mark - 授权的代理方法

//controller:授权控制器
//payment:支付对象 token,address地址
//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;     //送货方式

    //在这里将token,送货信息,送货方式发送到自己的服务器,自己的服务器和银行与商家对接支付,并将结果防回到这里,根据结果生成对应的状态对象,根据状态对象显示不同的支付结果
    //等待服务器返回结果后再进行系统block调用
    //状态对象
    BOOL isSuccessed = YES;

    if (isSuccessed) {
        completion(PKPaymentAuthorizationStatusSuccess);
    }else{
        completion(PKPaymentAuthorizationStatusFailure);
    }




}

//当授权结束或取消支付,就会调用该方法
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{

    NSLog(@"授权结束");

    //让展示界面消失
    [controller dismissViewControllerAnimated:YES completion:nil];

}
//该方法可以选择实现
//- (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;  //补充信息,iOS9.2及以上才有
//
//    //送货信息选择回调,如果需要根据送货地址调整送货方式,比如普通地区包邮+极速配送,偏远地区只有付费普通配送,进行支付金额重新计算,可以实现该代理,返回给系统:shippingMethods配送方式,summaryItems账单列表,如果不支持该送货信息返回想要的PKPaymentAuthorizationStatus
//    completion(PKPaymentAuthorizationStatusSuccess, self.shippingMethod, summaryItems);
//}
//该方法根据实际情况,选择实现
//- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
//                   didSelectShippingMethod:(PKShippingMethod *)shippingMethod
//                                completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{
    
//    //配送方式回调,如果需要根据不同的送货方式进行支付金额的调整,比如包邮和付费加速配送,可以实现该代理
//    PKShippingMethod *oldShippingMethod = [summaryItems objectAtIndex:2];
//    PKPaymentSummaryItem *total = [summaryItems lastObject];
//    total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount];
//    total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount];
//
//    [summaryItems replaceObjectAtIndex:2 withObject:shippingMethod];
//    [summaryItems replaceObjectAtIndex:3 withObject:total];
//
//    completion(PKPaymentAuthorizationStatusSuccess, summaryItems);
//}


//根据需求,选择实现。支付银行卡回调,如果需要根据不同的银行调整付费金额,可以实现该代理

//-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{
    
//

//    completion(summaryItems);
//}


二:金融交易之近场支付(目前银行类客户端比较常见)
在银行类客户端中基本都是跳到wallet应用( [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@“shoebox://“]];),以后的操作都有用户自己管理。当然银行自己的App也可以对卡进行一些:挂失,解挂,注销等操作,因每个银行需求不一样,至于在银行客户端中怎样进行挂失,解挂等,行内人员(主要tsm系统)提供接口,页面设计有行内决定,有开发人员自行开发。

这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lifufa/article/details/51123758

智能推荐

uni app 使用分段器之后如何动态自定义导航栏标题_uni-segmented-control items 动态-程序员宅基地

文章浏览阅读2k次。1.在官网引用分段器 详细地址 https://ext.dcloud.net.cn/plugin?id=54 看会就明白//分段器使用<uni-segmented-control :current="current" :values="items.map(i=>i.title)" @clickItem="onClickItem" style-type="text" activ..._uni-segmented-control items 动态

数据库基础-SQL_sql xx as()-程序员宅基地

文章浏览阅读324次。二、SQL 格式 检索数据2.1 Select 需要得到的列名1,列名2,AVG(DISTINCT XXX),完整的查询子句 From 表名1,表名2 (自动连接) (select 子查询) 表名3 AS XX (表别名) 内联结:表名 INNER JOIN 表名 ON ..._sql xx as()

matlab第三方硬件支持包下载和安装_matlab获取硬件支持包-程序员宅基地

文章浏览阅读1.6k次。然后在matlab安装根目录找到\bin\win64文件夹,(可能还需要把上面下载的硬件支持包的文件移到\win64文件夹下,但是似乎没有用到,不确定,太麻烦没去验证)打开cmd跳转到该文件夹下面,运行如下程序:其中,最后面的文件目录是自己下载的硬件支持包所在目录,不然会出错提示没有找到可安装的兼容支持包。根据链接:https://www.mathworks.com/support/install/support-software-downloader.html下载 下载器,然后按步骤进行可以正常安装。_matlab获取硬件支持包

程序员求职之道(《程序员面试笔试宝典》)之求职有用网站及QQ群一览表_程序员面试宝典官网-程序员宅基地

文章浏览阅读4k次,点赞4次,收藏18次。求职有用网站及QQ群一览表_程序员面试宝典官网

ITE联阳半导体 HDMI2.0b/MHL2.2转LVDS芯片 支持3D_it68052-程序员宅基地

文章浏览阅读3.5k次。IT68052:HDMI 2.0b/MHL2.2转LVDS芯片1. FeaturesDual port HDMI2.0b ReceiverSupport 2 HDMI1.4/HDMI2.0b (18Gb/s) input ports (port-0, port-1)Support HDMI1.4, HDMI2.0b/MHL2.2 dual mode on input por..._it68052

VUE 懒加载树实现增删改查_vue table tree 增删改查-程序员宅基地

文章浏览阅读810次。根据后台接口,一级树节点:一个查询接口,二级树节点:根据一级树节点的id调用接口查询;实际情况为只有两级节点;测试提出一级树节点的收放按钮如果没有子节点的话不要显示。。。这个让后台接口加个布尔类型的属性,,一级查询接口的时候直接接收就可以了。前端做太麻烦了感觉,还没改。<template><divid="ath_group"><div..._vue table tree 增删改查

随便推点

学生如何提高专业英文阅读能力-施一公-程序员宅基地

文章浏览阅读471次。学生如何提高专业英文阅读能力-施一公从小到大,我感性思维多一些,不善于读书。85至89年在清华生物系读本科期间,从未读过任何一种英文专业期刊。我受到的与英文阅读相关的训练一共只有两个。一是我在1986年暑假期间选修的时任系主任的蒲慕明老师开设的《生物英语》系列讲座,隐隐约约记得蒲先生让我们阅读一些诸如DNA双螺旋发现之类的科普性英文文章,很有意思。但时间较短,暑假过后也没有养成读英文文章的习惯_学生如何提高专业英文阅读能力

图解系列--防火墙_lan中心辐射访问-程序员宅基地

文章浏览阅读673次。防火墙_lan中心辐射访问

webstorm的egg debug断点无效_webstorm 断点进不来源码-程序员宅基地

文章浏览阅读3.1k次。环境egg 2.6.1 + TypeScript 3.0.0 、node.js 12.13.1 、IntelliJ IDEA 2019.3.1遇到的问题根据egg官网配置的idea后,仍无法在idea内打有效断点。起初以为是我使用了typescript的缘故,但在Chrome的调试器中断点是能够成功的。解决方案Edit Configurations => 新增 => A..._webstorm 断点进不来源码

【进阶】基于U8g2的OLED多级菜单显示教程_u8g2 菜单-程序员宅基地

文章浏览阅读4.6k次,点赞61次,收藏138次。浑浑噩噩好久了(从考研结束后,基本到现在没有学习过啥新知识,原先的知识也有忘掉了),终于静下来写一下这个项目了,今天带来一个还不错的综合项目教程,让小伙伴的能拥有属于自己特有OLED菜单显示,当然我写的代码很烂,只做参考框架,,废话少说,接下来进入正题吧!!!一、前期准备。_u8g2 菜单

Taming Diffusion Models for Audio-Driven Co-Speech Gesture Generation论文代码成功复现-程序员宅基地

文章浏览阅读315次,点赞8次,收藏9次。由于源码在Linux系统下运行,安装包文件中的pyarrow==0.14.1不支持windows系统,所以选择安装pyarrow==0.15.0。

云原生第1课:云原生发展历程与技术体系-程序员宅基地

文章浏览阅读689次。点击上方“程序猿技术大咖”,关注并选择“设为星标”回复“加群”获取入群讨论资格!本篇文章来自《华为云云原生王者之路训练营》黄金系列课程第1课,由CNCF大使、Kubernetes社区Mai..._云原生发展史

推荐文章

热门文章

相关标签