一、支付宝支付
1、下载SDK:支付宝SDK下载地址
2、支付流程图请好好看一看,你就会明白你应该做什么

T1TkxgXcBjXXXXXXXX.png

好了,看完了发其实我们需要做的就是(ps:为了安全起见,签名都在后台处理):
• 调用支付宝支付接口
• 处理支付宝返回的支付结果
3、把下载的demo中以下文件(如图)的导入到自己的工程中

屏幕快照 2017-04-12 下午3.32.01.png

4、在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖: 添加支付宝依赖官方链接

LB1PlBHKpXXXXXoXXXXXXXXXXXX.png

5、Xcode设置URL scheme和LSApplicationQueriesSchemes
(LSApplicationQueriesSchemes中alipay是针对于支付宝的其他的是针对于微信和银联的,如果不继承可以不添加,只添加alipay即可)

1402122-c474da5111068cfe.png

屏幕快照 2017-04-12 下午3.38.12.png

6、在需要的地方导入#import <AlipaySDK/AlipaySDK.h>,#import "Order.h",#import "RSADataSigner.h"
7、AppDelegate.m文件中,增加引用代码:

//9.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);}];// 授权跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);// 解析 auth codeNSString *result = resultDic[@"result"];NSString *authCode = nil;if (result.length>0) {NSArray *resultArr = [result componentsSeparatedByString:@"&"];for (NSString *subResult in resultArr) {if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {authCode = [subResult substringFromIndex:10];break;}}}NSLog(@"授权结果 authCode = %@", authCode?:@"");}];}return YES;
}//9.0后的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{//支付宝处理支付结果if ([url.host isEqualToString:@"safepay"]) {// 支付跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}];// 授权跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);// 解析 auth codeNSString *result = resultDic[@"result"];NSString *authCode = nil;if (result.length>0) {NSArray *resultArr = [result componentsSeparatedByString:@"&"];for (NSString *subResult in resultArr) {if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {authCode = [subResult substringFromIndex:10];break;}}}NSLog(@"授权结果 authCode = %@", authCode?:@"");}];}return YES;
}

8、根据订单信息发起支付调用方法,orderString和appScheme。appScheme是app在info.plist注册的scheme,建议用支付宝注册的appid。orderstring是一个订单的字符串,由后台拼接生成的,还需要签名的

[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {NSDictionary *dic = resultDic;NSString *resultStr = EncodeFormDic(dic, @"resultStatus");NSLog(@"resultStr_%@",resultStr);[self paymentResult:resultStr];}];-(void)paymentResult:(NSString *)resultd {NSLog(@" = %@",resultd);//结果处理if ([resultd isEqualToString:@"9000"]) {//支付宝回调显示支付成功后调用自己的后台的借口确认是否支付成功[self payOrdCallback:@"1"];}else if ([resultd isEqualToString:@"6001"]){[self payCancel];}else{[self payFail];}
}

9、支付宝集成过程中一些错误的解决办法请参考文章

二、微信支付(官方开发文档)
1、下载SDK:微信SDK下载地址
2、看完支付流程图,你会我们要做的也是调起微信客户端发起支付和处理支付结果,和支付宝基本一样

chapter8_3_1.png

3、导入SDK

屏幕快照 2017-04-12 下午3.58.48.png

4、导入依赖
1. SystemConfiguration.framework
2. libz.tbd
3. libsqlite3.0.tbd
4.CoreTelephony.framework
5. QuartzCore.framework
5、Xcode设置URL scheme和LSApplicationQueriesSchemes,参照支付宝,图片中有微信的

111.png

6、在需要的地方导入#import "WXApi.h"
7、AppDelegate.m文件中,增加引用代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch./***  向微信终端注册ID,这里的APPID一般建议写成宏,容易维护。@“测试demo”不需用管。这里的id是假的,需要改这里还有target里面的URL Type*/[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"测试demo"];return YES;
}
//9.0前的方法,为了适配低版本 保留
- (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];
}//9.0后的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{//这里判断是否发起的请求为微信支付,如果是的话,用WXApi的方法调起微信客户端的支付页面(://pay 之前的那串字符串就是你的APPID,)return  [WXApi handleOpenURL:url delegate:self];
}//微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的
-(void) onResp:(BaseResp*)resp
{  if ([resp isKindOfClass:[PayResp class]]) {PayResp *response = (PayResp *)resp;switch (response.errCode) {case WXSuccess://服务器端查询支付通知或查询API返回的结果再提示成功NSLog(@"支付成功");//通过通知告诉支付界面该做哪些操作[[NSNotificationCenter defaultCenter] postNotificationName:@"WEIXINPAYS" object:nil];break;case WXErrCodeCommon:NSLog(@"支付失败");[[NSNotificationCenter defaultCenter] postNotificationName:@"WEIXINPAYF" object:nil];break;case WXErrCodeUserCancel:NSLog(@"用户取消");[[NSNotificationCenter defaultCenter] postNotificationName:@"WEIXINPAYC" object:nil];break;default:NSLog(@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr);break;}}
}

8、根据后台返回数据发起支付,需要的参数在方法中有详细注释

- (void)gotoWXPay {PayReq* req             = [[PayReq alloc] init];req.openID              = @"wxf7c591d3fdd34070";//appid换成自己的req.partnerId           = @"1245663002";req.prepayId            = @"wx2015060917151801798122a30971214164";//预支付订单IDreq.nonceStr            = @"3Lnr21zhhGO2DwwFbI2amMq0cJcggLGe";//参与签名的随机字符串,随机编码,为了防止重复的,在后台生成req.timeStamp           = 1433841320;//参与签名的时间戳,也是在后台生成的,为了验证支付的req.sign                = @"B7C57CCAA2236764E281DA94966046B7";//签名字符串,也是后台做的req.package             = @"Sign=WXPay";//这个比较特殊,是固定的,只能是即req.package = Sign=WXPay[WXApi sendReq:req];
}

在发起支付的界面做微信回调的监听,并在监听返回支付成功(也就是payOk:方法中)是调用自己后台的接口再次确认是否真正支付成功

/* 微信支付回调监听 */[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payOk:) name:@"WEIXINPAYS" object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payCancel) name:@"WEIXINPAYC" object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payFail) name:@"WEIXINPAYF" object:nil];

