概述

iOS支付宝支付集成

详细

代码下载:http://www.demodashi.com/demo/10729.html

支付宝和微信都是业界的老大哥,相信大家都有所觉得文档、SDK都是各种坑吧(纯粹吐槽而已),本文先整理支付宝支付集成。

一、准备工作

1、向支付宝”签约" 成为支付宝的”商户”, 签约完成后, 支付宝会提供一些必要的数据给我们(商户ID-partner,帐号ID-支付宝帐号)

注意:签约成为支付宝商户,需要提供公司营业执照[http://act.life.alipay.com/shopping/before/help/index.html](http://act.life.alipay.com/shopping/before/help/index.html)

2、获取支付相关的 '私钥' 和 '密钥'

[https://doc.open.alipay.com/doc2/detail?treeId=44&articleId=103242&docType=1](https://doc.open.alipay.com/doc2/detail?treeId=44&articleId=103242&docType=1)

3、下载支付的SDK

[https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1](https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1)

二、集成支付宝SDK步骤

1、从官方Demo中把红色标注的文件添加进入项目中,记得选copy;

2、

点击项目名称,点击“Build Phases”选项卡,在“Link Binary with Librarles” 选项中,新增“AlipaySDK.framework”和“SystemConfiguration.framework” 两个系统库文件。如果项目中已有这两个库文件,可不必再增加;

添加下图中的库:

localhost:alipay mac$ ls
APAuthV2Info.h        Order.h            libssl.a
APAuthV2Info.m        Order.m            openssl
AlipaySDK.bundle    Util
AlipaySDK.framework    libcrypto.a
导入系统库
SystemConfiguration.framework

3、

添加Pch文件新建pch成功后,在pch文件中添加#import然后按照下图所示,进行修改pch的文件路径

也可以不设置,我这个是我需要设置#import <UIKit/UIKit.h> #import <Foundation/Foundation.h>,也可以不用使用,只在当前文件里添加相对应的使用即可,但是这样针对整个项目来说方便些

4、

修改SDK路径完成以上两步之后,会发现出现了一个经典的错误,找不到:#include解决这个问题,需要在Header Search Path中配置SDK中的点a(libssl.a/libcrypto.a)文件所在的路径,找到之后设置好正确的路径

点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字“search” 搜索,对“Header Search Paths”增加头文件路径:“$(SRCROOT)/项目名称/IntegratedAlipay/AlipayFiles”(注意:不包括引号,如果不是放到项目根目录下,请在项目名称后面加上相应的目录名);

根据你文件位置,我的是:

“$(SRCROOT)/QTXStudent/Classes/Alipay/AlipayFiles”

5、 为URL Types 添加支付宝回调scheme

点击项目名称,点击“Info”选项卡,在URL types里面添加一项,Identifier可以不填,URL schemes必须和appScheme的值相同,用于支付宝处理回到应用的事件;

为URL Types 添加支付宝回调scheme

6、在工程项目的plist文件中添加

iOS 9以后的系统需要添加支付宝分享的scheme到白名单中,scheme名为alipayshare

按如下形式添加即可:

7、在AppDelegate中处理事件回调:

/**这里处理微信/支付宝支付完成之后跳转回来*/
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{//如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDKif ([url.host isEqualToString:@"safepay"]) {//跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"支付宝客户端支付结果result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];}}];}if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"支付宝网页版result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];}}];}return YES;
}// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{//如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDKif ([url.host isEqualToString:@"safepay"]) {//跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"支付宝客户端支付结果result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];}}];}if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"支付宝网页版result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];}}];}return YES;
}

8、 在需要用的地方导入“AlipayHeader.h”,并使用“[AlipayRequestConfig alipayWithPartner:...”方法进行支付;

/***  配置请求信息,仅有变化且必要的参数**  @param partner            合作者身份ID 以 2088 开头由 16 位纯数字组成的字符串。*  @param sellerID           卖家支付宝账号 以 2088 开头由 16 位纯数字组成的字符串。*  @param outTradeNO         商户网站唯一订单号*  @param subject            商品名称*  @param body               商品详情*  @param totalFee           总金额*  @param notifyURL          服务器异步通知页面路径*  @param itBPay             未付款交易的超时时间*/
+ (void)alipayWithPartner:(NSString *)partnersellerID:(NSString *)sellerIDoutTradeNO:(NSString *)outTradeNOsubject:(NSString *)subjectbody:(NSString *)bodytotalFee:(NSString *)totalFeenotifyURL:(NSString *)notifyURL;

仅含有变化的参数:

+ (void)alipayWithPartner:(NSString *)partnersellerID:(NSString *)sellerIDoutTradeNO:(NSString *)outTradeNOsubject:(NSString *)subjectbody:(NSString *)bodytotalFee:(NSString *)totalFeenotifyURL:(NSString *)notifyURL {[self alipayWithPartner:partner sellerID:sellerID outTradeNO:outTradeNO subject:subject body:body totalFee:totalFee notifyURL:aliNotifyURL service:@"mobile.securitypay.pay" paymentType:@"1" inputCharset:@"utf-8" itBPay:@"30m" privateKey:aliPrivateKey appScheme:aliAppScheme];}

包含所有必要的参数:

+ (void)alipayWithPartner:(NSString *)partnersellerID:(NSString *)sellerIDoutTradeNO:(NSString *)outTradeNOsubject:(NSString *)subjectbody:(NSString *)bodytotalFee:(NSString *)totalFeenotifyURL:(NSString *)notifyURLservice:(NSString *)servicepaymentType:(NSString *)paymentTypeinputCharset:(NSString *)inputCharsetitBPay:(NSString *)itBPayprivateKey:(NSString *)privateKeyappScheme:(NSString *)appScheme {Order *order = [Order order];order.partner = partner;order.sellerID = sellerID;order.outTradeNO = outTradeNO;order.subject = subject;order.body = body;order.totalFee = totalFee;order.notifyURL = notifyURL;order.service = service;order.paymentType = paymentType;order.inputCharset = inputCharset;order.itBPay = itBPay;// 将商品信息拼接成字符串NSString *orderSpec = [order description];// 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncodeNSString *signedString = [self genSignedStringWithPrivateKey:aliPrivateKey OrderSpec:orderSpec];// 调用支付接口[self payWithAppScheme:appScheme orderSpec:orderSpec signedString:signedString];
}

生成signedString:

+ (NSString *)genSignedStringWithPrivateKey:(NSString *)privateKey OrderSpec:(NSString *)orderSpec {// 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncodeid<DataSigner> signer = CreateRSADataSigner(privateKey);return [signer signString:orderSpec];
}

支付:

+ (void)payWithAppScheme:(NSString *)appScheme orderSpec:(NSString *)orderSpec signedString:(NSString *)signedString {// 将签名成功字符串格式化为订单字符串,请严格按照该格式NSString *orderString = nil;if (signedString != nil) {orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec, signedString, @"RSA"];[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { // 网页版NSLog(@"支付宝支付结果 reslut = %@", resultDic);// 返回结果需要通过 resultStatus 以及 result 字段的值来综合判断并确定支付结果。 在 resultStatus=9000,并且 success="true"以及 sign="xxx"校验通过的情况下,证明支付成功。其它情况归为失败。较低安全级别的场合,也可以只通过检查 resultStatus 以及 success="true"来判定支付结果if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[ZLNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[ZLNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];}}];}}

9、

在本头文件中设置aliPartnerID、aliSellerAccount、aliNotifyURL、aliAppScheme和aliPrivateKey的值(所有的值在支付宝回复的邮件里面:注意,建议除appScheme以外的字段都从服务器请求);

这时候,我们支付就直接一句话搞定:

    // 支付宝支付[AlipayRequestConfig alipayWithPartner:aliPartnerID sellerID:aliSellerAccount outTradeNO:[self generateTradeNO] subject:@"测试" body:@"支付宝支付" totalFee:@"0.01" notifyURL:aliNotifyURL]; // notifyURL: 回调url@"http://www.xxx.com"[ZLNotificationCenter addObserver:self selector:@selector(paySucceed) name:ZLAliReturnSucceedPayNotification object:nil];[ZLNotificationCenter addObserver:self selector:@selector(payFailed) name:ZLAliReturnFailedPayNotification object:nil];

10、建议除appScheme以外的字段都从服务器请求!

建议除appScheme以外的字段都从服务器请求!建议除appScheme以外的字段都从服务器请求!

PS:重要的事情说三遍!!!

上面的第七步和第八步建议不要使用,直接用第九步去替代!建议除appScheme以外的字段都从服务器请求!

如果后台给你一个接口返回那些参数了,你就不用客户端去加密算法,只负责请求后台拿到这些参数再去请求支付宝即可.

下面例子是支付宝的拼接方式,请按照当前版本的相对应的拼接方式来.

// 支付宝支付
- (void)alipayPay {NSMutableDictionary *params = [NSMutableDictionary dictionary];params[@"orderNo"] = self.orderNo; // 订单号params[@"realAmt"] =  [NSString stringWithFormat:@"%.2lf", self.realAmt]; // 金额__weak __typeof(self) weakSelf = self;[QTXHttpTool post:QTX_aliPay_url params:params success:^(id json) {QTXLog(@"支付宝支付返回参数接口 请求成功-%@", json);if ([json[@"success"] isEqual:@(YES)]) {// 返回生成订单信息及签名NSString *signedString = json[@"data"][@"sign"];NSString *orderInfoEncoded = json[@"data"][@"orderInfo"];// NOTE: 如果加签成功,则继续执行支付if (signedString != nil) {// NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
//                NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@&sign_type=RSA", orderInfoEncoded, signedString];NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderInfoEncoded, signedString, @"RSA"];// NOTE: 调用支付结果开始支付[[AlipaySDK defaultService] payOrder:orderString fromScheme:XHHAppScheme callback:^(NSDictionary *resultDic) {QTXLog(@"reslut = %@",resultDic);if ([resultDic[@"resultStatus"] intValue] == 9000) {[QTXNotificationCenter addObserver:self selector:@selector(paySucceed) name:QTXWXReturnSucceedPayNotification object:nil];} else {[QTXNotificationCenter addObserver:self selector:@selector(payFailed) name:QTXWXReturnFailedPayNotification object:nil];}}];}} else {[MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]];}} failure:^(NSError *error) {[MBProgressHUD showError:@"暂无网络,稍后再试"];QTXLog(@"支付宝支付返回参数接口 请求失败-%@", error);}];}

11、支付宝集成失败相关问题

1. 报错 AL159

查看金额是否是两位小数,切不可拼接"元"

2. 报错“创建交易异常,请重新创建后再付款”

返回的状态码是“6001”,取消支付

当是用公司注册支付宝App时分配的商户账号登陆的支付宝,进行支付测试的。支付宝那边检测到是商户而不是普通的支付账号,商户支付给商户自己,所以支付失败!

三、其他补充

1、压缩文件截图

2、Alipay 包截图

目前是项目中直接操作, 在AlipayHeader.h文件里补充上你们项目的aliPartnerID, aliSellerAccount, aliNotifyURL, 具体可参考代码, 项目则能够直接运行!

代码下载:http://www.demodashi.com/demo/10729.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

iOS支付宝支付集成相关推荐

  1. ios 支付宝支付集成

    支付宝支付: 下载官方demo,把需要的framwork下载下来,在自己的工程中,新建文件夹,然后全部塞进去,到build phases中把需要的全部导入,其中xcode7以上需要多导入两个.a文件, ...

  2. iOS 支付宝支付集成获取私钥

    为什么80%的码农都做不了架构师?>>>    http://doc.open.alipay.com/doc2/apiList?docType=4 登录到支付宝开放平台,下载相关支付 ...

  3. iOS微信支付集成 SDK1 7 5

    最近做了一个新项目,涉及到支付宝和微信支付,支付宝和微信都是业界的老大哥,相信大家都有所觉得文档.SDK都是各种坑吧(纯粹吐槽而已),这是继上篇支付宝支付集成后接着的微信支付集成. 1.微信商户申请步 ...

  4. 李洪强iOS开发支付集成之支付宝支付

    iOS开发支付集成之支付宝支付 下载支付宝SDK 首先是开发包下载,还是比较难发现的,网上以前文章中的链接都打不开,我找了好久才找到的.最新的地址在这里(注意的是下载出来的SDK包里面并没有传说中的开 ...

  5. iOS开发支付集成之支付宝支付

    项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里. ...

  6. iOS 支付宝支付开发集成流程,这里记载的是签名保存在前台的集成,

    1 alipay 要做支付宝支付,对于新手,首先要了解的这个支付的业务逻辑,总体逻辑,下面就是基于支付宝SDK集成的交互流程, 1,公司boss用公司账号,申请支付宝账号,向支付宝签约 获得商户ID( ...

  7. ios支付宝支付--看我就够了

    神灯产品用户体验群:573431381 微信支付请看这里 http://blog.csdn.net/xoxo_x/article/details/52129632 本文文章将介绍支付宝支付,当第三方支 ...

  8. android蚂蚁金服支付宝支付集成步骤

    此篇仅限于android客户端集成步骤,查看全部的请转https://docs.open.alipay.com/204/105296/ 自支付宝 SDK  15.5.7 开始,打包方式更换为 AAR, ...

  9. iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析

    最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章,你也只要几分钟, ...

最新文章

  1. Memcached + MSM 实现Tomcat Session保持
  2. 华北理工大学轻工学院计算机在哪个校区,如何坐公交去路北区的华北理工大学轻工学院(北校区)-行政综合楼| Moovit...
  3. 介绍一些平时用得到的服务/组件
  4. dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半
  5. div+css使多行文字垂直居中?
  6. 【tool】常见功能测试点
  7. 数据港:专业数据中心服务提供商
  8. 夺命雷公狗TP3.2.3商城16-----无限极分类删除(玩法1:有子级分类的不能删除)...
  9. oracle存储过程和视图不存在,Oracle 创建存储过程 提示权限不足或者提示表和视图不存在问题...
  10. 移动端使用的WebKit私有属性(转)
  11. Soft-Skills-software-developers-manual
  12. 全国产化 飞腾 vpx板卡
  13. 车辆路径问题VRPTW之四【节约里程法ClarkWright算法】
  14. 分析2022年新型传播的.360后缀勒索病毒与数据恢复案例
  15. 走进“开源SDR实验室” 一起玩转4G/5G开源项目srsRAN(srsLTE升级版):安装方法+NB-IoT测试
  16. elementui的横向滚动,element-ui中隐藏组件el-scrollbar的使用
  17. AMCL中odom数据处理
  18. CPS攻击案例(一)——基于脉冲宽度调制PWM的无人机攻击
  19. ava中volatile关键字
  20. Red Giant Magic Bullet Suite介绍

热门文章

  1. 怎么在html中写当前时间,html页面怎么获取当前时间
  2. java线程 打印_java多线程实现 5秒一次打印当前时间
  3. 软件测试响应时间原则,对于性能测试结果的分析原则
  4. 第十六届全国大学生智能汽车竞赛(西部赛区) 竞速组成绩及获奖情况公示
  5. 2021年春季学期-信号与系统-第一次作业参考答案-第一题
  6. idea 快速定位到某一行的快捷键
  7. java计算筛子概率_剑指Offer解题报告(Java版)——n个骰子的点数 43
  8. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...
  9. c语言delay_C语言编程制作“古怪手电筒”,有光的时候就会亮,没光绝不会亮...
  10. php分层怎么实现,mvc-PHP如何做到分层开发?