1.支付宝支付
1.1 开发环境设置
1.1.1 添加
AlipaySDK.bundle,
AlipaySDK.framework,
到项目
1.1.2 依赖库:
libz.tbd,
libc++.tbd,
SystemConfiguration.framework,
CoreTelephony.framework,
QuartzCore.framework,
CoreText.framework,
CoreGraphics.framework,
CoreMotion.framework,
CFNetwork.framework,
AlipaySDK.framework
1.1.3 TARGETS 的 info 中的 URL types 添加 URL schemes (即appId)
1.2 调起支付
支付页面:
#import
NSString *orderString = model.data.payResult;//支付宝支付后台返回的订单号
NSString *appScheme = URL_SCHEMES_NAME;//对应的支付宝的URL Schemes的名称;
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {//用于wap支付结果回调 (非跳转钱包支付)
NSLog(@"result = %@",resultDic);
NSString *resultStatus = [resultDic objectForKey:@"resultStatus"];
//通过观察者观察支付结果调用对应方法
switch ([resultStatus integerValue]) {
case 9000://订单支付成功
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange_success_alipay" object:nil];
break;
//case 6001://用户中途取消
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
//case 4000://订单支付失败
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
//case 5000://重复请求
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
default:
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
break;
}
}];
1.3 支付结果回调
AppDelegate页面
#import
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {//处理钱包或者独立快捷app支付跳回商户app携带的支付结果
NSLog(@"result = %@",resultDic);
NSString *resultStatus = [resultDic objectForKey:@"resultStatus"];
//通过观察者观察支付结果调用对应方法
switch ([resultStatus integerValue]) {
case 9000://订单支付成功
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange_success_alipay" object:nil];
break;
//case 6001://用户中途取消
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
//case 4000://订单支付失败
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
//case 5000://重复请求
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
default:
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
break;
}
}];
}
return YES;
}
// 支持所有iOS系统(8.0)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
NSString *resultStatus = [resultDic objectForKey:@"resultStatus"];
//通过观察者观察支付结果调用对应方法
switch ([resultStatus integerValue]) {
case 9000://订单支付成功
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange_success_alipay" object:nil];
break;
//case 6001://用户中途取消
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
//case 4000://订单支付失败
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
//case 5000://重复请求
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
default:
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
break;
}
}];
}
return YES;
}
2.微信支付
2.0 开发环境设置
2.0.1 将WeChatSDK
下所有文件添加到项目中
2.0.2 依赖库:
SystemConfiguration.framework,
libz.tbd,
libsqlite3.0.tbd,
libc++.tbd,
Security.framework,
CoreTelephony.framework,
CFNetwork.framework
2.0.3 Build Setting 中的 Other Linker Flags
添加 “-ObjC
”
2.0.4 Build Setting 中的 Library Search Paths
添加libWeChatSDK.a,WXApi.h,WXApiObject.h
文件所在位置
2.0.5 TARGETS 的 info 中的 URL types 添加 URL schemes (即appId)
2.0.6 TARGETS 的 info 中的 “LSApplicationQueriesSchemes
”添加weixin
2.0.7 TARGETS 的 info 中的 “LSApplicationQueriesSchemes
”添加weixinULAPI
//SDK 1.8.6版本新加
AppDelegate页面
#import "WXApi.h"
2.1 向微信注册appId
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
//微信支付
//旧版注册方法
[WXApi registerApp:WXKey enableMTA:NO];
//SDK 1.8.6版本注册方法 universalLink 需要在微信开放平台设置
[WXApi registerApp:WXKey universalLink:universalLink];
return YES;
}
2.2 重写AppDelegate的handleOpenURL和openURL方法
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
[WXApi handleOpenURL:url delegate:self];
return YES;
}
// 支持所有iOS系统(8.0)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
[WXApi handleOpenURL:url delegate:self];
return YES;
}
2.3 调起支付
支付页面
#import "WXApi.h"
把后台返回的预支付结果装在PayReq后调用- (BOOL) sendReq:(BaseReq*)req
发送给微信
WeChatPayDataPayResultModel *data = model.data.payResult;//微信预支付后台返回JSON
PayReq* req = [[PayReq alloc] init];
req.partnerId = data.partnerid;//商户号
req.prepayId = data.prepayid;//预支付交易会话ID
req.nonceStr = data.noncestr;//随机字符串
req.timeStamp = data.timestamp.intValue;//时间戳
req.package = data.package;//扩展字段
req.sign = data.sign;//签名
[WXApi sendReq:req];
2.4 支付结果回调 —> 如果APP向微信发送了sendReq请求,则onResp会被回调
- (void)onResp:(BaseResp *)resp
{
//支付返回结果,实际支付结果需要去微信服务器端查询
NSString *strMsg = [NSString stringWithFormat:@"支付结果"];
//通过观察者观察支付结果调用对应方法
switch (resp.errCode) {//根据返回结果进行处理
case WXSuccess:
strMsg = @"支付结果:成功!";
NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange_success_wechat" object:nil];
break;
//case WXErrCodeUserCancel:
//strMsg = [NSString stringWithFormat:@"支付结果:取消订单!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
//NSLog(@"取消订单,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
//[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
//break;
default:
strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
[[NSNotificationCenter defaultCenter] postNotificationName:@"controllerChange" object:nil];
break;
}
}
3.遇见问题
3.1 sendReq 调用失败
微信开放平台新使用支付功能用户 填写相关信息中 Universal Link选项为必填
对应设置:
1.TARGETS 的 info 中的 “LSApplicationQueriesSchemes
”添加weixinULAPI
2.[WXApi registerApp:WXKey universalLink:universalLink];
//universalLink
不能设为nil
或@”“
3.2 支付验证签名失败
后台设置的prepayid
等参数名与官方要求的不相同
如:后台设置为prepay_id
官方为prepayId
导致传值时无法对应 出现传空
3.3 支付宝支付成功不返回app
原因: 接入支付宝支付URL Types 填写的URL Schemes 为纯数字
iOS接入支付宝支付URL Types 填写的URL Schemes 不能为纯数字