9、注意微信支付只能调用App进行支付,所以需要判断

if ([WXApi isWXAppInstalled]) {//判断是否有微信[self gotoWXPay];//微信支付
}

三、银联支付(APP集成官网
1、下载SDK:银联SDK下载地址
2、支付流程图

yinlian.png

3、导入SDK中的UPPaymentControl.h和libPaymentControl.a文件

屏幕快照 2017-04-12 下午4.56.44.png

4、导入依赖

屏幕快照 2017-04-12 下午5.04.28.png

5、Xcode设置URL scheme和LSApplicationQueriesSchemes,参照支付宝

屏幕快照 2017-04-12 下午5.06.48.png

屏幕快照 2017-04-12 下午5.07.54.png

6、在需要的地方导入#import "UPPaymentControl.h"
7、AppDelegate.m文件中,增加引用代码:

//9.0前的方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {//银联支付处理支付结果if([url.host isEqualToString:@"uppayresult"]){[[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {if([code isEqualToString:@"success"]) {//            //如果想对结果数据验签,可使用下面这段代码,但建议不验签,直接去商户后台查询交易结果//            if(data != nil){//                //数据从NSDictionary转换为NSString//                NSData *signData = [NSJSONSerialization dataWithJSONObject:data//                                                                   options:0//                                                                     error:nil];//                NSString *sign = [[NSString alloc] initWithData:signData encoding:NSUTF8StringEncoding];////                //此处的verify建议送去商户后台做验签,如要放在手机端验,则代码必须支持更新证书//                if([self verify:sign]) {//                    //验签成功//                }//                else {//                    //验签失败//                }//            }////            //结果code为成功时,去商户后台查询一下确保交易是成功的再展示成功[[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYS" object:nil];}else if([code isEqualToString:@"fail"]) {//交易失败[[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYF" object:nil];}else if([code isEqualToString:@"cancel"]) {//交易取消[[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYC" object:nil];}}];}return YES;
}//9.0后的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{//银联支付处理支付结果if([url.host isEqualToString:@"uppayresult"]){[[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {if([code isEqualToString:@"success"]) {[[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYS" object:nil];}else if([code isEqualToString:@"fail"]) {//交易失败[[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYF" object:nil];}else if([code isEqualToString:@"cancel"]) {//交易取消[[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYC" object:nil];}}];}return YES;
}

8、根据后台返回数据发起支付

if (tn.length > 0) {//当获得的tn不为空时,调用支付接口[[UPPaymentControl defaultControl] startPay:tn fromScheme:@"UPPayDemo" mode:respCode viewController:self];}else{UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"银联参数配置不正确" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];[alert show];}

在发起支付的界面做银联回调的监听,并在监听返回支付成功(也就是payOk:方法中)时调用自己后台的接口再次确认是否真正支付成功

/* 银联支付回调监听 */[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payOk:) name:@"YINLIANPAYS" object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payCancel) name:@"YINLIANPAYC" object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payFail) name:@"YINLIANPAYF" object:nil];

9、官方集成文档写的不错,在你下载的demo里面

屏幕快照 2017-04-12 下午5.28.29.png

作者:orilme
链接:https://www.jianshu.com/p/92e47254e308

