在用户安装支付宝的情况下会跳转到支付宝客户端支付,如果没有安装支付宝则会自动打开一个webview进行网页登录支付。而微信不支持网页登录支付,而苹果审核时,如果发现手机没有安装微信客户端,不能完成支付就会拒绝上架。所以同时集成支付宝和微信支付的开发者,请判断用户是否安装了微信客户端,来决定是否显示微信支付这个选项。
听说工程名如果是中文会出现迷之bug,我没试过不知道是不是真的。
一、下载支付宝SDK
如图所示,支付宝SDK分为两个版本,没有意外使用第一个版本就可以。第二个版本是出现UTDID冲突才使用的,我在集成的时候没有集成过百川SDK却也出现了UTDID冲突,所以我集成的是第二个版本SDK。这个UTDID冲突会报错,显示xxxxxxx duplicate UTDID xxxxxxxx一堆错误,意思就是你的工程里有两个UTDID冲突了,不要惊慌,更换SDK就可以。
下载后把下面两个文件导入工程即可。
二、配置环境
在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
其中,需要注意的是:
- 如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
- 如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib(如下图)。
点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL Schemes”中输入一个字符串,建议跟商户的app有一定的标示度,要做到和其他的商户app不重复,否则可能会导致支付宝返回的结果无法正确跳回商户app。
环境配置好了 编译如果报错如下图,在AlipaySDK.h里添加头文件
#import
"AppDelegate.h"
三、代码使用
在需要调用AlipaySDK的文件中,增加头文件引用。
#import
<AlipaySDK/AlipaySDK.h>
我是创建了一个PayManager 类来封装一个类方法,在需要使用支付宝支付的时候直接用PayManager来调用
+ (
void
)alipayWithGold_type:(
NSString
*)gold_type amount:(
NSNumber
*)amount方法即可。
先根据选中的商品,向后台请求该商品的支付宝订单信息,一般订单信息都是后台生成,因为这样比较安全,如果放在客户端生成被人破解就不好了。订单信息大概长这个样子:
app_id=
2015052600090779
&biz_content={
"timeout_express"
:
"30m"
,
"seller_id"
:
""
,
"product_code"
:
"QUICK_MSECURITY_PAY"
,
"total_amount"
:
"0.02"
,
"subject"
:
"1"
,
"body"
:
"我是测试数据"
,
"out_trade_no"
:
"ZQLM3O56MJD4SK3"
}&charset=utf-
8
&method=alipay.trade.app.pay&sign_type=RSA×tamp=
2016
-
07
-
28
20
:
36
:
11
&version=
1.0
&sign=*********
下面是我封装的类方法
#pragma mark
支付宝支付
+ (
void
)alipayWithGold_type:(
NSString
*)gold_type amount:(
NSNumber
*)amount{
//
使用自己封装的网络请求方法向后台请求支付宝订单信息
[
RequestTool
requestWithType
:
POST
RRLString
:
kAlipayURL
parameter
:
@{
@"user_id"
:[
UserLoginStateManager
shareManager
].
model
.
userID
,
@"sign_key"
:[
UserLoginStateManager
shareManager
].
model
.
sign_key
,
@"gold_type"
:gold_type,
@"amount"
:amount
}
HTTPHeader
:
nil
callBlock
:^(
NSData
*data,
NSError
*error) {
NSDictionary *dic = [ NSJSONSerialization JSONObjectWithData :data options : NSJSONReadingMutableContainers error : nil ];
NSLog ( @"%@" ,dic);
// 调用支付宝方法跳转到支付宝
[ PayManager alipayWithOrder :dic[ @"order_info" ]];
}];
NSDictionary *dic = [ NSJSONSerialization JSONObjectWithData :data options : NSJSONReadingMutableContainers error : nil ];
NSLog ( @"%@" ,dic);
// 调用支付宝方法跳转到支付宝
[ PayManager alipayWithOrder :dic[ @"order_info" ]];
}];
}
#pragma mark 跳转到支付宝
+ (
void
)alipayWithOrder:(
NSString
*)order{
// 这个order就是刚才向服务器请求的订单,scheme就是配置环境时添加
url
scheme 填入的那个独特的字符串,忘记的可以往上找。
[[AlipaySDK defaultService] payOrder:order fromScheme:@"xxxxxxx" callback:^(NSDictionary *resultDic) {
//
如果是网页版支付成功或失败会走这个回调
// NSLog(@"result = %@",resultDic);// 返回的支付结果
// 9000 是支付成功, 6001 是取消支付
if ([resultDic[ @"resultStatus" ] isEqualToString : @"9000" ]) {
// NSLog(@"result = %@",resultDic);// 返回的支付结果
// 9000 是支付成功, 6001 是取消支付
if ([resultDic[ @"resultStatus" ] isEqualToString : @"9000" ]) {
NSLog
(
@"
支付成功!
"
);
}
else
{
NSLog
(
@"
支付失败!
"
);
}
}];
}];
}
在appdelegate.m里添加头文件
#import
<AlipaySDK/AlipaySDK.h>
当这笔交易被买家支付成功后支付宝收银台上显示该笔交易成功,并提示用户“返回”。此时在APAppDelegate.m的
- (
BOOL
)application:(
UIApplication
*)application openURL:(
NSURL
*)url sourceApplication:(
NSString
*)sourceApplication annotation:(
id
)annotation
中调用获取返回数据的代码【iOS9.0以上(包括iOS9.0)需要在
- (
BOOL
)application:(
UIApplication
*)app openURL:(
NSURL
*)url options:(
NSDictionary
<
NSString
*,
id
> *)options
中执行下面的代码】:(如果ios9之前和ios9之后的都需要支持这两个方法就都写上)
//
支付宝客户端支付后的回调 条件判断是用来区分不同的客户端回调的。
if
([url.
host
isEqualToString
:
@"safepay"
]) {
[[ AlipaySDK defaultService ]
processOrderWithPaymentResult :url
standbyCallback :^( NSDictionary *resultDic) {
NSLog ( @"result = %@" ,resultDic); // 返回的支付结果
NSLog ( @"%@" ,resultDic[ @"resultStatus" ]);
if ([resultDic[ @"resultStatus" ] isEqualToString : @"9000" ]) {
[[ AlipaySDK defaultService ]
processOrderWithPaymentResult :url
standbyCallback :^( NSDictionary *resultDic) {
NSLog ( @"result = %@" ,resultDic); // 返回的支付结果
NSLog ( @"%@" ,resultDic[ @"resultStatus" ]);
if ([resultDic[ @"resultStatus" ] isEqualToString : @"9000" ]) {
NSLog
(
@"
支付成功!
"
);
}
else
{
NSLog
(
@"
支付失败!
"
);
}
}];
return YES ;
}];
return YES ;
}
支付成功后后台会收到阿里的消息的 ,决定是否发货这部分交给后台做吧,具体情况可以和后台沟通。
这样支付宝就做完了,很简单吧。