AppPay

APP支付之使用ApplePay支付开发步骤

最近苹果推出了一种新的支付方式–ApplePay支付,虽然毁誉参半,但是不得不承认国内很多的公司还有商家已经开通了ApplePay,可能最先锋的莫过于肯德基和招商银行了。抛开优劣与否不说,作为一个开发者自然要第一时间把ApplePay搞懂搞通,用不用再另说。

ApplePay的支付流程

在具体去进行每一步操作的时候一定要先了解一下ApplePay的具体的操作流程。

这里是官方给出的开发者文档。所有的流程步骤还有逻辑流程都可以在这里找到答案。

开发者传送门

使用ApplePay开发同样的需要一个商户ID,开通权限,然后根据需求拼接支付请求。Apple Pay会对支付信息进行加密处理,以防止未获授权的第三方获取用户的支付信息。剩下的就是在自己的服务器上进行支付流程和处理了。

ApplePay的开发流程

1 获取证书

详细的官方指导可以参考这里

苹果证书帮助

习惯了苹果开发的人一定会料到,新的苹果支付一定是需要一个新的证书的,没错,需要创建一个新的商业证书。

选择右侧的[Merchant IDs],点击右上角的添加。

点击continue

点击register

现在新添加的Merchant ID已经显示出来了,可以添加到列表里了。

将刚刚添加的MerchantID选中,选择编辑。

将选项改为Yes,点Continue。再继续Continue。然后会需要上传一个证书。这个时候来到本地打开钥匙串,生成本地证书,我这里直接贴每一步的截图了。

将生成的证书放到桌面上。

选择刚才创建的证书进行上传,并且点击生成。

选择描述文件选项,创建一个描述文件,然后点开他的详细信息,点击编辑。

确认ApplePay的两个选项都是enable。如果不是,点击edit将其勾选上。

生成对应的描述文件,在本地运行添加到钥匙串中。

2 工程配置

创建一个新工程,需要注意两点:

1 在BuildIdentifier中设置的必须和描述文件一样。

2 在Capability标签中把ApplePay选项打开,并且将MerchantIDs选中,如下图

3 代码编写

1 导入头文件

导入需要的框架对应的头文件PassKit/PassKit.h 和AddressBook/AddressBook.h,并且遵循PKPaymentAuthorizationViewControllerDelegate

1
2
3
#import <PassKit/PassKit.h>
#import <AddressBook/AddressBook.h>
@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>

2 处理支付页面

支付界面都是采用的PKPaymentAuthorizationViewController,每一条支付信息可以采用PKPaymentSummaryItem来进行编辑,最后调用苹果支付的时候就是调用的这个页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
- (IBAction)payAction:(UIButton *)sender {
    if([PKPaymentAuthorizationViewController canMakePayments]) {
        NSLog(@"支持支付");
        // 我们后面创建出来的支付页面就是根据这个request
        PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
        // 商品目录
        PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"麻辣烫"
                                                                            amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];
        PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"肯德基"
                                                                            amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];
        PKPaymentSummaryItem *widget3 = [PKPaymentSummaryItem summaryItemWithLabel:@"海鲜大餐"
                                                                            amount:[NSDecimalNumber decimalNumberWithString:@"0.02"]];
        PKPaymentSummaryItem *widget4 = [PKPaymentSummaryItem summaryItemWithLabel:@"coderqi" amount:[NSDecimalNumber decimalNumberWithString:@"0.03"] type:PKPaymentSummaryItemTypeFinal];
        request.paymentSummaryItems = @[widget1, widget2, widget3, widget4];
//        request.countryCode = @"CN";
//        request.currencyCode = @"CNY";//人民币
        request.countryCode = @"US";
        request.currencyCode = @"USD";
        request.supportedNetworks = @[PKPaymentNetworkChinaUnionPay, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
        // 这里填的是就是我们创建的merchat IDs
        request.merchantIdentifier = @"merchant.com.coderqi.applepay.pay";
        request.merchantCapabilities = PKMerchantCapabilityEMV;
        //增加邮箱及地址信息
        request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
        // 根据request去创建支付页面
        PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
        // 设置代理
        paymentPane.delegate = self;
        if (!paymentPane) {
            NSLog(@"出问题了");
        } else {
            // 模态推出页面
            [self presentViewController:paymentPane animated:YES completion:nil];
        }
    } else {

        NSLog(@"该设备不支持支付");
    }
}

3 编写代理回调

