做APP支付已经做了两三次了,每次都要花点时间去调试回调,很浪费时间,所以这次总结了一下我们需要在AppDelegate中做的事情。本文已经总结并解析了常用的错误码errorCode:

首先,遵守微信协议<WXApiDelegate>。

其次,需要注意的就是版本适配问题了,这个地方贴出两个版本适配的常用代码(宏定义/预编译宏),大家自行去了解相关用法:

/*不是我不说怎么用,因为我也搞不清楚怎么用才是准确的,里面有许多坑,还有其他适配方法,比如 if (@available (iOS 10.0, *)) { //这里执行iOS10.0以上的代码片段}。__IPHONE_OS_VERSION_MAX_ALLOWED 允许最高的系统版本__IPHONE_OS_VERSION_MIN_REQUIRED 要求最低的系统版本*/

1.直接贴代码了,分别实现两个方法(系统版本适配),注意方法内部的代码是一样的!

#pragma mark - 微信、支付宝支付配置//iOS 2.0-9.0//- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{//    return YES;//}//iOS 4.2-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);[self alipayResult: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?:@"");}];}else if ([url.host isEqualToString:@"pay"]){//② 微信支付回调[WXApi handleOpenURL:url delegate:self];}return YES;}//iOS 9.0以后- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{  //这里的代码直接拷贝上面的,iOS9.0以上的版本会走这里。}

2.实现微信回调代理

#pragma mark -- WXApiDelegate 实现微信回调代理- (void)onResp:(BaseResp *)resp{//判断是否是微信支付回调 (注意是PayResp 而不是PayReq)if ([resp isKindOfClass:[PayResp class]]){//支付返回的结果, 实际支付结果需要去微信服务器端查询switch (resp.errCode) {case WXSuccess:[self sendNotificationToSkipPayResult];break;default:[self onPayFail:resp.errCode];break;}}}    

3.自己封装的方法,解析回调信息

#pragma mark -- 微信支付失败结果解析- (void)onPayFail:(int)errCode {NSString *message = nil;if (errCode == WXErrCodeCommon) {message = @"支付失败";} else if (errCode == WXErrCodeUserCancel) {message = @"用户取消支付";} else if (errCode == WXErrCodeSentFail) {message = @"支付失败";} else if (errCode == WXErrCodeAuthDeny) {message = @"授权失败";} else if (errCode == WXErrCodeUnsupport) {message = @"未知错误";} else {message = @"未知错误";}if (!kIsEmptyString(message)) {//支付失败后的回调[self sendNotificationToPayFail:message];}}#pragma mark -- 支付宝支付结果处理- (void)alipayResult:(id)result{NSDictionary * dic = (NSDictionary *)result;NSString * errorCode = [dic objectForKey:@"resultStatus"];NSString * resultStr = [dic objectForKey:@"result"];NSString *message;BOOL isPaySuccess = NO;/*在支付过程结束后,会通过 callbackBlock 同步返回支付结果。返回结果需要通过 resultStatus 以及 result 字段的值来综合判断并确定支付结果。 在 resultStatus=9000,并且 success="true"以及 sign="xxx"校验通过的情况下,证明支付成功。其它情况归为失败。较低安全级别的场合,也可以只通过检查 resultStatus 以及 success="true"来判定支付结果。*/if ([@"9000" isEqualToString:errorCode]) {NSString * success;if (resultStr) {NSArray *array = [resultStr componentsSeparatedByString:@"&"];if (array && [array count]>0) {for (int i=0; i<[array count]; i++) {NSString * subStr = [array objectAtIndex:i];if ([subStr rangeOfString:@"success=\""].location != NSNotFound) {NSArray *signArr = [subStr componentsSeparatedByString:@"="];success = [signArr objectAtIndex:1];break;}}}}if ([@"\"true\"" isEqualToString:success]) {message = @"支付成功!";isPaySuccess = YES;}else{message = @"未知错误";}}else if ([@"8000" isEqualToString:errorCode]) {message = @"正在处理中";}else if ([@"4000" isEqualToString:errorCode]) {message = @"支付失败";}else if ([@"6001" isEqualToString:errorCode]) {message = @"用户取消支付";}else if ([@"6002" isEqualToString:errorCode]) {message = @"网络连接失败,请稍后重试!";}else{message = @"未知错误";}if (isPaySuccess) {[self sendNotificationToSkipPayResult];}else {if (!kIsEmptyString(message)) {//支付失败后的回调[self sendNotificationToPayFail:message];}}}

4.通知支付页面

#pragma mark -- 支付成功后通知 (微信、支付宝 支付成功通知支付页面处理跳转)- (void)sendNotificationToSkipPayResult {//   [ [NSNotificationCenter defaultCenter] postNotificationName:@"通知名字" object":nil];}#pragma mark -- 支付失败后通知  (微信、支付宝 支付失败通知支付页面处理提示信息)//参数:failReason:失败原因- (void)sendNotificationToPayFail:(NSString *)failReason{NSLog(@"%@",failReason);//  [ [NSNotificationCenter defaultCenter] postNotificationName:@"通知名字" object":failReason];}

