Paste_Image.png

因为项目中需要用到支付,所以这一周就开始集成支付,因为微信支付貌似需要缴纳200元才能使用微信第三方登陆,支付等功能,所以公司先要求集成支付宝,百度了一下,集成支付宝的过程,很多人都说集成支付宝太坑了,但我觉的前端还好,坑的是后台,后台天天吆喝着支付宝官方的文档和demo太坑了,如果是后台的话,不要太相信支付宝官方文档和demo,话不多说,集成开始!!!!!

支付大概流程图

(下面的话是引用 )
(文/WK_IOSDevelpoer(简书作者)
原文链接:http://www.jianshu.com/p/b88f87a552a1)

1.用户选好了商品后,点击提交订单(一般是这样),选择使用支付宝付款。
2.手机客户端(你做的APP)把用户选择的商品的信息传给你们后台服务器。
3.后台的服务器将各种数据拼接签名后生成一个签名后的字符串,回传到客户端APP上。
4.用户点击确认支付按钮,调用手机支付宝客户端(在你手机上装的那个),利用后台传过来的那个参数调起支付宝,让支付宝客户端传给他们服务器交互,进行付款。(这一步是支付宝自己完成的,安全性高)
5.支付宝的服务器将支付的结果(可能成功也可能不成功)返回给手机支付宝客户端和你们公司的后台服务器。
6.你们公司后台服务器收到后一般是更新下数据信息(这个咱们不用管),手机支付宝客户端会显示一下支付成功,咱们的客户端也可以显示一个订单支付成功之类的东西(就像在手机12306订票,用支付宝支付后支付宝客户端会说一次支付成功,12306也会说一次支付成功,咱们就像12306客户端一样,需要再说一次订单支付成功)。

1.下载官方demo和sdk

https://github.com/chenyang-ios/alipay.git
里面有官方demo和sdk,下这个就行,在一起呢!!!

2、配置支付宝sdk

01配置支付宝的SDK.png

3、导入依赖库

Paste_Image.png

4、添加 URL schme

05URL schme配置.png

5、添加白名单

在info.plist里面添加

Paste_Image.png

6、在pch文件里面导入

增加一个预编译头文件,导入
import <Foundation/Foundation.h>
import <UIKit/UIKit.h>

7、编译,会报错

Paste_Image.png

解决办法:Targets->Build Settings->Header Search Path中添加AliPaySDK文件夹的路径

!!!!!添加路径的时候直接将路径拖进去就行了,不要看到里面有个加号,先点击加号,再拖进去,那是没用的~这个我弄了半天,烦人!!!!

Paste_Image.png

8.如果编译没问题就成功一大半了,我们开始集成代码,直接上代码,用的话直接粘贴复制!!!在点击支付的按钮的触发事件里面写

"

  //1. partnerIDNSString *partnerID = @"2088421512225446";//2. sellerIDNSString *sellerId = @"miracle@mcqiji.com";//3. 私钥 NSString *privatekey = @"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALvqLWelnudXoSuEWXS+8RUMiTg0qrFWP2PrDFg9Keb9DyiCJbabZp7eoX1EJxETWuoXsNpmTS0IkYG5GSMdEcf1kFYR8XRr4dkFsXv+cOd0i+uXm26/IlYm48jX6VANtQBqESbv+7vYQoPeCD6fPh2bqD9BLaRtyGs10bGBm0GFAgMBAAECgYBT6K19qqbaBnchR2fqiZh9HavoPRw7M5f6teo9PJKJYlZycCsG7z1Tk3XoyZXoOgxOm2WNIEE16q2Oj2h6FXDqY7n17bw64lxERpFIMzuKEqVSGeDqHaVEFtN1EE1XRH04DY00UQEaIEpdX0FeRkxzpHWeRVQUpPreX0wT3ENBwQJBAPZSRBjrhPlO8xRhq4uGBp4bejNbYilgIhkkCC5/qYIBUxwoW4kSYvsJ/8tywYQ5I8I6Py1bRBBocyUFNe2yhvMCQQDDTGcBZv9Gs5etGWC3MFNYwQXDip3iL6R7Rv8xuD70N9YUneVPxP+Nikb2dihbuvyAMIfjyt70rwVp3c+gBiOnAkAHl5mJuxiqJojPhAMplcP2c5pcouBvrgrfA4FNDZpH64qIP6Yyn2J1omVD/BGC5c/4WJtB5qI+bzm9Vl/HJ82JAkEAgLzfdbQweKmwRUHiWD954ZqzsvewJcakFUNyu5KppREdhM+ktpW0o9fP+W1gIz+6bMIRAd7cY8zvs56s297QJwJAFSROxXaKUTQJ2DPrDL6YPE+7QjuS31KJMhJXWs7XPWWELigdHYrhCDPO5BQb7Vkz9p5prZRUDIINZbqJA7qSHQ=="; /* *生成订单信息及签名 */ //将商品信息赋予AlixPayOrder的成员变量 Order *order = [[Order alloc] init]; order.partner = partnerID; order.sellerID = sellerId; order.outTradeNO = _num; //订单ID(由商家自行制定) order.subject = _titl; //商品标题 order.body = _cont; //商品描述 order.totalFee = [NSString stringWithFormat:@"%@",jiage]; //商品价格 order.notifyURL = huiURL; //回调URL order.service = @"mobile.securitypay.pay"; order.paymentType = @"1"; order.inputCharset = @"utf-8"; order.itBPay = min; order.showURL = @"m.alipay.com"; //应用注册scheme,在AlixPayDemo-Info.plist定义URL types NSString *appScheme = @"alisdkdemo"; //将商品信息拼接成字符串 NSString *orderSpec = [order description]; NSLog(@"orderSpec = %@",orderSpec); // //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode // id<DataSigner> signer = CreateRSADataSigner(privatekey); // // NSString *signedString = [signer signString:orderSpec]; //将签名成功字符串格式化为订单字符串,请严格按照该格式 NSString *orderString = nil; if (qianming != nil) { orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec,qianming, @"RSA"]; NSLog(@"%@",orderString); [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }]; }

为了安全订单信息都是后台给你的

Paste_Image.png

这个官方签名订单信息,官方demo把订单号和签名都放在前端了,但是实际开发是签名订单号都是后台做的,让后台给你就行,到时候这两句话屏蔽,将

Paste_Image.png

将官方的画框的直接替换成从后台获取的的签名就行

在appdelegate.m文件的代码,有两个方法,一个是9.0之后的,一个是9.0之前的,为了安全我都写了

导入头文件
import <AlipaySDK/AlipaySDK.h>

//9.0之后的
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //如果极简开发包不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给开发包 if ([url.host isEqualToString:@"alisdkdemo"]) { [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】 NSLog(@"result = %@",resultDic); NSInteger orderState=[resultDic[@"resultStatus"] integerValue]; if (orderState==9000) { NSString *allString=resultDic[@"result"]; NSString * FirstSeparateString=@"\"&"; NSString * SecondSeparateString=@"=\""; NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithDictionary:[UserInfo VEComponentsStringToDic:allString withSeparateString:FirstSeparateString AndSeparateString:SecondSeparateString]] ; NSLog(@"ali=%@",dic); if ([dic[@"success"]isEqualToString:@"true"]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"AliPaySucceed" object:nil userInfo:dic]; NSLog(@"支付成功"); [[NSNotificationCenter defaultCenter] postNotificationName:@"result" object:nil userInfo:resultDic]; } }else{ NSString *returnStr; switch (orderState) { case 8000: returnStr=@"订单正在处理中"; break; case 4000: returnStr=@"订单支付失败"; break; case 6001: returnStr=@"订单取消"; break; case 6002: returnStr=@"网络连接出错"; break; default: break; } } }]; } if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) { //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】 NSLog(@"result = %@",resultDic); }]; } return YES; } //9.0之前的方法 -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{ [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); NSInteger orderState=[resultDic[@"resultStatus"] integerValue]; if (orderState==9000) { NSString *allString=resultDic[@"result"]; NSString * FirstSeparateString=@"\"&"; NSString * SecondSeparateString=@"=\""; NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithDictionary:[UserInfo VEComponentsStringToDic:allString withSeparateString:FirstSeparateString AndSeparateString:SecondSeparateString]] ; NSLog(@"ali=%@",dic); if ([dic[@"success"]isEqualToString:@"true"]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"AliPaySucceed" object:nil userInfo:dic]; NSLog(@"支付成功"); [[NSNotificationCenter defaultCenter] postNotificationName:@"result" object:nil userInfo:resultDic]; } }else{ NSString *returnStr; switch (orderState) { case 8000: returnStr=@"订单正在处理中"; break; case 4000: returnStr=@"订单支付失败"; break; case 6001: returnStr=@"订单取消"; break; case 6002: returnStr=@"网络连接出错"; break; default: break; } } }]; return YES; }

appdelegate里面的方法block是走app客户端的时候才会调用,如果手机没有客户端,就回自动跳到网页端,没事,支付宝直接写好了,我们不用管,网页端支付成功会走这个block

Paste_Image.png

客户端的话会走这个block

Paste_Image.png

支付成功的页面跳转问题,我用的是通知,不能直接跳的!!!这个要注意,比如用客户端

在appdelegate里面

Paste_Image.png

在点击支付的里面

Paste_Image.png

注意如果遇到这个问题,一般是签名错了,问后台,让他改!!!

Paste_Image.png

支付成功以后支付宝给你返回的9000(代表支付成功),或者其他的,这个只是支付宝通知的,直返完成支付宝还会给后台异步通知,后台要判断签名被人篡改没有,最终的支付状态还是要听后台的,在那两个block里面在进行一次网络请求,让后台给你支付状态,成不成功听后台的!!!!!!我感觉我想到的我都写了,还有什么问题可以给我留言~~~

出处这里:http://www.jianshu.com/p/13db9e3adad8

转载于:https://www.cnblogs.com/xiaohouzai/p/7041813.html

实战--接入最坑的支付宝相关推荐

  1. [iOS]贝聊 IAP 实战之见坑填坑

    大家好,我是**贝聊科技** 的 iOS 工程师 @NewPan. 这次为大家带来我司 IAP 的实现过程详解,鉴于支付功能的重要性以及复杂性,文章会很长,而且支付验证的细节也关系重大,所以这个主题会 ...

  2. python搭建项目结构_Django搭建项目实战与避坑细节详解

    Django 开发项目是很快的,有多快?看完本篇文章,你就知道了. 安装 Django 前提条件:已安装 Python. Django 使用 pip 命令直接就可以安装: pip install dj ...

  3. python避坑_Django搭建项目实战与避坑细节详解

    Django 开发项目是很快的,有多快?看完本篇文章,你就知道了. 安装 Django 前提条件:已安装 Python. Django 使用 pip 命令直接就可以安装: pip install dj ...

  4. 血泪总结:如何从微信小程序的坑跳进支付宝小程序的大坑

    众所周知,iOS没人要了,小程序现在火了... 哈哈,开玩笑,不过小程序真是非常火 所以,今天我就来讲讲最近折腾出的小程序总结:如何从微信小程序的坑跳进支付宝小程序的大坑! 小程序非常适合不经常使用的 ...

  5. 安卓 Native+Flutter 应用开发入门资料、亲身实战及踩坑记录

    安卓 Native+Flutter 应用开发实战及踩坑记录,练手入门项目:FluLearn 入门资料 第三方共享包检索(国内).第三方共享包检索(国外) Flutter开发环境搭建(中文版).Flut ...

  6. SpringBoot工程接入第三方支付渠道支付宝(C扫B支付)

    目录 1.C扫B的概念 2.支付宝接口调研 2.1.产品列表 2.2.线下场所接入支付 3.配置支付宝沙箱环境 3.1.简介 3.2.注册开放平台账号 3.3.配置密钥 3.4.沙箱账号 4.生成二维 ...

  7. 实战:第八章:支付宝Native,JSAPI支付与微信Native,JSAPI,MWEB支付实现

    首先是H5的支付,先看控制层的代码 @AutowiredAliPayH5Bean aliPayH5Bean;@AutowiredWxPayH5MWEB wxPayH5MWEB;@AutowiredWx ...

  8. Android组件化与插件化开发项目实战整理分享(含支付宝、360、美团、滴滴等大厂项目实战)

    小公司不说,但是在大公司的项目发展到一定程度,就必须进行模块的拆分.模块化是一种指导理念,其核心思想就是分而治之.降低耦合.而在 Android 开发的实践,目前有两种途径来实现,一个是组件化,一个是 ...

  9. 单个APP接入多个微信支付宝支付的一种解决方案

    背景 最近在对接微信支付宝支付的时候出现了一个需求,由于我们公司在不同的地区有分公司,为了实现财务对账方便,不同公司的客户需要打款到相应的公司的账户,也就是要实现接口分账,一听到这个需求,我一脸懵逼, ...

  10. 个人开发者只要一行代码接入微信支付和支付宝支付

    接入支付功能   对于个人开发者来说,我们很希望我们开发的App被广泛使用,同时可以获得一些额外收入,那就更好了.但是在微信开放平台或者支付宝开放平台申请支付功能,需要是企业才可以接入,对于我们个人开 ...

最新文章

  1. 在Photoshop扣图的基本方法
  2. 全面解析Inception Score原理及其局限性
  3. 附近的人 php,php 附近的人
  4. Configuate Mac OSX $PATH
  5. WINCE 网卡控制
  6. 计算机二级access知识点6,2019年计算机二级ACCESS考试知识点:关系数据模型
  7. 项目团队中的五种人(之一)
  8. R语言预测初步(R语言预测实战-节选)
  9. ZZULIOJ 1917: E
  10. 使用Proxmox 和 Deskpool 搭建桌面云系统
  11. centOs7 安装docker 镜像
  12. 微信android自动播放视频文件,vue-player或TcPlayer在微信内自动播放video和audio
  13. IOC框架---什么是IOC
  14. 2188 完成比赛的最少时间(递推)
  15. Windows操作系统+朝鲜红星+国产麒麟+红旗+渗透专用系统+Oracle专用+技术专栏【资源大合集】 | 寻找C站宝藏
  16. Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager
  17. 《嵌入式 - Lwip开发指南》第4章 移植LWIP(基于RT-Thead系统-以太网+Wifi)
  18. 【luogu P7473】重力球
  19. 文件管理工具,如何批量将文件名改成对应文件夹的名称
  20. 【功能业务篇】APP授权微信登录、绑定账号测试思考

热门文章

  1. 输入年份 计算 生肖 C语言实现
  2. 读书若谈恋爱:如何阅读一本书?
  3. 用泰勒展开式计算sin(x)的值
  4. python字典forward_python工具库库介绍-bidict: 双向字典
  5. Linux系统分区管理与swap分区
  6. alot英文怎么读_alot of是什么意思
  7. 关于三维制作技术软件的调研分析
  8. 2016 工作、生活与得失
  9. 申城常用电话(必看)(转)
  10. 雪豹学院主办“2019年《ASM敏捷大咖》见修系列公开课”深圳宝安站活动圆满结束