博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS微信支付集成 SDK1 7 5
阅读量:6500 次
发布时间:2019-06-24

本文共 9087 字,大约阅读时间需要 30 分钟。

最近做了一个新项目,涉及到支付宝和微信支付,支付宝和微信都是业界的老大哥,相信大家都有所觉得文档、SDK都是各种坑吧(纯粹吐槽而已),这是继上篇支付宝支付集成后接着的微信支付集成。

1.微信商户申请步骤 2.申请成功后说明 官方支付账户说明文档: 账户参数说明:

官方业务流程文档: 3.微信支付集成 1> 添加微信支付SDK

2> 添加库

4.开发步骤说明 官方开发步骤文挡: 1> 项目设置APPID,在工程项目中添加商户自己的APPID

商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID

2> iOS 9.0以上的系统如果要正常调起微信,还需要添加白名单,在工程项目的plist文件中添加

3> 开发者需要在工程中链接上:SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework。

4> 在你的工程文件中选择Build Setting,在"Other Linker Flags"中加入**"-Objc -all_load"**,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h,文件所在位置

5> 注册APPID 商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:

// 在appDelegate.m中,注册微信应用    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    //向微信注册    [WXApi registerApp:@"您的APPID"];}复制代码

6> 调起支付 商户服务器生成支付订单,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码: 为了安全性,以下字段最好从服务器去获取

// 调起微信支付PayReq *request = [[PayReq alloc] init];/** 微信分配的公众账号ID -> APPID */request.partnerId = APPID;/** 预支付订单 从服务器获取 */request.prepayId = @"1101000000140415649af9fc314aa427";/** 商家根据财付通文档填写的数据和签名 
<暂填写固定值sign=wxpay>
*/request.package = @"Sign=WXPay";/** 随机串,防重发 */request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";/** 时间戳,防重发 */request.timeStamp= @“1397527777";/** 商家根据微信开放平台文档对数据做的签名, 可从服务器获取,也可本地生成*/request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";/* 调起支付 */[WXApi sendReq:request];复制代码

7> 支付结果回调 照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。 注意: 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。 代码示例如下:

// 支付返回结果,实际支付结果需要去微信服务器端查询-(void)onResp:(BaseResp *)resp {   if([resp isKindOfClass:[PayResp class]]){      switch (resp.errCode) {          case WXSuccess:{             NSlog(@"支付成功");            // 发通知带出支付成功结果                [[NSNotificationCenter defaultCenter] postNotificationName:QTXWXReturnSucceedPayNotification object:resp];          }            break;        default:{            NSlog(@“支付失败:%d”,resp.errCode);             // 发通知带出支付失败结果                [[NSNotificationCenter defaultCenter] postNotificationName:QTXWXReturnFailedPayNotification object:resp];        }          break;    }  }  }复制代码

具体使用先放一下我的部分代码:

  1. 一般微信支付和支付宝支付都会被一起集成,这边就要在appDelegate.m中一起整理判断回调
