您的位置:首页 > 移动开发 > IOS开发

iOS开发——支付宝

2016-06-15 16:35 633 查看

iOS开发——高级篇——如何集成支付宝SDK

一、什么是支付宝

第三方支付平台和内购非常相似内购是用户将钱付款给苹果,之后苹果分成给商户支付宝是用户将钱付款给支付宝,之后支付宝将钱转入我们的账户使用支付宝前提购买的物品必须是和应用程序无关的.比如:团购卷/衣服/电子产品如果和应用程序有关,必须采用内购(否则不允许上架).比如:会员/游戏道具 

二、集成支付宝

现在不少app内都集成了支付宝功能使用支付宝进行一个完整的支付功能,大致有以下步骤:向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)和私钥(privateKey)下载支付宝SDK生成订单信息,签名加密调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道支付完毕后,支付宝客户端会自动跳回到原来的应用程序在原来的应用程序中显示支付结果给用户看 

三、集成SDK注意事项

* 支付宝的SDK下载和百度、讯飞语言等SDK不一样,直接搜支付宝进入官网下载* 支付宝下载(选择我是商户用户—>如何集成—>移动开发)* 集成前查看demo* 集成时需要用到的库 * 集成之后可能遇到的问题1)集成SDK编译时找不到 openssl/asn1.h 文件解决方案:Build Settings --> Search Paths --> Header Search paths : $(SRCROOT)/支付宝集成/Classes/Alipay 2)链接时:找不到 SystemConfiguration.framework 这个库  解决方案:  

四、具体代码

比如现在将产品展示在tableView上,选中时即购买此商品,集成支付宝的核心代码如下:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.取出模型对象
Product *product = self.products[indexPath.row];

// 2.购买商品
[self buyProduct:product];
}

- (void)buyProduct:(Product *)product
{
// 1.添加写partner/seller/privateKey,签约后获得
NSString *partner = @"";
NSString *seller = @"";
NSString *privateKey = @"";

// 2.生成订单
// 2.1.创建订单
Order *order = [[Order alloc] init];

// 2.2.设置商户ID/账号ID
order.partner = partner;
order.seller = seller;

// 2.3.设置订单号
order.tradeNO = nil;

// 2.4.设置产品相关的信息
order.productName = product.title;
order.productDescription = product.detail;
order.amount = [NSString stringWithFormat:@"%.2f", product.price];

// 2.5.设置订单常量
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showUrl = @"m.alipay.com";

// 2.6.回调URL(异步通知服务器的地址)
order.notifyURL =  @"http://www.xxx.com"; //回调URL

// 2.7.将订单信息拼接成字符串
NSString *orderSpec = [order description];

// 3.对订单进行签名加密
// 3.1.对订单进行加密
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];

// 3.2.将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec, signedString, @"RSA"];

// 4.打开支付宝客户端进行支付(用户没有安装支付宝客户端,直接在应用程序中添加一个WebView,通过网页让用户进行支付)
// 注意:如果是通过网页支付完成,那么会回调该block:callback
[[AlipaySDK defaultService] payOrder:orderString fromScheme:@"jingdong" callback:^(NSDictionary *resultDic) {

}];
}
AppDelegate.m
// 当通过别的应用程序,将该应用程序打开时,会调用该方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
// 当用户通过支付宝客户端进行支付时,会回调该block:standbyCallback
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];

return YES;
}
iOS app支付宝接口调用的一点总结(补充支付宝SDK&Demo下载地址)
由于app内需要用到支付功能,选择了当前最流行的支付宝进行支付。在进行内嵌支付宝功能开发时,被它狠狠的耍了一把。根据支付宝开发文档,参考demo代码。将相关支付功能加到了自己的代码中。一些根据文档来做,也没有太大的难度。但添加完代码,进行测试时,问题却来了。在app中可以成功调用支付宝app,成功支付并返回。这个时候就出现问题了。在app delegate支付宝回调本app的执行函数中,公钥验证签名成功后,会对支付结果进行提示。根据demo,提示支付的代码如下:[cpp] view plain copyUIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:result.statusMessage delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil];  [cpp] view plain copy[alertView show];  [cpp] view plain copy[alertView release];  问题就出现在这里了。支付成功后,result.statusMessage返回的值却是空的。而我测试取消支付,这个返回值却是正确的,提示“操作取消”之类的文字(具体忘记了)。支付失败没有进行测试。这下麻烦了,不知问题出在哪里。总不能支付成功后,返回一个空的提示吧。或者直接将提示自己写死,显示“支付成功”?那万一是其他信息提示咋办呢?重复对比了demo和自己程序的代码,发现没有错漏的地方。百思不得其解,于是想是不是支付宝后台的问题?又根据支付宝服务器端的开发文档,仔细检查,反复测试了。还是找不到原因。这下没撤了,只能打支持电话,加入一个交流群,问了支付宝负责技术的人,反复说明问题后,终于得到了答覆,支付成功时,result.statusMessage是没有返回值的,大概意思是后来取消了这个返回值。我的妈阿,对返回值作了改变,为啥文档又没说明,让我等苦逼的程序猿白白折磨了一两天,情何以堪呢。客气的将我的想法提了给支付宝的技术支持,回复说:不要太相信demo。shit,这是人话吗,我用你的接口,不是根据你的文档和demo,那我会担心出错的,而且这是涉及到金钱问题,所以更加不能马虎。内心暗骂了一通之后,又将我的一番建议,例如要求再进一步完善文档,对细节再进一步谨慎之类的提交到支付宝技术支持那里。到此,我的痛苦的支付宝接口调用过程就告一段落了。写这篇文章,算是提醒自己或者有需要的人,有不明白的地方,第一时间找支付宝的技术支持,不要自己瞎折腾了,说不定你碰到的问题不是自己的问题,而是出在第三方接口上。另外说一下,支付宝网站上找技术支持,直接点支持旺旺是没反应的,你需要打电话去问,才能拿到技术支持的旺旺号,这里公布一下支付宝技术支持群的旺旺号,应该不会被支付宝的人骂吧。呵呵旺旺号:24768316 密码:alipay2010补充:另外,很多人发私信来问,哪里可以下载支付宝demo或者sdk。这个问题自己曾经也痛苦过,在支付宝网站找个demo,不是一般的难,位置隐藏得非常深,特别是改版后,更加难找了。上一次(改版后)实在找不到,只好问支付宝的技术支持。支付宝集成sdk和demo下载地址:下载地址:http://download.alipay.com/public/api/base/WS_SECURE_PAY.zip

IOS 支付功能的实现

支付宝是第三方支付平台,简单来说就是协调客户,商户,银行三者关系的方便平台使用支付宝进行一个完整的支付功能,大致有以下步骤:a 与支付宝进行签约,获得商户ID(partner)和账号ID(seller)b 下载相应的公钥私钥文件(加密签名用)c 下载支付宝SDKd 生成订单信息e  调用支付宝客户端,有支付宝客户端跟支付宝安全服务器打交道f  支付完毕后返回支付结果给客户端和服务器支付功能的实现 有两种方式:1  支付宝的应用可以 用url 直接连接到 支付宝的官网 (当然后台是要进行处理的)2  第二种就是添加支付宝的第三方了 首先 下载支付宝的demo 支付宝的demo 一般的常见问题解决1 No architecutures to compile for (ONLY_ACTIVE_ARCH = YES, active arch = x86_64,VALID_ARCHS = i386)出现这样的问题一般是 将 64 位编译进去就能解决了(这个问题只要你下载的是最新的demo一般很少见了 )解决方案:targets -> Architectures 下面的Valid Architectures 添加上 arm642 将支付宝的第三方添加到项目中的时候 有时 会出现 openssl 文件中的.h 文件报错 说此文件不能被找到出现这样的问题是 的原因一般是添加的路径 不对解决方案:点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字“search”搜索,对“Header Search Paths” 增加头文件路径:$(SRCRCOT)/项目名称 设置一下路径 一般都能解决。3  Cannot find interface declaration for "NSObject", supercalss of 'Base64'解决方案   打开报错的文件,增加头文件#import <Foundation/Foundation.h>基本上支付宝中的demo 里面的问题一般都会得到解决。然后 看着demo 跟实际的项目结合一下就ok 了正式开始  支付宝教程:(因为申请的工作不是我做的 所以就此过程就略了 )1 将需要的文件,静态库等拖入工程中,这里有:include,libs,Utilities,libcrypto.a,libssl.a文件2 添加 库  Linked Frameworks and Libraries  中 添加libssl.a   libcrypto.a   SystemConfiguration.framework  AlipaySDK.framework3  如果商户要在某个文件中使用给支付宝的SDK 类库,需要增加引用头文件#import "Order.h"#import "DataSigner.h"#import <AlipaySDK/AlipaySDK.h> 4  后面的基本上都是 按照官方demo写的接口调用步骤:1.封装订单模型将商品信息赋予AlixPayOrder的成员变量Order *order = [[Order alloc] init];// 应用注册scheme,在项目的info.plist 定义URL typesNSString *appScheme = @"zhifu";/生成订单描述NSString *orderSpec = [order description];2.签名:获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncodeidsigner = CreateRSADataSigner(@“私钥key”);NSString *signedString = [signer signString:orderSpec];//传入订单描述 进行 签名NSString *signedString = [signer signString:orderSpec];3.生成订单字符串NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec,signedString, @"RSA"];4.调用支付接口[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { }];文/Tracey(简书作者)原文链接:http://www.jianshu.com/p/3b527bd8dc67著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: