最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面

俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章,你也只要几分钟,

就能轻松接入支付宝,在别人投来崇拜的眼光的同时,你就能潇洒的回一句,略懂略懂。。。。。。

先给大家我写的微信支付,很详细哦,喜欢的点个赞点击打开微信支付链接

前期准备

首先商户要去支付宝申请,得到一个parnter和seller,然后在电脑上生成一组RSA,公钥给支付宝,私钥自己流程,具

体流程我不BB了,自己看点击打开链接,主要这些东西我们App也不需要怎么管理,大家随意看看知道下

1.seller ID 商户唯一ID标识符

2.parnter ID 合作身份ID,以2088开头的16位纯数字

3.加密用到的文件(私钥自己做,支付宝公钥)

下载SDK

这里SDK的文档只有最近一次更新的,没记错的话2016年Alipay有一次重大的改动,我这有一份很全的更新文档,朋

友给我的,需要注意的在最后给大家分析,这里只需要先下载下来,看看里面的代码,然后把需要的东西准备下,继

续往下分析,其实还有一个用处,就是把你生成的密钥和seller和parnter给填进去,跑一下,看能不能拉起来,但是

正常情况下是不需要这么搞得,后台处理的,项目的时候也不需要我们App做的,所以还是往下看

手动接入SDK

为什么手动呢,因为不支持cocoapods,又不是第三方的,这种还是自己接入安全点。

步骤1

先把这两个框架拖进来

步骤2

把四个箭头的文件拖进去,记得文件夹拖进去是选择Create Group,其实这四个文件是为了签名在客户端签名而存在

的,实际项目中,我们是要把私钥保存在自己的服务器,然后服务器进行支付订单参数的签名,返回给客户端,我还

是放到自己项目中了,毕竟其他地方也要用到,要是在服务器签名order文件就不要拉进来了

步骤3

配置prefix header

如果原本项目中的根目录中有以下prefix文件,例如

则在其中引入 #import,#import

如果不存在,那么直接把支付宝Demo里面的prefix文件拖到自己项目的根目录下,最好改下文件名,然后配置路径

(在Build Settings 中搜索 Prefix Header),添加路径 (可以直接拖拽)

步骤4

然后根据下图添加库文件

貌似这两个也要加上,那就加进去吧

步骤5

如果是自己Demo本地签名,不是服务器签名,那么再设置下openssl的路径

在header search paths 中添加 openssl 的路径$(SRCROOT)/XXX

$(SRCROOT)就是本工程的文件夹

网上找了个相对路径和绝对路径的文章点击打开链接

步骤6

配置URL Scheme,主要就是回调的时候能拉起App,这里的Scheme千万不能乱用,也别重复了,不然怎么都拉

不起来了,我就遇到过一次,和微信拉起App重复了,导致很尴尬,咱们保持唯一就好了,也就是给咱们自己的项目

增加个标识符,能够让支付宝回调拉起来

步骤7

这里就是根据上面的配置,在本地进行签名,拉起支付宝,需要的朋友直接下载Demo看吧,没什么好讲的,因为支

付宝都强调了不要在本地玩,不过你想玩,那就玩吧,后果自负

来来来,组装完毕,正式项目接入流程点火起飞

如果起飞有问题,可能我上面漏了什么,记得留言给我哦(写代码记得包头文件)

第一步

传订单号给自己的服务器签名,再提一次,千万别再本地写,你和后台定好规则,传需要的订单字符串给他,他把签

名之后的字符串给你

// 订单的“,”分割字符串支付宝只是传签名,不需要再次校验,微信成功之后没有返回值,所以微信支付需要保存到沙盒

@property(nonatomic,strong)NSString*orderStr;

关键代码,拉取服务器的签名参数,然后传给支付宝拉起支付 (这里的block处理的是没有支付宝的时候走H5收银台的回调)

- (IBAction)payMoney:(UIButton *)sender

{

// 配置好的回调scheme

NSString *appScheme = @"上面配置好的";

// 订单拿去给服务器签名

[[TWTShoppingCartLogic sharedData] goToSignOrder:@"订单字符串" way:@"1" complete:^(NSError *error, id data) {

if (error)

{

DSToast *toast = [[DSToast alloc] initWithText:@"连接服务器失败,请稍后再试" color:RGBA(255, 174, 1, 1)];

[toast show];

}

else

{

// 拉起支付宝,2016年5月之后更新是H5回调到这里

[[AlipaySDK defaultService] payOrder:data fromScheme:appScheme callback:^(NSDictionary *resultDic) {

DDLogVerbose(@"点击支付获取的直接结果===>>>>>>reslut = %@",resultDic);

// NSString *memo = resultDic[@"memo"];

NSString *result = resultDic[@"result"];

DDLogVerbose(@"%@",result);

NSString *resultStatus = resultDic[@"resultStatus"];

//9000订单支付成功 正常流程会进入这里 如果中断了就去外面delegate那里的Block

if ([resultStatus isEqualToString:@"9000"])

{

// "out_trade_no" = "\"74db120f0a8e5646ef5a30154e9f6deb\"";

NSString *outNum = nil;

NSMutableString *outTradeNum = [[NSMutableString alloc] init];

NSArray *strArr = [result componentsSeparatedByString:@"&"];

for (NSString *trade in strArr) {

if ([trade hasPrefix:@"out_trade_no"])

{

outNum = [trade componentsSeparatedByString:@"="][1];

[outTradeNum appendString:outNum];

[outTradeNum replaceOccurrencesOfString:@"\"" withString:@"" options:NSLiteralSearch range:NSMakeRange(0, outTradeNum.length)];

DDLogVerbose(@"%@",outTradeNum);

break;

}

}

// 第一个参数传的是alipay返回给我的out_trade_id 异步回调二次验证

[[TWTShoppingCartLogic sharedData] goToCheckOrder:outTradeNum complete:^(NSError *error, id data) {

if (error)

{

[TWTAlertView showAlertViewWithTitle:nil message:@"网络数据异常,请稍后刷新" cancelOnTouch:NO cancelButtonTitle:nil doneButtonTitle:@"确定" doneBlock:^(void){

[self.navigationController popViewControllerAnimated:YES];

}];

// 匹配不到就上报异常

}

else

{

[[TWTCommonAPILogic sharedData]reportData:nil forEventKey:@"PaySucceedVC_CallBack" number:@(1)];

DSToast *toast = [[DSToast alloc] initWithText:@"支付成功" color:nil];

[toast show];

}

}];

}

else

{

//8000正在处理中 4000订单支付失败 6001用户中途取消/重复操作取消 6002网络连接出错 ---> 从H回来

// 弹出失败的界面,弹出之后的话就不支付界面消失,方便重新支付

}

}];

}

}];

}

注意啦!!!

注意啦!!!

注意啦!!!

介绍下支付宝对我来说影响最大的一次

首先看看官方的调用接口,根据图来讲,我们就说方法1和方法2了,各位懵逼的就看图指示

再来看看2016年5月份更新的文档

IOS版本号:v15.1.0

修改时间:2016-4-28

更新点:

1. 增加获取trade_token接口(收单收银分离参数,与现有业务支付不冲突);

2. 支付结果返回统一,便于用户接入。

原有方案:payOrder:fromScheme:callback接口,业务传入callback1,用于支付结果返回;

processOrderWithPaymentReulst:standbyCallback接口,业务传入callback2,用于支付结果返回;

一般一次支付中(跳支付宝客户端支付),都会涉及到这两个接口;原有的规则是callback1存在,则统一调用callback1返回支付结果给业务方,若callback1不存在(app被杀掉的情况),则调用callback2返回支付结果给业务方。

现有方案:payOrder:fromScheme:callback接口,业务会传入CompletionBlock1(本地没有安装支付宝客户端的情况下(走H5收银台),会通过该CompletionBlock1反馈结果);

processOrderWithPaymentResult:standByCallback接口,业务会传入CompletionBlock2(本地安装了支付宝客户端的情况下,会通过该CompletionBlock2反馈结果)。

个人分析:

改版之前

看了这两次的介绍和图,简单来说就是原本方法1和方法2实现的情况下,方法1存在的情况下,结果返回给方法1的

block,方法1不存在,那么久回调到方法2的回调

唯一存在的用户操作就是,当你支付拉起支付宝的时候,你的商户App自杀了或者你手贱把他退出了,那么,你的方

法1自然就没了,你就需要方法2来进行回调结果的通知

改版之后

我感觉更正常了点了,但是咱们得改改代码逻辑啊,方法1和方法2都实现了,方法1只负责当没有支付宝客户端的时

候,走H5收银台,进行支付,结果处理回调,方法2就处理有客户端的情况下的回调,这里亲自测试,当拉起支付宝

的时候,你手贱退出了,也是回调到方法2的block里面进行结果反馈

