美文网首页Des's iOS iOS日常iOS进阶
IOS集成第三方支付、分享、登录功能小结

IOS集成第三方支付、分享、登录功能小结

作者: Leonmmmmm | 来源:发表于2015-10-21 18:38 被阅读27162次

    原标题 : 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之后IOS9shareSDK对应也有相应的变化,第三方分享登录的时候,需要比之前多一些步骤,比如添加Schemes白名单:

    info.plist中需要添加如此多的字段(为了适应新的sso授权。以下只是新浪微博,QQ,微信三个平台需要添加的字段)


    添加LSApplicationQueriesSchemes数组型字段中的元素

    为方便大家按需添加,这里进行分类:

    新浪微博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中写的是适用于所有平台均发送同一分享内容的方法。如果需要针对不同平台分享不同内容的话需要调用另外一个方法,如下)

    对不同平台分享不同内容的代码调用

                                                                                                                                                                                 ------From CoderLeon        

    相关文章

      网友评论

      • LinkStart:大哥,你的连接地址不能用了
      • Ko_Neko:demo地址在哪里呢。。。没看到呀
      • 问夕阙:感谢大神,刚好遇到这个问题,并且解决了。:+1:
      • ce8ce1f5c1f1:大神,你的demo在哪下载? 是开头那句 "废话不多说,先甩链接" 里的 链接 吗? 在线等回复.
        Leonmmmmm:@大唐小胖 是的,微信开放平台 支付功能是收300块钱的。
        ce8ce1f5c1f1:@CoderLeon 我的应用要用微信支付功能,我去微信开发者账号里面注册我的应用, 还得交300元钱审核费啊?
        Leonmmmmm:是的,那个连接里应该有。不过很遗憾的说,这个源码已经很老了。可能官方的SDK已经更新了。以借鉴为主吧。:smile:
      • 流年易逝_李:您好,有事请教
      • zwing:demo地址发一下呗 :yum:
      • 马什么梅:大神写的真好 不过我不怎么想用shareSDK 以后再说吧。。。我们微信支付 后台就给了个appid token appsecret啊。。那些参数叫我自己生成 怎么搞。。。
      • 下雨就好:UIViewController+WeChatAndAliPayMethod 这个鬼东西并没有,应该是作者自己写的
        Leonmmmmm:@1_2 嗯,这个确实是我写的,为了整合代码,方便调用
      • 无神://改用方法为- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options{

        return [WXApi handleOpenURL:url delegate:self];
        } 里面是这样写的吗?望大神及时指教!在线等...
        无神:@CoderLeon OK👌🏻谢谢
        Leonmmmmm:@无神 才看到。如果你没有别的调用的话可以这么写,但是我建议在这个方法里面判断一下open的url是否为微信支付。这样保险一点
      • e2d71684a7a5:为啥在我弄了半天写了个能支付的四不像的时候看到了这个东西............我早点看到多好
      • MrLiangC:你好,我支付宝和微信都集成进去了,我回调的时候怎么判断到底该走微信还是支付宝呢
        MrLiangC:@CoderLeon 谢谢 :+1:
        Leonmmmmm:@小土匪 看demo里appdelegate 里,回调的时候有判断的:smiley:
      • time_xie:我的也是点击调用微信以后中间有个button,但是我的数据都是真实的啊,线上的app都在用
      • time_xie:大神,能不能给我一个能调用微信支付的demo啊,我今天在官网下载的跑不起来,直接告诉我支付失败,最好加个qq 552034082
      • 小代码仔:大神早上好, 您的Demo中 微信支付在APPDelegate 中的回调方法里边做了判断, 为什么没有看见支付宝的呢? 还有就是看您都没有导头文件,您是放在哪个 .pch 文件中了吗
        Leonmmmmm:@qwj 不好意思才看见,正常支付宝是不需要做这个判断的,但是后续的版本更新之后,支付宝可能不走回调,就需要在appdelegate 里写下回调了:smile:。至于你说的头文件我没引什么?appdelegate 里也记得都有引用的啊,不过也确实有pch文件用来放宏的:grin:
      • 68ad5c50329f:问下就是微信支付onResp不调用,也设置了Scheme,打开微信支付只有一个白色的按钮,这是没转MD5前的singe,appid=wx12f97ce1a13b26c8&noncestr=yaTgt1TSulyiV2qS&package=Sign=WXPay&partnerid=1318149601&prepayid=wx20160413095638d05b0c56350893295075&timestamp=1460512598&key=153875453561986aiitaiit187574722 :smile: :smile:
        Leonmmmmm:@风的畅想 只有一个白色按钮多半是prepayId 无效的原因,或者签名失败
      • 6309b0eed1c7:代码在哪儿呢?
        Leonmmmmm:@小小bug 文章开头甩链接了
      • 56c5ed1c1555:大神,问一下,你demo里的三方库有90+M,太大了,这个能不能改小啊
      • 一个奴隶搬砖的程序媛:大神, 我按照你的方法写了, 但是还是不走, 可以指导一下么?
        Leonmmmmm:@56c5ed1c1555 我有另一篇文章是关于回调方法不走的解决办法的,看了吗?
        56c5ed1c1555:@CoderLeon 我的回调也没走
        Leonmmmmm:@_喜之郎 简单说明一下你的问题呗:smile:
      • af9de3b96476:请问一下,我更换了Identifier,是不是需要重新申请一个微信ID
        Leonmmmmm:@啊哈小霸王其乐无穷 不需要,只需要把你开放平台上应用的Bundle Id也修改了就好了
      • c0afc3399392:大神我是LaunchServices: ERROR: There is no registered handler for URL scheme weixin,
        schemes也设了啊,白名单也加了。老是出现这个问题,怎么办啊?急~
        c0afc3399392:@c0afc3399392 大神我把demo发过去,能不能帮我看下
        c0afc3399392:@CoderLeon 我在LSApplicationQueriesSchemes 底下把两个都加了
        Leonmmmmm:@c0afc3399392 你确定你白名单添加了?你仔细看看。微信要添加两个白名单的。一个wechat 一个weixin
      • c44c30ad4603:大神 关于左上角的返回没有回掉而右边的返回有回调,虽然不算bug,但是操作不当可能会有问题的问题,您有什么好的解决办法吗?
        一个奴隶搬砖的程序媛:@夜游零 我们的解决办法是后台写回调, 改变订单状态不在前端改变, 而是通过后台回调直接改变
      • d3f755ebf870:demo在哪下载?LZ
        d3f755ebf870:@CoderLeon 恩恩 我昨天也看到了 出了点问题 现在找到了 谢谢
        Leonmmmmm:@heysmile 我甩了百度云了啊
      • fdy:你好。为何我的不走通知?
        fdy:@CoderLeon 微信支付,能加你扣扣细聊吗?我的1129240293
        fdy:恩。微信支付,我是在block里面写的通知
        Leonmmmmm:@fdy 微信支付吗?是接不到通知,还是通知根本没发送?通知没发送可能是你的微信OnResp回调方法没走。
      • CoderXYF:请问下为什么我把你的支付宝代码集成到我的项目里面以后,支付成功并返回到app却不返回任何结果呀?
        [[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);这个它根本就不打印,是怎么回事呢?
      • CoderXYF:请问[self payTHeMoneyUseAliPayWithOrderId:@"这里填写后台返回给你的订单id" totalMoney:@"这里填写钱数(单位/元)" payTitle:@"这里告诉客户花钱买了啥,力求简短"]...这里所说的"这里填写后台返回给你的订单id",我问后台后台说不用她返给我订单id啊,那我是在前端- (NSString *)generateTradeNO
        {
        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;
        }就这样子生成吗?正式项目这样做合理吗?
        fdy:你好,你的通知走吗?
        CoderXYF:@CoderLeon 答得好详细,谢谢啦!
        Leonmmmmm:@96347752af17 这个id确实不是强制性让后台给你的,你自己这样随机生成也是可以正常调起支付宝的。但是正常项目里,为了方便后台数据的管理,最好还是后台给订单生成id,这样方便后台对数据进行维护。防止出现同一个订单前后端订单id不一致的麻烦。😄
      • Ke_Wang:你好 请问下,我按照你的方式,做了个 demo,在payRequsestHandler.h文件里面填入了信息,ViewController里面的 参数也填好了,用真机测试 了一下,能够打开微信客户端,但是打开后只有中间一个白色的 “确定按钮”,点击后会回到我的APP上,请问这是怎么回事呀?
        Leonmmmmm:@WK_IOSDevelpoer 那个prepayid是需要真实有效的id的。不然微信服务器不能识别你的订单,所以不能正常调起支付:smile:
        Ke_Wang:@CoderLeon : :joy: :joy: :joy: 嗯是 的 我们公司的还没弄好,我用的是支付宝demo里面抓出来的东西。。。结果。。。。
        Leonmmmmm:@WK_IOSDevelpoer 应该是你的prepayid 参数的问题,过期了,或者不是真实的id。你参数是怎么获取到的?
      • nzbypl:你们用的怎么,楼主能加qq教我下吗。604775466
        nzbypl:然后大神,能不能再出个百度地图的教材啊。 :heart_eyes:
        nzbypl:@CoderLeon 微信支付的那个金额怎么加上去。。
        Leonmmmmm:@杨盼亮 你读我给你的文档了吗?按照文档慢慢集成就好了啊,你遇到什么问题了?
      • 半夏吖:学习了 .
      • b8432f928fd2:你好 我的应用已经开发了一款 现在又要开发一款类似的 要重新给应用到微信和支付宝注册吗
        Leonmmmmm:@b8432f928fd2 需要啊,每个应用都是唯一的。不然你支付完成之后回调的时候就不一定回到哪个程序了。
      • 盲神:大神 我自己写的demo 现在的情况是 支付完成以后回到了微信,而且没有调用 - (void)onResp:(BaseResp *)resp 这个回调方法 很郁闷 问题出在哪呀
        795503088d4e:我写的微信支付控制台没有输出错误信息,但还是不走onResp这个方法 ,这是为什么呀??
        Leonmmmmm:@Dream晗晗 看下文章更新内容吧:smile:,onResp不走是9.0之后废弃了两个方法:smile:
        Leonmmmmm:@Dream晗晗 真机调试的时候控制台输出什么了吗?Scheme设置了吗?
      • a0be1bb1d168:通俗易懂,很喜欢。可是没钱打赏你了...
        Leonmmmmm:@淡定的码农 哈哈哈哈,能帮到人就好了:smile:,这样才有动力写别的:grin:
      • 奔波儿灞与灞波儿奔:按照你的demo写的,支付完成之后一直留在微信,是不是哪个参数没有配置呀,求救呀大神
        919458797@q.com
        1364f57ee045:@奔波儿灞与灞波儿奔 你的问题解决了么,我现在遇到同样的问题
        Leonmmmmm:@奔波儿灞与灞波儿奔 设置URLType中的Scheme了吗?
      • 格调main:挺好的, 就是不知道微信支付,服务端返回数据是什么样子的 和服务端怎么搞的
        Leonmmmmm:@格调main 是这样,这些数据我都整理好了。唯一需要频繁变动的两个参数我给设置成了变量。其他要么是固定值,要么在宏中定义了
        格调main:@CoderLeon 嗯 是的 你数据的组合是在前端的 我看官方的 直接获取{
        "appid":"wxb4ba3c02aa476ea1",
        "noncestr":"23e55cf2bdd3ac2c2a8c9977be8c06e6",
        "package":"Sign=WXPay",
        "partnerid":"10000100",
        "prepayid":"wx20151208110530f2c0e2b1030972688102",
        "timestamp":"1449543930",
        "sign":"2083032568DA67026A5D2A2CBFD1C6F8"
        }直接就用了,
        Leonmmmmm:@格调main 服务端给你返回的数据应该都是json吧,你解析之后只需要两个字段,就是文章中提到的,一个id和一个随机字符串,然后传给我的类目中的方法就可以了,至于服务端怎么跟微信服务器建立连接的话,前端开发人员应该暂时不用考虑这些的:smile:
      • 小卒的梦:good
        Leonmmmmm:@小卒的梦 希望能帮到你
      • coderyin:很好用 用过了才知道
      • 89459e326014:呵呵,mark
        和之一:@CoderYu 程序猿们交流啦 http://www.jianshu.com/p/461c82712570

      本文标题:IOS集成第三方支付、分享、登录功能小结

      本文链接:https://www.haomeiwen.com/subject/arhthttx.html