IOS开发之—— iOS 支付 [支付宝、银联、微信]
支付宝iOSsdk官方下载sdk地址:https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash
快捷支付(无线)是一种程序式的支付方式,在手机、掌上电脑等无线设备的应用程序内,买家可通过支付宝进行付款购买特定服务或商品,资金即时到账。
第一步:
1 公司账户:企业支付宝账号就申请 注册企业账号,如果是个人账户,就申请个体工商户。

接入前准备阶段
正式接入阶段
服务端 负责生成订单及签名,及接受支付异步通知。
客户端 负责使用服务端传来的订单信息调用支付宝支付接口,及根据SDK同步返回的支付结果展示结果页。
服务端接入
私钥必须放在服务端,签名过程必须放在服务端。
- 准备
- 确定开发语言
- 确定编码格式
- 确定签名方式(PID + 密钥)
- 确定服务器配置
- 支付订单参数拼装及加签
- 通知处理什么时候会通知?收到通知时注意验签。
客户端接入
导入代码
步骤1:启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下,并导入到项目工程中。
1
2
|
AlipaySDK.bundle AlipaySDK.framework |
在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
其中,需要注意的是:
- 如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
- 如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib(如下图)。
步骤2:在需要调用AlipaySDK的文件中,增加头文件引用。
1
|
# import <AlipaySDK/AlipaySDK.h> |
如果你的app基于9.0编译,那么为了适配iOS9.0中的App Transport
Security(ATS)对http的限制,这里需要对支付宝的请求地址alipay.com、alipayobjects.com做例外,在app对
应的info.list中添加如下配置(文中以XML格式描述)。
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
|
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>alipay.com</key> <dict> <key>NSIncludesSubdomains</key> < true /> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> < true /> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1. 0 </string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> < false /> </dict> <key>alipayobjects.com</key> <dict> <key>NSIncludesSubdomains</key> < true /> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> < true /> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1. 0 </string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> < false /> </dict> </dict> </dict> |
说明:
如果商户配置了如下的配置:
1
2
3
4
|
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key>< true /> </dict> |
则上述的NSAppTransportSecurity可以不配置。
步骤3:对接,对接之前,需要索取后台的很多信息
//合作身份者id,以2088开头的16位纯数字
#define PartnerID @"2088一串数字"
//收款支付宝账号/接口名称
#define SellerID @"2944983890@qq.com"
//支付宝公钥
#define AlipayPubKey @"MIGf一串很长很长信息"
//商户私钥,自助生成
#define PartnerPrivKey @"很长很长很长"
//服务器异步通知页面路径/支付结果,支付宝会通知服务器
alipayNotifServerURL = @
"一个网址"
;
步骤4:配置请求信息。
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
|
Order *order = [[Order alloc] init]; order.partner = partner; order.seller = seller; order.tradeNO = [self generateTradeNO]; //订单ID(由商家?自?行制定) order.productName = product.subject; //商品标题 order.productDescription = product.body; //商品描述 order.amount = [NSString stringWithFormat:@ "%.2f" ,product.price]; //商 品价格 order.service = @ "mobile.securitypay.pay" ; order.paymentType = @ "1" ; order.inputCharset = @ "utf-8" ; order.itBPay = @ "30m" ; //应用注册scheme,在AlixPayDemo-Info.plist定义URL types NSString *appScheme = @ "alisdkdemo" ; //将商品信息拼接成字符串 NSString *orderSpec = [order description]; NSLog(@ "orderSpec = %@" ,orderSpec); //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode id<DataSigner> signer = CreateRSADataSigner(privateKey); NSString *signedString = [signer signString:orderSpec]; //将签名成功字符串格式化为订单字符串,请严格按照该格式 NSString *orderString = nil; if (signedString != nil) { orderString = [NSString stringWithFormat:@ "%@&sign=\"%@\"&sign_type=\"%@\"" , orderSpec, signedString, @ "RSA" ]; [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { //【callback处理支付结果】 NSLog(@ "reslut = %@" ,resultDic); }]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } |
详细可参见Demo中示例文件
- AliSDKDemo\APViewController.h
- AliSDKDemo\APViewController.m
- AliSDKDemo\Order.h
- AliSDKDemo\Order.m
步骤5:调用支付宝
1
2
3
4
5
6
7
8
9
10
11
12
|
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@ "reslut = %@" ,resultDic); if ([resultDic[@ "resultStatus" ] intValue]==9000) { //进入充值列表页面 NSLog(@ "支付成功" ); } else { NSString *resultMes = resultDic[@ "memo" ]; resultMes = (resultMes.length<=0?@ "支付失败" :resultMes); NSLog(@ "%@" ,resultMes); } }]; |
你可能会发现回调不行->设置回调shema
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//上面支付时已经传给了支付宝客户端回调shema名称 NSString *appScheme = URLScheme; //具体设置shema方法此处就不再累赘,这儿需要处理来自支付宝shema回调,才能完成上面方法的block回调 在APPDelegate - - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@ "result = %@" ,resultDic); }]; return YES; } |
2.1 请去看银联文档和demo
2.2 导入对应的库
SDK说明
SDK分为以下两个版本:
① 支持纯无卡交易静态库,以下简称UPPayPlugin,包含文件:
1
2
3
|
UPPayPlugin.h UPPayPluginDelegate.h libUPPayPlugin.a |
② 支持纯无卡交易和VIPOS音频口支付静态库,以下简称UPPayPluginPro,包含文件:
1
2
3
|
UPPayPluginPro.h UPPayPluginDelegate.h libUPPayPluginPro.a |
大概这两个库就是上述那样(嗯,装懂了),具体问商务/后者后台,我们只需要知道
②需要将.m改成.mm (应该是用c++封装的音频...??)
添加SDK包
a) 根据商户选择的SDK版本,将sdk/inc目录和sdk/libs目录下对应版本的三个文件添加到UPPayDemo工程中;
b) 如果你选择的是UPPayPlugin版本,添加QuartzCore.framework、Security.framework到工程中;
c) 如果你选择的是UPPayPluginPro版本,添加QuartzCore.framework、AudioToolbox.framework, CoreAudio.framework、 MediaPlayer.framework, AVFoundation.framework和Security.framework到工程中;
d) 在工程的Build Settings中找到Other Linker Flags中添加-ObjC宏;
导入到工程
2.3 对接
在需要调用支付控件的源文件内引用头文件 UPPayPlugin.h 或 UPPayPluginPro.h(注意:如果工程的 compile source as 选项的值不是 Objective–C++,则引用此头文件的文件类型都要改为.mm)
通过调用一下startPay方法
1
2
3
4
|
+ (BOOL)startPay:(NSString*)tn mode:(NSString*)mode viewController:(UIViewController*)viewController delegate:(id)delegate; |
-------------2个参数说明(必填)-------------------
1
2
3
4
|
tn NSString* 交易流水号信息,银联后台生成,通过商户后台返回到客户端并传入支付控件; mode NSString* 接入模式设定,两个值:@ "00" :代表接入生产环境(正式版本需要);@ "01" :代表接入开发测试环境(测试版本需要); viewController UIViewController* 商户应用程序调用银联手机支付的当前UIViewController; delegate id 实现UPPayPluginDelegate方法的UIViewController; |
嗯,这些都是文档中的,请仔细看看[上线的时候一定要修改mode模式]。
mode在测试环境下,银联给的测试号 tn=@"01" 测试环境
测试使用卡号、手机号信息(此类信息仅供测试,不会发生正式交易)招商银行预付费卡:
银行卡号:6216261000000000018
身份证号:341126197709218366
手 机 号 :13552535506
验 证 码 :123456 【要点击获取验证码,不然提交会报错】
viewcontroller需要干这些事情
*引入头文件 \
#import "UPPayPluginPro.h"
*调用接口
[UPPayPluginPro startPay:tn mode:self.tnMode viewController:self delegate:self];
*实现对应代理方法
\
#pragma mark UPPayPluginResult
- (void)UPPayPluginResult:(NSString \*)result
{
NSString\* msg = [NSString stringWithFormat:@
"%@"
, result];
NSLog(@
"msg%@"
,msg);
if
([result isEqualToString:@
"msgcancel"
]) {
NSLog(@
"取消银联支付..."
);
}
else
if
([result containsString:@
"success"
]){
NSLog(@
"支付成功"
);
}
}
三、微信支付
微信sdk下载网址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1
3.1 请去看微信文档和demo
微信支付工作之前的流程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=ac5f0fd38fc8821171addbfdf5cc7d3af93cb305&lang=zh_CN
微信支付文档地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1
3.2 导入对应的库
1.开发微信APP支付,需要先去微信开放平台申请移动应用,并开通微信支付功能,通过审核后方可进行开发;
2.用XCode打开项目,【项目属性】-【Info】-【URL Schemes】设置微信开放平台申请的应用APPID,如图文件夹下"设置appid.jpg"所示。如果这的APPID设置不正确将无法调起微信支付;
3.需要调用代码注册APPID:[WXApi registerApp:APP_ID withDescription:@"demo 2.0”];项目该APPID需与步骤2中APPID保持一致;
4.支付请求:WXApiRequestHandler.m中的jumpToBizPay方法实现了唤起微信支付;
5.支付完成回调:WXApiManager.m中的onResp方法中接收返回支付状态。
希望各位多多指教。
IOS开发之—— iOS 支付 [支付宝、银联、微信]的更多相关文章
- WordPress按钮秒支付插件发布,支持微信支付,支付宝,银联,京东,苏宁,易宝支付
痛点: 我们用WordPress建设网站和开发移动应用,有时候我们其实不需要太多的流程,只是需要一个收款通道,但是可能对支持的渠道更加关注,特别是手机应用.所以WordPress按钮秒支付插件诞生了, ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- 玩转iOS开发:iOS中的GCD开发(三)
上一章, 我们了解到了GCD里的一些队列和任务的知识, 也实践了一下, 同时我们也对主队列的一些小情况了解了一下, 比如上一章讲到的卡线程的问题, 如果没有看的朋友可以去看看玩转iOS开发:iOS中的 ...
- iOS开发系列--IOS程序开发概览
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...
- iOS开发 - 兼容iOS 10
1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserN ...
- 如何学习iOS开发?iOS Developer Library足矣!
记得上高中的时候,寄信请教二哥学习经验,二哥来信介绍学习经验说:资料书要快速阅读,把书上的题做完,然后再买几套资料书(习题集)继续练习. 这是二哥的经验,因为他自学能力强,可以消化多套资料书. 我仿照 ...
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...
- iOS开发系列-iOS签名机制
概述 想要了解iOS的签名机制需要有一定密码学有一定的了解.下面依次介绍的数据的加密解密.单向散列函数.数字签名.证书.iOS签名机制. 数据加密解密 在网络通信中想要防止数据被攻击者拦截,我们通常对 ...
- iOS开发:iOS的整体架构以及API介绍
iOS的整体架构分为4层——Cocoa Touch层.Media层.Core Services层和Core OS层,下面概要介绍一下这4层. Cocoa Touch:构建iOS应用的一些基本系统服务, ...
随机推荐
- 附带详细注释的log4net的app.config文件配置例子
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...
- 使用 ServiceStack.Text 序列化 json 比Json.net更快
本节将介绍如何使用ServiceStack.Text 来完成高性能序列化和反序列化操作. 在上章构建高性能ASP.NET应用的几点建议 中提到使用高性能类库,有关于JSON序列化的讨论. 在诊断web ...
- Windows 2003 Server C盘空间被IIS日志文件消耗殆尽案例
今天突然收到手头一台数据库服务器的磁盘空间告警邮件,C盘空间只剩下5.41GB大小(当系统磁盘剩余空间小于总大小的10%时,发出告警邮件),如下图所示: 由于还有一些微弱印象:前阵子这台服务器的C盘剩 ...
- Eclipse EE 发布项目导致 Tomcate 的配置文件 server.xml 还原
在server.xml中配置SSL时,发现了每次发布项目都导致server.xml被还原了: <Connector port="8443" protocol="or ...
- [转][原]openstack-kilo--issue(六)kilo版openstack的dashboard在session超时后重新登录报错解决办法
http://blog.csdn.net/wylfengyujiancheng/article/details/50523373?locationNum=1&fps=1 1.现象描述: kil ...
- 如何删除TFS的Team Project
我们可以使用Visual Studio或Web新建一个TeamProject,但是删除时却没有一个合适的图形界面删除我们不想要的Team Project,所以此时就可以使用命令TFSDeletePro ...
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...
- JavaScript的执行上下文
在JavaScript的运行过程中,经常会遇到一些"奇怪"的行为,不理解为什么JavaScript会这么工作. 这时候可能就需要了解一下JavaScript执行过程中的相关内容了. ...
- 深度优先搜索 codevs 1064 虫食算
codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所 ...
- HDU 5044 Tree --树链剖分
题意:给一棵树,两种操作: ADD1: 给u-v路径上所有点加上值k, ADD2:给u-v路径上所有边加上k,初始值都为0,问最后每个点和每条边的值,输出. 解法:树链剖分可做,剖出来如果直接用线段树 ...