(转)iOS 集成支付宝、微信、银联支付 (2017)相关推荐

  1. Android支付宝,微信,银联支付支付的集成

    移动支付 用户使用移动的终端完成对所购买商品或者服务的支付功能;分为近场支付(蓝牙支付,刷卡,滴卡),和远程支付(网上支付,短信支付) app支付模块 常见的支付厂商-->常见的支付方式 支付宝 ...

  2. Android 支付宝 微信 银联 支付

    补充技术:现在很多支付平台,那么就需要有一个统一的平台进行支付的封装,那就是PING++有兴趣的朋友可以自己看一下. 一.支付难不难,不难,都是属于第三方的东西,难度不大. 二.支付是安全的,因为都是 ...

  3. android 支付宝 40247,iOS——集成支付宝 系统繁忙,请稍后再试ALI40247

    问题描述:在调用支付宝时,老是显示,系统繁忙,请稍后再试ALI40247. 解决方案: 一.如何签约APP支付接口 第一步:进入管理中心:https://openhome.alipay.com/pla ...

  4. Spring Boot集成支付宝电脑网站支付功能

    Spring Boot集成支付宝电脑网站支付功能 接入准备 登录 创建应用 添加能力 生成私钥与公钥 开发设置 沙箱环境 示例Demo的使用与学习 下载Demo 启动项目 参数配置 执行测试 Spri ...

  5. iOS 微信、支付宝、银联支付组件的进一步设计

    前言 有段时间没写技术文章了,一是因为工作太忙,再者因为本人文笔实在一般.最近终于闲下来,本着分享的目的将一些组件设计上的心得与大家分享. 本篇文章是基于原有一篇关于支付文章的进一步优化设计,所以在阅 ...

  6. 玩转iOS开发:集成 Union Pay - 银联支付

    文章转至:https://cainrun.github.io/14740149724404.html 作者感言 前面已经把WeChat SDK的支付, AliPay SDK搞得七七八八了, 接下来就是 ...

  7. java对接支付宝微信银联_JavaWEB后端支付银联,支付宝,微信对接

    JavaWEB后端支付银联,支付宝,微信对接 标签(空格分隔): java 项目概述 最近项目需要后端打通支付,所以对接部分做成了一个小模块. 先说下项目要求: 后端要对接银联无跳转Token支付,支 ...

  8. java对接支付宝微信银联_经典设计模式之策略模式【如何重构聚合支付平台,对接【支付宝,微信,银联支付】】(示例代码)...

    写在前面:设计模式源于生活,而又高于生活! 为什么要使用设计模式重构代码 使用设计模式可以重构整体架构代码.提高代码复用性.扩展性.减少代码冗余问题. Java高级工程师装逼的技能! 什么是策略模式 ...

  9. Android-移动支付 支付宝 微信 银联

    前言 这里开篇讲解一系列的Android相关的移动支付.移动支付也称为手机支付,用户使用移动的设备,完成对所购买商品或者服务的支付功能.包括远程支付(网上支付.短信支付),近场支付(刷卡.滴卡.pos ...

  10. js获取微信状态栏高度_人人商城打包app教程 方法 hbuilder打包支持支付宝微信原生支付...

    使用hbuilder打包人人商城app 方法支持微信支付宝原生支付 介绍 人人商城打包使用hbuilder打包app需要的文件,目前支持微信原生支付,支付宝原生支付,原生退出app ,还没有写分享和原 ...

最新文章

  1. 用模板来进行类型检查。
  2. win10系统svn服务器端安装步骤,win10系统安装svn服务器的解决步骤
  3. windows下CodeIgniter CLI Tool 指定host 和port无效问题
  4. Flutter全局悬浮按钮
  5. 最好用的日志分析工具ELK
  6. 七天来学习ASP.NET MVC (两)——ASP.NET MVC 数据传输
  7. 使用活动记录执行CRUD
  8. 热敏打印机原理java_java - 使用TSC TTP-342E Pro热敏打印机Java打印 - 堆栈内存溢出...
  9. 转)VCSA 6.5重启无法访问,报错“503 Service Unavailable”的解决方法
  10. ArcGISTiledMapServiceLayer does not support Multi-Layer Caches
  11. 添加元素:让图片变废为宝
  12. 省市区三级联动(拼接写法)
  13. 史上最完整的APP商城源码(含服务器)
  14. ap启动失败 ensp_eNSP模拟WLAN——上线华为真实AP的方法及配置
  15. 人民币大写金额转换为数字
  16. 微信编辑器的文章复制到公众号以后乱码怎么解决?
  17. 项目经理必备向上管理四步法
  18. HTML和CSS实现京东首页(附GitHub地址)
  19. 运维之DNS服务器Bind9配置解析和基础示例及附带命令
  20. 微信小程序顶部下拉菜单栏

热门文章

  1. 腾讯微博开放平台API SDK vb版源码发布
  2. 深入浅出SCSI子系统(六)SCSI 磁盘驱动
  3. 【大数据语言】怎样利用Python爬虫,高效获取大规模数据
  4. 移动MM收费:钱不是问题
  5. Eclipse使用教程(图文详解)+ 2020版eclipse配置tomcat + 配置JDK
  6. 完美解决SAMSUNG Mobile USB CDC Composite Device安装失败 三星手机USB驱动失败。
  7. 共享打印机服务器系统64位,win7系统64位和winXP 32位共享网络打印机的操作方法...
  8. WPF 入门教程 TextBox详解
  9. NetMeeting的使用
  10. 视频教程-WPS Office轻松办公(表格篇)-Office/WPS