我已经更新SDK到最新了,而且我这里介绍的也是最新,就是改版之后的方法,老的不介绍了,理论上都要用最新的

嘛,如果你用旧的,那我也没办法

第二步

处理支付结果(有支付宝的情况下回调该方法)

// 当用户通过其它应用启动本应用时,会回调这个方法,url参数是其它应用调用openURL:方法时传过来的

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

if ([url.host isEqualToString:@"safepay"]) {

//跳转支付宝钱包进行支付,处理支付结果,该方法是当去支付的时候我的进程被杀死的时候调用这里的回调,不然就调用payorder的回调

[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic)

{

DDLogVerbose(@"点击支付获取的直接结果===>>>>>>reslut = %@",resultDic);

NSString *result = resultDic[@"result"];

NSString *resultStatus = resultDic[@"resultStatus"];

//9000订单支付成功

// 支付完成需要把返回的outtradeID给解析出来,给服务器二次确认

if ([resultStatus isEqualToString:@"9000"])

{

// "out_trade_no" = "\"74db120f0a8e5646ef5a30154e9f6deb\"";

NSString *outNum = nil;

NSMutableString *outTradeNum = [[NSMutableString alloc] init];

NSArray *strArr = [result componentsSeparatedByString:@"&"];

for (NSString *trade in strArr) {

if ([trade hasPrefix:@"out_trade_no"])

{

outNum = [trade componentsSeparatedByString:@"="][1];

[outTradeNum appendString:outNum];

[outTradeNum replaceOccurrencesOfString:@"\"" withString:@"" options:NSLiteralSearch range:NSMakeRange(0, outTradeNum.length)];

break;

}

}

order.aliPayTrade = outTradeNum;

// 第一个参数传的是alipay返回给我的out_trade_id 二次确认

[[TWTShoppingCartLogic sharedData] goToCheckOrder:outTradeNum complete:^(NSError *error, id data) {

if (error)

{

[TWTAlertView showAlertViewWithTitle:nil message:@"网络数据异常,请稍后刷新" cancelOnTouch:NO cancelButtonTitle:nil doneButtonTitle:@"确定" doneBlock:^(void){

}];

// 匹配不到就上报异常

}

else

{

[[TWTCommonAPILogic sharedData]reportData:nil forEventKey:@"PaySucceedVC_CallBack" number:@(1)];

DSToast *toast = [[DSToast alloc] initWithText:@"支付成功" color:nil];

[toast show];

}];

}

else

{

//8000正在处理中 4000订单支付失败 6001用户中途取消/重复操作取消 6002网络连接出错

}

}];

}

return YES;

}

这里有个iOS 9的API,反正没什么卵用

// NOTE: 9.0以后使用新API接口

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options

