原标题 : IOS集成微信支付或者支付宝支付功能小结
2016.7.1。由于苹果强制要求适配ipv6,本文demo中采用的sdk可能有点老,如果采用的话,审核可能被拒。建议升级各SDK的新版本再集成,方法大同小异,有什么问题欢迎交流
集成ShareSDK社会化分享的时候集成了微信支付或者支付宝支付功能
(分别集成了微信支付和支付宝,用Ping++集成支付的烦请绕行…)
2016.01.07 更新(修改Xcode7.2 IOS9.2 微信客户端操作之后返回程序 微信的onResp回调方法不被执行的bug)
http://yun.baidu.com/share/link?shareid=187711184&uk=3055516665
不废话,先甩链接
第一,你需要有微信开发平台的开发者账号,(网址https://open.weixin.qq.com/,或者自行百度“微信open”,支付宝支付同理,下同),并将你要集成的应用在你的开发者账号中注册,并获取支付权限(一般这步不需要程序员考虑,都是客户自己获取的,你只需要知道,没有支付权限的应用,不可以集成支付)。
第二,注册完你的应用,通过审核之后,你会获得开放平台给你发放属于这个应用的AppID和AppSecret
第三,在开发平台的资源中心(或者叫文档中心,SDK中心什么的),下载IOS的SDK(文档也可以下载下来方便查阅)。我这次的Demo是之前集成过ShareSDK的分享和第三方登录,所以直接用的ShareSDK中的微信SDK。
(ps,这里之前网友有过用ShareSDK中的微信SDK不支持支付功能,我这里是可以支付的,应该是Mob集成好了,如果你下载的不能用的话,可以去微信官方下载官方的SDK,10M左右的样子,把ShareSDK中的微信SDK替换掉,替换的时候要注意,不能只替换文件,要看好工程中Target选项卡里的文件路径是否删除了旧文件路径,否则的话可能旧文件路径会覆盖新文件路径,导致替换没有效果或者崩溃。)
第四,将下载好的SDK拷贝到工程文件夹中,然后再工程中AddFilesTo“你的工程”,
(这里注意,Add的时候要勾选CopyItemsIfNeeed,否则可能会出现找不到路径这种烦人的错误)
第五,配置你的工程。
1.添加系统依赖库,(这里我用了ShareSDK,所以也连Share必须的系统库也一并添加了),方法—点击工程名—Target—BuildPhases—Link Binary With Libraries—点击+号搜索你需要的系统库,并添加
SystemConfiguration.framework
QuartzCore.framework
CoreTelephony.framework
libicucore.dylib(ps,这里因为可能你的Xcode是Xcode7,所以这里的.dylib可能会在你的系统库里显示.tbd)正常添加就好
libz.1.2.5.dylib
Security.framework
JavaScriptCore.framework
libstdc++.dylib
CoreText.framework
libsqlite3.dylib
ImageIO.framework (shareSDK新浪必须依赖库)
AdSupport.framework(shareSDK新浪必须依赖库)
2.配置工程的URL Types中的URL Schemes,
这个URL Schemes是用来调起第三方客户端支付或分享或授权之后回到你的程序的标识
方法:点击工程名—Target—Info—URL Types—点击+号,在URL Schemes栏中填入你在第二步中获取到的APPID(图见上一步,自己找一下info选项卡)
3.如果是Xcode7需要在Info.Plist文件中加入字段LSApplicationQueriesSchemes,为Array类型,然后在里面添加两个小选项,分别为weixin和wechat(Xcode7http请求适配Xcode7的问题请自行百度)
第六、开始写代码了!
1.将Demo中的WXPay文件夹拷贝到工程文件夹中,然后Add到工程目录
2.在AppDelegate.h中#import相关头文件,在AppDelegate.m文件中的application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中添加[WXApi registerApp:APP_ID withDescription:@"demo 2.0"];(这里的APPID就是你第二步获取的APPID,一般建议写成宏。@“demo2.0”不需要修改),我的demo里在这个方法里还注册了shareSDK,希望大家不要有疑惑。
3.在AppDelegate.m中加入这两个方法:
//重要更新,一下两个方法IOS9.0以后被废弃了,所以如果你是Xcode7.2的话,可能会出现不能进入微信的onResp回调方法,原因是下边两个方法没有被调用,所以这里更新一下,改用另外一个方法(并不建议删除这两个方法,新方法是9.0以后的方法,可能系统低版本的用户不支持。所以我三种方法都留下了,如果有人发现不能都留下的话,请简信告诉我一下,再次谢过了)
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
//改用方法为- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options;
具体方法里的代码如何书写请看Demo中的注释。
4.配置完AppDelegate文件之后,向你的工程中拷贝入Demo中的UIViewController+WeChatAndAliPayMethod类目,并Add到工程中,
在你需要用到支付的页面引用这个类目。(详情请见Demo的ViewController页面方法和代码,仔细观看注释和理解代码之后微信支付的集成就完成了)
PS.支付宝集成和微信支付集成大同小异,如果你集成了微信支付,你会发现支付宝集成更简单。
第一步,将支付宝支付的SDK拷贝到工程文件夹中,然后Add到工程目录,
(ps。这里注意一下,我demo里ThirdParty下的AliPay那些文件都是需要你在这一步拷贝的东西。)
尤其是openssl和Util还有那两个.a文件。因为支付宝的开发文档写的实在是不怎么样,乱七八糟的,都没有直接给你要添加的SDK包,这些东西都是从官方的demo里抽出来的。具体你们可以下载官方demo看一看。
第二步、Add完SDK包之后,引入所需的系统库。调用UIViewController+WeChatAndAliPayMethod这个类目中的支付宝支付方法即可。(注意看我Demo中的代码和注释)
PS。如果你在集成支付宝的时候可能会遇到<openssl/xxx.h>not found的错误,(你平时用别的SDK的时候也可能会遇到),这一般情况是Xcode找不到这些文件的路径。在这里,你可以在Targets中的BuildSettings中的Header Search Paths选项卡中添加openssl的路径。
重点:Demo里有两个存放关键几个宏的文件,payRequsesrHandler.h和AliPayNeedDEF.h,这两个文件里面的内容你们要自己填写自己的数据。具体如何获取这些数据我的注释写的很明白了。仔细看一下就好。
还有,你们在调用我的支付类目中的方法的同时,要写一个监听,来通知你是否支付成功。这个在我的代码注释里写的很清楚,这里就不多赘述了。
接下来的部分是后来新增的。(三方登录,和三方分享,包括适配ios9)
注:三方登录和分享这些代码Mob官网都有,就不多赘述了。这里主要是为了减少大家的代码量,增强复用性进行的一些整合。如果哪里有问题或者处理不妥,希望码友们积极提出。
首先,能做到三方登录的话,和支付一样,需要你在第三方平台上注册的应用拥有登录权限。
其次,XCode7之后IOS9,shareSDK对应也有相应的变化,第三方分享登录的时候,需要比之前多一些步骤,比如添加Schemes白名单:
info.plist中需要添加如此多的字段(为了适应新的sso授权。以下只是新浪微博,QQ,微信三个平台需要添加的字段)
为方便大家按需添加,这里进行分类:
新浪微博:sinaweibo,
sinaweibohd,
sinaweibosso,
sinaweibohdsso,
weibosdk,(添加weibosdk需要)
weibosdk2.5(添加weibosdk需要)
微信:
wechat,
weixin
QQ:
mqqOpensdkSSoLogin,
mqqopensdkapiV2,
mqqopensdkapiV3,
wtloginmqq2,
mqq,
mqqapi
(以下是QQZone需添加的,但是一般情况一下,需要集成QQ分享登录的,都需要QQZone的,所以一般建议大家直接把QQ和QQzone的都添加进去)
mqzone
mqzoneopensdk,
mqzoneopensdkapi,
mqzoneopensdkapi19,
mqzoneopensdkapiV2,
还有,不要忘记对URLType里面的设置。(QQ添加的时候需要用十六进制转化的,例:QQ41D9BC03)
关于登录的简单整理:
我的demo工程中有个LoginMethodObject文件夹,里面有我自己新建的一个类LoginMethod。
使用者只需要引用这个类,实例化一个对象。并实现代理
-(void)recieveTheUserInfo:(NSDictionary*)userInfo
errorMsg:(NSString *)errorMsg;
userInfo即是获取到的用户信息。里面我只获取了昵称,uid,头像等等简单的信息。如果需要其他信息的话需要特别对待。不过一般登录只需要uid就够了,所以这里不过多赘述。
注意:在实现这个代理的时候,为了方便,逻辑更清楚。需要大家做下判断,即判断errorMsg是否存在。
(像AFNetWorking一样)若存在errorMsg的话,说明获取失败,errorMsg打印出来即是错误原因。若errorMsg不存在代表获取成功,就可以直接用userInfo中的用户信息了
demo中的示例具体可以看demo中的LoginViewController的运用。
关于第三方分享:
第三方分享的话,Mob的官网上写的很明白了,我就不多此一举再写什么了。Demo中有样板的,如果不想去mob翻的话,直接复制的话就可以了。
(单说一下,demo中写的是适用于所有平台均发送同一分享内容的方法。如果需要针对不同平台分享不同内容的话需要调用另外一个方法,如下)
对不同平台分享不同内容的代码调用
网友评论
return [WXApi handleOpenURL:url delegate:self];
} 里面是这样写的吗?望大神及时指教!在线等...
schemes也设了啊,白名单也加了。老是出现这个问题,怎么办啊?急~
[[AlipaySDK defaultService] payOrder:orderString fromScheme:@"LiiiFE" callback:^(NSDictionary *resultDic)
{
NSLog(@"reslut = %@",resultDic);
if ([[resultDic objectForKey:@"resultStatus"] isEqual:@"9000"]) {
//支付成功
[[NSNotificationCenter defaultCenter] postNotificationName:@"Alipayresult" object:@"1"];
}else{
[[NSNotificationCenter defaultCenter] postNotificationName:@"Alipayresult" object:@"0"];
}
}];
就是NSLog(@"reslut = %@",resultDic);这个它根本就不打印,是怎么回事呢?
{
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand(time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}就这样子生成吗?正式项目这样做合理吗?
919458797@q.com
"appid":"wxb4ba3c02aa476ea1",
"noncestr":"23e55cf2bdd3ac2c2a8c9977be8c06e6",
"package":"Sign=WXPay",
"partnerid":"10000100",
"prepayid":"wx20151208110530f2c0e2b1030972688102",
"timestamp":"1449543930",
"sign":"2083032568DA67026A5D2A2CBFD1C6F8"
}直接就用了,