玩转iOS开发:集成 WeChat SDK - 支付篇

文章转至: https://cainluo.github.io/14735762460993.htmlphp


做者感言

惯例, 开头都是要说些东西的了, 随着如今的App愈来愈商业化, 不少公司的App都会集成第三方的支付SDK, 这样子的成本就比较低, 可是呢, 有不少朋友仍是不太会集成, 也不太爱看集成文档(我也是~), 想了想, 仍是写一篇关于支付的文章吧, 如今写的是**微信支付, 过段时间就把支付宝**, 银联, **Apple Pay**的也补上.html

最后: 若是你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考大家的意见再进行修改, 联系我时, 请备注WeChat支付若是以为好的话, 但愿你们也能够打赏一下~嘻嘻~祝你们学习愉快~谢谢~ios


简介

微信SDK, 一个集成了社会化分享以及财付通支付功能的SDK, 须要商家先去微信开放平台先登记注册, 审批事后才能得到商家ID, 这样子才能使用支付功能, 下面让咱们一块儿来看看吧.c++


准备工做

首先, 咱们要来作好准备工做:git

  • 1.申请商家ID
  • 2.申请App ID
  • 3.下载, 集成SDK包
  • 4.添加依赖包
  • 5.最后, 调起支付

作好以上的工做, 微信的SDK集成就告一段落了~github


申请商家ID

这里就不作详细介绍了, 毕竟咱们这里讲的是如何集成SDK, 若是想了解的童鞋, 能够自行去**微信公众平台**自行查看哈~sql


申请App ID

申请**App ID这里也不作介绍, 这个步骤也很简单, 直接去微信开放平台, 根据对应的指导信息, 一步一步的往下填写就OK了, 微信的App ID**是须要审核时间的, 快的话几分钟, 慢的话, 慢慢等吧~~编程


下载SDK包

下载SDK包, 这个更加的简单了, 直接去到**资源中心看到iOS开发工具包64位**就赶忙坚决果断的直接点下载,服务器

1

下载完成以后, 咱们来看看SDK包里都有啥微信

2

我看了看2.0版本的Demo, 里面竟然是没有微信支付的相关代码, 这至关蛋疼, 若是是第一次集成的童鞋们, 那就要哭了...不过好在咱们用庞大的互联网搜索引擎, 谷歌, 百度, 这些问题都是能够解决的,


再废话一段

废话讲了那么多, 如今让咱们来看看怎么集成DSK包, 咱们先建立一个**WorkSpace文件, 叫PayProject, 而后再建立咱们的第一个工程WeChatPay-Objective-C, 因为以前有人和我反应过, 为啥没有Swift版本的, 其实不是我想写Swift版本, 是它的语法到如今竟然都尚未定型, 每一个版本改一丢丢, 这比较蛋疼, 如今有人反应, 那我从此也把Swift版本给补上吧, 若是之后语法继续有更改, 那你们就根据本身的编程经验以及Xcode**的提示自行修改哈~~


配置工程

打开咱们建立好的**WeChatPay-Objective-C工程, 把SDK**包拖进去, 这里的文件夹我更名字了, 大家也能够根据大家本身的喜爱来改

3

添加完**SDK包以后, 咱们还要操做某些东西, 由于在iOS 9以后, 苹果限制了正常的HTTP请求, 若是咱们要继续用, 就得先配置一下~~在微信的SDK**文件夹里也有声明

4

打开工程, 找到工程的**Info.plist**文件, 直接添加就行了, 有时候Xcode不会提示, 须要咱们手动填入, 这个就比较蛋疼了, 我这里就列举出来吧

  • Application requires iPhone environment
  • LSApplicationQueriesSchemes
  • App Transport Security Settings
    • Allow Arbitrary Loads

5

添加完这些以后, 仍是不够的, 咱们须要去添加一个**URL Schemes, 这里我先提供一个App ID, 是从之前的微信官方Demo里拷贝下来的~~wxb4ba3c02aa476ea1, 童鞋们自动复制粘贴哈, 这个时候, 咱们就要打开工程配置了, 而后添加微信的URL Schemes**

6

到这一步, 基本上这个阶段已经告已段落了, 继续下一个阶段~~~


添加依赖包

使用第三方**SDK**最蛋疼的一件事就是须要添加不少的依赖包, 由于第三方须要作数据的收集, 或者其余操做之类的, 这样子你才能在他们的后台列表了查询到你的App流量, 微信的依赖包有好几个,

  • UIKit.framework
  • Foundation.framework
  • SystemConfiguration.framework
  • CoreTelephony.framework
  • Security.framework
  • libz.tbd
  • libc++.tbd
  • libsqlite3.tbd

如今咱们就来添加这些依赖包吧, 怎么添加应该不用我说了吧0.0

7


注册AppID

前期工做咱们都作完了, 如今咱们就用代码来实现微信支付~, 首先咱们确定要先注册一下微信**App ID, 否则别说支付了, 就连分享神马之类的功能你都无法用, 打开AppDelegate.m, 导入WXApi.h文件, 注册App ID, 这个App ID, 就是我刚刚提供的那个wxb4ba3c02aa476ea1**.

8


布局UI

要调起微信支付, 咱们确定要有一个点击事件, 这里的**UI, 咱们就只给个UIButton和一个Action**事件就行了.

9


调起微信支付

重头戏来了, 前面作了那么多的工做, 写了那么多的废话, 只为了如今真正的调起微信支付进行支付~~

10

实现代码都给大家贴出来了~这是我在之前的官方Demo中拷贝出来的~

PS: 这里是Demo, 因此这里拿到的神马签名啊, 商户ID, 支付连接神马的, 都是写在客户端的, 但在实际开发当中, 这是强烈不建议在客户端内本身生成, 必定必定要由服务器返回, 否则你会很是深入的了解到蛋疼这个词语是啥意思~~

NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:queue
                           completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
                               
                               if (data != nil) {
                                   
                                   NSError *error;
                                   NSMutableDictionary *dictionart = NULL;
                                   
                                   dictionart = [NSJSONSerialization JSONObjectWithData:data
                                                                          options:NSJSONReadingMutableLeaves
                                                                            error:&error];
                                   
                                   NSLog(@"URL: %@", urlString);
                                   
                                   if (dictionart != nil) {
                                       
                                       NSMutableString *retCode = [dictionart objectForKey:@"retcode"];
                                       
                                       if (retCode.integerValue == 0) {
                                           
                                           NSMutableString *stamp = [dictionart objectForKey:@"timestamp"];
                                           
                                           // 调起微信支付
                                           PayReq *req   = [[PayReq alloc] init];
                                           req.partnerId = [dictionart objectForKey:@"partnerid"];
                                           req.prepayId  = [dictionart objectForKey:@"prepayid"];
                                           req.nonceStr  = [dictionart objectForKey:@"noncestr"];
                                           req.timeStamp = stamp.intValue;
                                           req.package   = [dictionart objectForKey:@"package"];
                                           req.sign      = [dictionart objectForKey:@"sign"];
                                           
                                           [WXApi sendReq:req];
                                           
                                           // 日志输出
                                           NSLog(@"appid = %@", [dictionart objectForKey:@"appid"]);
                                           NSLog(@"partnerId = %@", req.partnerId);
                                           NSLog(@"prepayId = %@", req.prepayId);
                                           NSLog(@"nonceStr = %@", req.nonceStr);
                                           NSLog(@"timeStamp = %d", req.timeStamp);
                                           NSLog(@"package = %@", req.package);
                                           NSLog(@"sign = %@", req.sign);
                                           
                                       } else {
                                           
                                           NSLog(@"retmsg: %@", [dictionart objectForKey:@"retmsg"]);
                                       }
                                   } else {
                                       
                                       NSLog(@"服务器返回错误, 未获取到JSON对象");
                                   }
                               } else {
                                   
                                   NSLog(@"服务器返回错误");
                               }
                           }];
复制代码

处理回调结果

实现代码咱们都搞定了, 如今咱们差的就是要处理微信回调回来的结果, 不管你支付成功或者是支付失败, 仍是微信服务器爆炸了, 这个结果咱们都要获取到, 还有对应的**errCode.
打开
AppDelegate.m, 咱们要添加微信的代理协议, 实现一个微信的代理方法, 以及AppDelegate**的两个方法

11

具体实现的代码

- (void)onResp:(BaseResp *)resp {
    
    if ([resp isKindOfClass:[PayResp class]]) {
        
        NSString *stringMessage = @"支付结果";
        NSString *stringTitle  = @"支付结果";
        
        switch (resp.errCode) {
            case WXSuccess:
                
                stringMessage = @"支付结果: 成功!";
                
                NSLog(@"支付成功 - PaySuccess, retCode = %d", resp.errCode);
                
                break;
            default:
                
                stringMessage = [NSString stringWithFormat:@"支付结果: 失败!, retcode = %d, retstr = %@", resp.errCode, resp.errStr];
                
                break;
        }
        
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:stringTitle
                                                            message:stringMessage
                                                           delegate:nil
                                                  cancelButtonTitle:@"好的"
                                                  otherButtonTitles:nil, nil];
        
        [alertView show];
    }
}

- (BOOL)application:(UIApplication *)application
      handleOpenURL:(NSURL *)url {
    
    return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    
    return [WXApi handleOpenURL:url delegate:self];
}
复制代码

最终效果

12


工程地址

项目地址: https://github.com/CainRun/PayProject


最后

码字很费脑, 看官赏点饭钱可好

微信

支付宝
相关文章
相关标签/搜索