接下来就是代理回调的处理,服务器接收到了我们的请求之后收到返回信息会调用对应的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma mark ----支付状态
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion{
    /* //这是老版,已过时
    NSError *error;
    ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress ,kABPersonAddressProperty);
    NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
    //这里模拟取出地址里的每一个信息。
    NSLog(@"%@",addressDictionary[@"State"]);
    NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
    // 这里需要将Token和地址信息发送到自己的服务器上,进行订单处理,处理之后,根据自己的服务器返回的结果调用completion()代码块,根据传进去的参数界面的显示结果会不同
    PKPaymentAuthorizationStatus status; // From your server
    completion(status);
    */
    //这是新版
	//拿到token,
    PKPaymentToken *token = payment.token;
    //拿到订单地址
    NSString *city = payment.billingContact.postalAddress.city;
    NSLog(@"city:%@",city);
    ///在这里将token和地址发送到自己的服务器,有自己的服务器与银行和商家进行接口调用和支付将结果返回到这里
    //我们根据结果生成对应的状态对象,根据状态对象显示不同的支付结构
    //状态对象
    PKPaymentAuthorizationStatus status = PKPaymentAuthorizationStatusFailure;
    completion(status);
}
#pragma mark ----支付完成
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {

    // 支付完成后让支付页面消失
    [controller dismissViewControllerAnimated:YES completion:nil];
}
时间: 2025-01-11 16:00:11

AppPay的相关文章

ios版本与xcode版本

iOS版本 iPhone版本 Xcode版本 其他 2003年 Xcode1.0 2005年4月29日 Xcode2.0 2007年1月9日 iPhone OS(iOS1): 虚拟键盘.谷歌地图 第一代iPhone:3.5英寸,触屏 谷歌研发安卓 2007年6月29日 iPhone2G 2007年10月26日 Xcode3.0 2008年7月11日 iOS2: 同步服务.云计算电子邮件.AppStore面世.GPS导航 iPhone 3G:支持3G.AppStore 同年,首款安卓手机T-Mob

iOS版本、iPhone版本、Xcode版本比对

iOS版本 iPhone版本 Xcode版本 其他 2003年 Xcode1.0 2005年4月29日 Xcode2.0 2007年1月9日 iPhone OS(iOS1): 虚拟键盘.谷歌地图 第一代iPhone:3.5英寸,触屏 谷歌研发安卓 2007年6月29日 iPhone2G 2007年10月26日 Xcode3.0 2008年7月11日 iOS2: 同步服务.云计算电子邮件.AppStore面世.GPS导航 iPhone 3G:支持3G.AppStore 同年,首款安卓手机T-Mob

iOS 银联支付

1:导入 #import "UPPayPlugin.h" #import "UPPayPluginDelegate.h" #import "DMCAlertCenter.h" pragma mark-------------------------------------------点击选择会员发起购买请求----------------------------- //日会元 - (IBAction)putong:(id)sender { _RM

远程部署tomcat脚本

脚本实现功能,从本地上传war包到指定服务器的指定目录,停止对应tomcat进程,替换上个版本的war包并进行备份(以防线上问题出现意外可以进行回滚). 第一个脚本主要是上传war包到指定服务器的指定目录,shell脚本参考如下,在本地或者发布机器上运行: #/bin/bash set -e cur_date=`date +'%Y%m%d %H:%M:%S'` current_day=`date +"%Y%m%d"` read -p "1.部署生产环境 2.测试环境 &quo

微信支付-公众号支付H5调用支付详解

微信公众号支付 最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付 需要我们配置微信公众号支付地址和测试白名单. 比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/ 那此处配置www.xxx.com/shop/pay/ 二.开发流程 借用微信公众号支付api(地址 http://pay.weixin.qq.com

微信、支付宝各种支付退款

java 版微信.支付宝各种支付退款 前言 最近整理了一下自己做过的各种支付退款的业务,并整理如下,只是大致思路代码不保证百分百没有问题但是都是经过我以前实际验证过并投入生产环境的,省略了一些和支付无关的业务流程. java 微信App支付 参考时序图了解大致流程. 微信App支付文档 大致步骤: 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付. 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口.参见统一下单API. 步骤3:统一下单接口返回正常的prepay_id,再按签名

.Net后台实现微信APP支付

上一节分享了微信小程序支付的后台,这一节来分享一下微信APP支付的后台.微信APP支付和微信小程序差别不大,微信APP支付后台不需要微信登录凭证.后台下单时交易类型(trade_type)不再是"JSAPI",而是"APP".商户后台传递给支付端的下单参数也有所不同.由于微信小程序支付和APP支付使用的APPID不同,索性直接写了两套支付,不再在代码里区分究竟该使用小程序支付的配置参数还是APP支付的参数. 官方是这样介绍的 具体实现: 新建AppPayConfig