{

第三步(小细节)

和微信支付一样,我们不能直接用同步返回的结果来判断是否正真支付成功(也是我写的微信支付详解链接)

按照官方的说法请看如下

好在支付宝和微信支付不同的地方在于,支付宝的返回数据中有带订单信息,我们就直接解析可以了,不需要像微信

一样只返回状态码,我们需要本地存起来,再和服务器二次校验

几个小小的坑

Cannot find interfacedeclarationfor'NSObject', superclass of'Base64'

这个问题按照步骤三里面的介绍配置下pch文件就好了,在base64.h中包含缺少的头文件就搞定了

‘rsa.h’ file not found

这个问题就是步骤五提到的了,如图解决

其实,你只要按我的步骤来,交给服务器签名,做我们App该做的事,基本就没有什么问题

总结一下

1.导入Demo中框架,相关库,配置pch文件以及openssl文件路径

2.配置URL Scheme

3.把签名交给服务器

4.注意改版前后的回调机制,最好保持最新的,最新的逻辑更清晰

5.和微信一样,同步返回的结果记得二次确认,和后台约定好解析字段

官方Demo:点击打开链接

微信支付接入分析:点击打开链接

h5支付不能打开支付宝 ios_iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析...相关推荐

  1. iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析

    最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章,你也只要几分钟, ...

  2. h5支付不能打开支付宝 ios_iOS实现H5支付(微信、支付宝)原生封装

    前言 支付分APP支付.H5支付.扫码支付等.app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页.如果你的APP不想集成支付SDK,又想实现支付功能,你可以在项目中使用H5 ...

  3. uniapp接入支付宝支付详细申请流程2021.6.1

    关于接入支付宝这块的内容,网上找了一些总感觉不是已经过时了就是还存在很多问题,介绍的并不详细,所以打算自己写一下详细接入流程.仅介绍申请应用接入流程,不涉及后台sdk接口内容. 首先uniapp的支付 ...

  4. 广州医保个账支付接口开发 微信医保支付

    一.背景说明 微信医保支付是由微信与各地人社局联合推出的"线上医保移动支付"的结算方式.对用户而言,在人社局指定的医院就医后,可以直接通过微信进行医保支付结算,无需线下窗口排队:对 ...

  5. h5支付不能打开支付宝 ios_IOS H5支付调起微信支付宝客户端问题总结

    IOS H5支付调起微信支付宝客户端问题总结 很早之前公司的支付功能,通过H5去支付宝和微信支付,开始使用的是UIwebView来加载h5页面,当初只有支付宝网页支付形式,所以没有考虑到那么多,现在新 ...

  6. h5支付不能打开支付宝 ios_iOS 解决微信h5支付,支付宝h5支付无法直接返回APP的问题...

    由于公司的业务需要,为了节省申请开通微信支付的时间和人力,公司决定使用微信h5支付.这样即节省了时间,同时以后所有的APP都能使用h5支付,既方便又快捷. 但是真正做的时候问题来了,当你支付成功之后或 ...

  7. h5支付不能打开支付宝 ios_IOS WKWebView H5支付打开支付宝/微信客户端

    近期公司项目中的App使用WKWebView封装作为一个壳,加载web的网页,其中的支付使用的是H5支付,在APP中需要调起微信和支付客户端进行支付,过程中遇到了一些问题,好在通过查找资料找到了以下解 ...

  8. html5 移动微信支付,H5唤起移动支付方法(支付宝、微信支付、银联支付) · Yumiko’s Blog...

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近开发的项目中涉及到了移动支付的模块,主要是支付宝.微信支付和银联支付. 下面总结一下H5唤起这些移动支付平台的方法. ...

  9. 微信小程序微信公众号支付宝小程序H5(获取信息用户信息,支付,分享,人脸识别)

    文章目录 一.微信小程序 1. 获取信息用户信息 2.支付 3.分享 4. 腾讯云小程序人脸核身 二.微信公众号 1.获取信息用户信息 2.支付 3. 分享(普通分享) 4.分享(vue单页面 配置分 ...

最新文章

  1. linux进程和程序的却别,操作系统:进程的概念和与程序的区别
  2. 金融科技公司采用大数据领先银行的三种方式
  3. mac mysql log_mac如何开启mysql bin-log
  4. 【渝粤教育】国家开放大学2018年春季 7397-21T家庭教育咨询与辅导 参考试题
  5. ElasticSearch面试 - es 写入数据的工作原理是什么啊?
  6. 黑马程序员——GUI篇
  7. java输入a控制台打印1_Java—— 流(Stream)、文件(File)和IO
  8. Go语言:数组练习—从一个整数数组中获取最大整数,最小整数,总数以及平均值
  9. 快速了解java语言
  10. poj3263 Tallest Cow 题解报告
  11. 无人机飞控系统硬件设计
  12. 2048游戏规则及玩法技巧攻略
  13. windows下qt程序报错“the inferior stopped because it triggered an exception”
  14. 2021了,为什么说音视频技术是技术风口?Android音视频开发这么吃香
  15. Python sorted Pandas sort_values 中文拼音排序
  16. Taichi 加速 Python 中图像处理
  17. 数据恢复软件在苹果电脑上的应用
  18. iOS 火星坐标系 与 地球坐标系
  19. JavaWeb JavaBean,MVC三层架构
  20. 大数据显示,社交电商已经是美国主流?

热门文章

  1. 看图要仔细-设计74HC165的原理图库文件-PCB系列教程2-2
  2. Python批量M4A文件转MP3录音文件
  3. 如何在Windows搭建WebDAV服务,并公网可访问
  4. 大数据Hadoop之——新一代流式数据湖平台 Apache Hudi
  5. 基于N-gram模型的中文文本纠错研究
  6. 易基因:表观遗传研究的临床和转化医学应用|学科前沿
  7. Android逆向工程工具Dare的使用方法(Mac OS X中)
  8. 国内动态ip 通过派克斯来支持宽带拨号实现换ip的目的
  9. 济南2021年高考马平烁 成绩 查询,济南18岁女孩高考裸分达704分 从不上辅导班
  10. [KungFu8位 MCU]ADC采集电路中的串联分压