这里处理新浪微博SSO授权之后跳转回来,和微信/支付宝支付完成之后跳转回来 */- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{    BOOL result = [UMSocialSnsService handleOpenURL:url wxApiDelegate:nil];    if (result == NO) {  // 調用其他 SDK 支付寶                //如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK        if ([url.host isEqualToString:@"safepay"]) {            //跳转支付宝钱包进行支付,处理支付结果            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {                QTXLog(@"支付宝客户端支付结果result = %@",resultDic);                if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {                                        // 发通知带出支付成功结果                    [QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];                } else {                                        // 发通知带出支付失败结果                    [QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];                }                            }];        }                if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode            [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {                QTXLog(@"支付宝网页版result = %@",resultDic);                if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {                                        // 发通知带出支付成功结果                    [QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];                } else {                                        // 发通知带出支付失败结果                    [QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];                }            }];        }                //微信的支付回调        if ([url.host isEqualToString:@"pay"]) {            return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];        }    }    return result;}复制代码
// NOTE: 9.0以后使用新API接口- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary
*)options{ BOOL result = [UMSocialSnsService handleOpenURL:url]; if (result == NO) { // 調用其他 SDK 支付寶 //如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK if ([url.host isEqualToString:@"safepay"]) { //跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { QTXLog(@"支付宝客户端支付结果result = %@",resultDic); if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) { // 发通知带出支付成功结果 [QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic]; } else { // 发通知带出支付失败结果 [QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic]; } }]; } if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) { QTXLog(@"支付宝网页版result = %@",resultDic); if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) { // 发通知带出支付成功结果 [QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic]; } else { // 发通知带出支付失败结果 [QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic]; } }]; } //微信的支付回调 if ([url.host isEqualToString:@"pay"]) { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; } } return result;}- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];}复制代码
  1. 在使用微信支付的当前控制器里:
// 调起微信支付,接收通知,并且判断手机是否安装微信- (void)weChatPay {        // 1.拼接请求参数    NSMutableDictionary *params = [NSMutableDictionary dictionary];    params[@"orderid"] = self.order;    params[@"userIp"] = [QTXGetIPTool deviceIPAdress]; // 获取当前设备的ip        // 2.发送请求    __weak __typeof(self) weakSelf = self;    [QTXHttpTool post:QTX_weChatPay_url params:params success:^(id json) {        QTXLog(@"微信支付返回参数接口 请求成功-%@", json);                if ([json[@"success"] isEqual:@(YES)]) {                        NSMutableDictionary *wechatDic = json[@"data"];                      [WXApi registerApp:[wechatDic objectForKey:@"appid"]];            PayReq *request = [[PayReq alloc] init];            request.partnerId = [wechatDic objectForKey:@"mch_id"]; // 商家向财付通申请的商家id            request.prepayId= [wechatDic objectForKey:@"prepay_id"]; // 支付订单            request.package = @"Sign=WXPay"; // Sign=WXPay 商家根据财付通文档填写的数据和签名            request.nonceStr= [wechatDic objectForKey:@"nonce_str"]; // 随机串,防重发            request.timeStamp= [[wechatDic objectForKey:@"timestamp"] intValue]; //时间戳,防重发            request.sign= [wechatDic objectForKey:@"sign2"]; // 商家根据微信开放平台文档对数据做的签名 二次签名                        if ([WXApi sendReq:request]) {                                [QTXNotificationCenter addObserver:self selector:@selector(paySucceed) name:QTXWXReturnSucceedPayNotification object:nil];                [QTXNotificationCenter addObserver:self selector:@selector(payFailed) name:QTXWXReturnFailedPayNotification object:nil];            } else { // 未安装微信客户端相关处理                                QTXAlterView *alter = [[QTXAlterView alloc] initWithMessage:[NSString stringWithFormat:@"未安装微信客户端,请使用其他支付方式"] delegate:self rightButtonTitle:@"确定" otherButtonTitles:nil];                [alter show];            }                    } else {            [MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]];        }                [weakSelf.tableView reloadData];    } failure:^(NSError *error) {                [MBProgressHUD showError:@"暂无网络,稍后再试"];        QTXLog(@"微信支付返回参数接口 请求失败-%@", error);    }];}复制代码

目前微信支付SDK已经更新到1.7.5, 我这边也同步更新下. 其实在原有版本基础上,只需要增加以下三点:

  1. 更新支持iOS启用 ATS(App Transport Security)
  2. 需要在工程中链接CFNetwork.framework
  3. 在工程配置中的”Other Linker Flags”中加入”-Objc -all_load”

如果需要支付宝支付集成, 请移步:

转载地址:http://outyo.baihongyu.com/

你可能感兴趣的文章
三层架构
查看>>
Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习
查看>>
解决方案(.sln)文件
查看>>
理解cookie和session机制
查看>>
【Treap】bzoj1588-HNOI2002营业额统计
查看>>
第六周作业
查看>>
利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator
查看>>
指针和引用的区别
查看>>
转:strcat与strcpy与strcmp与strlen
查看>>
运行PHP出现No input file specified错误解决办法
查看>>
【重建】从FJOI2016一试谈起
查看>>
selenium之frame操作
查看>>
php 引入其他文件中的变量
查看>>
MYSQL体系结构-来自期刊
查看>>
mysql的基本知识
查看>>
exchange 2003配置ASSP 反垃圾邮件
查看>>
webpack入门(二)what is webpack
查看>>
UnitOfWork以及其在ABP中的应用
查看>>
学习C语言必须知道的理论知识(第一章)
查看>>
for语句内嵌例题与个人理解
查看>>