本文没有调起支付等其它集成步骤的教程,只是处理了回调。所以有其它无法解决的问题可以留言,收到通知我会及时回复。还有上文的代码也有可能有些错误或者需要完善的,欢迎提出来。

最好在简书回复:本文简书地址。

微信支付、支付宝支付回调处理总结相关推荐

  1. 微信和支付宝支付模式详解及实现(.Net标准库)

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  2. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列

    2019独角兽企业重金招聘Python工程师标准>>> 支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至 ...

  3. 微信,支付宝支付,微信公众号小程序授权等

    微信,支付宝支付,微信公众号小程序授权等 前言 微信支付 微信授权 maven依赖(更新) 前言 最近在公司也做了很多移动端项目,如今微信公众号,小程序又特别火爆,免不了要接触支付,授权这类的业务需求 ...

  4. 微信和支付宝支付实战

    最近的项目中要用到移动支付.在此总结下 1.微信支付 :因为需求是扫码支付即时到账,用的是native方式.按照官方文档的说法,调用"https://api.mch.weixin.qq.co ...

  5. Android Study 之 6分钟妥妥集成微信以及支付宝支付

    LZ-Says:来说俩件事儿: 1.一心只为一人用,一言只为一人说~ 2.今天坐公交,末班车,车上只有司机和我,阴森森的,吓死LZ了...一路小跑!!! 前言 (浪费一分钟) 今天,不讲这个,也不讲那 ...

  6. Android项目内简单集成微信和支付宝支付功能

    最近自己公司的项目需要集成微信和支付宝支付,我是个初学者,然后就开始在网上各种搜索相关Demo.最后找了一个自我感觉还不错的Demo,挺适合初学者使用的.在使用之前一定要在微信平台和蚂蚁金服申请权限, ...

  7. H5页面中调用微信和支付宝支付

    最近在工作中,有个H5页面需要实现微信支付和支付宝支付的功能,现在已经完成,抽个时间写出来,分享给有需要的人. 第一步:先判断当前环境 判断用户所属环境,根据环境不同,执行不同的支付程序. if (/ ...

  8. 关于银联、微信、支付宝支付的相关信息

    一. 银联支付 本地没有其他的环境配置,只需要在支付时从服务器获取交易流水号(TN),然后调取支付控件,支付完成之后会通知商户后台以及客户端,,相关demo和SDK见官网.银联支付. 二. 微信支付 ...

  9. Android 微信支付支付宝支付

    由于项目需求,加入这2个功能记录一些需要注意的地方 一.微信支付 微信支付在2016年4月份左右稍微调整了一下支付过程,但是文档却没怎么更新,这也是百度上为什么那么多开发者都说微信是个大坑. 身为一个 ...

  10. 微擎支付返回商户单号_微信、支付宝支付动态库PayApiFun.dll说明

    微信.支付宝支付动态库PayApiFun.dll说明 PayApiFun.dll这个动态库中包含了:微信付款码支付.生成微信支付二维码扫码支付.按商户单号查询微信支付状态.关闭未支付的微信订单.支付宝 ...

最新文章

  1. O(N) 求 1~N 逆元 模板及证明
  2. java 设置panel背景图片_jpanel设置背景图片的二个小例子
  3. 有序链表插入 java_Java 实现有序链表
  4. Cloud for Customer里权限控制Business Role和Access context的截图
  5. tcp java实例_实现了基于TCP的Java Socket编程实例代码
  6. lambda ::_您无法从这里到达那里:Netlify Lambda和Firebase如何使我陷入无服务器的死胡同
  7. Python基础__Python序列基本类型及其操作(1)
  8. 如何删除所有已合并的Git分支?
  9. padding和卷积的区别_NiN:使用11卷积层替代全连接层
  10. 模拟 Vue 手写一个 MVVM
  11. 修改input file 文件上传的样式
  12. win10命令提示符cd 不到指定路径的解决
  13. linux下chm文件制作,自己动手将在线文档制作成CHM文件
  14. 专升本-计算机公共课考点(5)——演示文稿软件 PowerPoint 2010
  15. 5分钟了解什么是OpenXR
  16. 2012总结之pcode.Class
  17. hypermesh闪退启动解决(最全!!!)
  18. Unity如何调整天空盒子
  19. 仿鱼爪新媒账号过户转让平台源码/友价内核账号交易源码
  20. 收银管理系统给商超带来哪些便利?

热门文章

  1. 如何在远程桌面中使用 USB 设备:网银U盾、手绘板、打印机等
  2. 学位论文参考文献书写格式
  3. AI技术用于测试领域预研阶段
  4. 计算机培训个人研修总结报告,课件制作培训心得体会范文4篇
  5. android 矢量粒子动画,iOS CAEmitterLayer实现粒子发射动画效果
  6. 傻傻分不清楚:裸纤、专线、SDH、MSTP、MSTP+、OTN、PTN、IP-RAN!
  7. 提取光猫_下挂设备_路由器性能
  8. dds提取工具_游戏资源提取器(game extractor)
  9. SqlServer查询重复数据
  10. java8新特性-Stream入门学习