这是第二次集成微信支付,距上次微信支付搞定约莫快一年了,上次匆忙的把问题搞定了,这次呢,肯定不能简单的搞定问题就算了,必须来点干货的!
注释:亲测可用!
本篇说些什么呢?请看目录:
一.导入的类库 二.更改的文件 三.注意事项 四.微信支付流程解析 五.一点干货分享 |
一.导入的类库
1.导入微信支付SDK
直接把支付官方Demo中的SDKExport 导入自己的项目中即可
效果图如下:
微信支付第三方类库.png
2.导入的系统库:(根据官方Demo)
Security.framework CoreTelephony.framework SystemConfiguration.framework libz.dylib libsqlite3.0.dylib UIKit.framework Foundation.framework // 微信官方的库 libWeChatSDK.a |
二.更改的文件
1.AppDelegate中
头文件和代理:
导入 #import "WXApi.h" 遵循 <WXApiDelegate> |
Code处理方面:
在didFinishLaunchingWithOptions 方法中导入并调用以下的方法使应用程序一开始启动的时候就远程告诉微信支付等
#pragma mark - 初始化微信支付 - (void)initWpay { [WXApi registerApp:@"您的AppId" withDescription:@"标示字符串"]; } |
导入以下方法的实现:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; } |
2.要支付的文件中
导入
#import "WXApi.h" #import "WXApiObject.h" 遵循 <WXApiDelegate> |
Code处理方面:
当把您的请求发送出去了之后,您的服务器会给您返回下单成功后的参数如下为params ,这里面至少要有6个对应的key值,如下才可以包装成我们的PayReq 参数,
// 判断自己的服务器的产生的订单参数返回是否正确,并返回包装好的参数 -(PayReq *)isWpayParamsIsCorrect:(NSDictionary *)params { if ([params allKeys].count >=6) { PayReq *req =[[PayReq alloc]init]; req.openID =@"您的AppId"; req.partnerId =params[@"partnerid"]; req.prepayId =params[@"prepayid"]; req.nonceStr =params[@"noncestr"]; req.timeStamp =[params[@"timestamp"] intValue]; req.package =params[@"package"]; req.sign =params[@"sign"]; return req; } return nil; } |
然后通过sendReq发送支付请求,等待跳转微信App完成支付,返回onResp方法中处理:
// 服务器返回正确的业务逻辑处理 // 1.判断自己的服务器的产生的订单参数返回是否正确 PayReq *payReq =[ws isWpayParamsIsCorrect:infoDic]; if (!payReq) { return ; } // 2.临时记录发送的参数 ws.paramsModel =model; // [DisplayHelper displaySuccessAlert:@"请求微信支付订单成功!"]; if (![WXApi isWXAppInstalled]) { [DisplayHelper displayWarningAlert:@"您还没有安装微信哦,无法支付!"]; return ; } // 3.调用微信API,payReq对应的参数 [WXApi sendReq:payReq]; |
在完成支付的onResp方法中如果支付成功了,就去请求我们的服务器确定确实成功了之后就展示自己的成功逻辑界面
-(void) onResp:(BaseResp*)resp { if([resp isKindOfClass:[PayResp class]]){ //支付返回结果,实际支付结果需要去微信服务器端查询 switch (code) { case WXSuccess: // 1. 包装对应查询参数 // 2. 发送查询的是否成功的请求 break; default: break; } } } |
附上支付返回的状态码提示:
enum WXErrCode { WXSuccess = 0, /**< 成功 */ WXErrCodeCommon = -1, /**< 普通错误类型 */ WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */ WXErrCodeSentFail = -3, /**< 发送失败 */ WXErrCodeAuthDeny = -4, /**< 授权失败 */ WXErrCodeUnsupport = -5, /**< 微信不支持 */ }; |
三.注意事项
1.urlschemes 的设置,注意在如下的地方设置微信支付完成后的回到应用程序中,注意:不设置的话就无法返回我的应用
微信支付完成后回应用程序标示.png
2.微信app的白名单加入(自己踩的就是这里的坑)
(shareSDK的集成分享)
众所周知的,iOS9之后要加白名单如下:(在info.plist 中加入)
<key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> <string>mqq</string> <string>mqqapi</string> <string>mqqOpensdkSSoLogin</string> <string>mqqconnect</string> <string>mqqopensdkdataline</string> <string>mqqopensdkgrouptribeshare</string> <string>mqqopensdkfriend</string> <string>mqqopensdkapi</string> <string>mqqopensdkapiV2</string> <string>mqqopensdkapiV3</string> <string>mqzoneopensdk</string> <string>wtloginmqq</string> <string>wtloginmqq2</string> <string>mqqwpa</string> <string>mqzone</string> <string>mqzonev2</string> <string>mqzoneshare</string> <string>wtloginqzone</string> <string>mqzonewx</string> <string>mqzoneopensdkapiV2</string> <string>mqzoneopensdkapi19</string> <string>mqzoneopensdkapi</string> <string>mqqbrowser</string> <string>mttbrowser</string> </array> |
而这次没集成分享功能,所以没有把上面weixin这个value加入进去,造成无法调启微信客户端完成支付的尴尬局面,吸取了教训,切记!
3.微信支付成功后,回调到onResp方法的时候时,一定要记得去自己的商户后台查询是否真正支付成功,而不是直接展示成功,切记!
四.微信支付流程解析
1.下单过程
商户App发送下单的信息 --->商户后台发送给 --->微信后台返回订单 --->商户后台返回订单 --->商户App
2.支付过程
商户App发送sendReq方法--->微信App发起支付请求--->微信后台授权支付--->微信App输入密码完成支付
3.支付完成之后
微信后台异步通知--->商户后台
微信App发送支付成功信息--->商户App去查询是否真正支付成功--->商户后台(如果此时未收到微信后台异步通知商户后台则会调用查询API--->微信后台返回支付结果--->商户后台)否则,直接根据微信后台异步通知商户支付成功与否给--->商户App确认
附上:
微信官方支付流程图.png
五.一点干货分享
我的Demo支付功能展示说明.png
拖拽左侧的4个类库到您的文件中,只有微信支付的话,就屏蔽到如上图的支付宝支付代码,以及屏蔽下面导入的2个头文件:
#import "RSADataSigner.h" #import <AlipaySDK/AlipaySDK.h> |
2.我的微信支付的使用办法:
注意:这里支付流程中所发送的支付网络请求是从开始购买,也就是下单前的处理,具体的如上的sendReq:和onResp:方法在我已经封装好的类中,可以直接使用的!
拖拽我上面说的微信支付的4个文件夹到您的工程中,之后屏蔽到支付宝支付的有关代码和类库等;
再按照上面的步骤分别把不同的系统类库导入您的项目中;
集成完毕了之后,怎么用呢,请看下面:
直接在您要支付的类里面,
导入 #import "CMWechatPayManager.h" #import "WXApiObject.h" #import "CMWpaySearchResultDelegate.h" 遵循 CMWpaySearchResultDelegate |
(我的空项目的使用,有关于CMHttpRequestModel的类库的介绍等)
NSMutableDictionary *dic =[NSMutableDictionary dictionary]; [dic setValue:@"123"forKey:@"userid"]; // 充值直接调微信充值 CMHttpRequestModel *model =[[CMHttpRequestModel alloc]init]; model.appendUrl = kSendTask_GetWechatPayParams; model.paramDic =dic; model.callback = ^(CMHttpResponseModel * result, NSError *error) { if (result.state ==CMReponseCodeState_Success) { }else { [CMHttpStateTools showHtttpStateView:result.state]; } }; [[CMWechatPayManager sharedWpayManager] sendWeChatRequestParam:model]; |
导入以下代理的方法,做自己的成功后的业务处理逻辑
#pragma mark - CMWpaySearchResultDelegate -(void)Wpay:(CMWechatPayManager *)manager andPayResult:(int)code { switch (code) { case WXSuccess: // 1. 包装对应查询参数 // 2. 发送查询的是否成功的请求 break; default: break; } } |
相关文章: