微信支付iOS集成与二次封装
2017-06-07 本文已影响589人
reyzhang
最近在进行的项目,需要集成第三方支付。业务需要集成支付宝,微信,银联,Paypal等支付方式。在使用各家sdk时会发现有些第三方sdk调用时不够方便,简单。所以就有了进行再次封装的想法。
已经发布过关于支付宝支付的二次封装,如果对文章感兴趣,可以移步到支付宝iOS集成与二次封装 查阅。
官方下载与集成相关文档
下载地址 :Demo及SDK下载
集成文档: iOS接入指南
业务流程:官方流程文档
怎么集成看官方文档就可以了,本文重点在二次封装上
二次封装
相比支付宝sdk,微信支付使用起来更简单些,要了解微信的支付业务流程,可参考上面的文档。
微信支付需要服务端根据订单信息,返回一个预支付数据PrepayData,客户端拿到这个预支付数据后,调用微信支付sdk完成支付。封装后的代码如下:
创建一个微信支付的服务类WXPayService
// Created by reyzhang on 2017/4/10.
// Copyright © 2017年 hhkx All rights reserved.
// 微信支付服务封装
#import <Foundation/Foundation.h>
#import "WXApi.h"
@interface WXPayService : NSObject <WXApiDelegate>
///单例来接收微信请求的回调
+ (instancetype)sharedInstance;
// -- 根据接口返回的预支付信息,构造支付请求
+ (PayReq *)getPayRequest:(NSDictionary *)prepayData;
///处理非支付请求的回调
- (void)onRespCallBack:(void(^)(BaseResp * resp))callback;
///从服务器端获取到微信返回的支付请求用到的参数来发起支付请求
- (void)startPayWithReq:(PayReq *)req callback:(void(^)(BaseResp * resp))callback;
@end
实现代码 .m
// Created by reyzhang on 2017/4/10.
// Copyright © 2017年 hhkx All rights reserved.
// 微信支付服务封装
#import "WXPayService.h"
@interface WXPayService ()
@property (nonatomic,copy) void(^RespCallBack)(BaseResp *);
@end
static WXPayService *sharedInstance;
@implementation WXPayService
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [super allocWithZone:zone];
});
return sharedInstance;
}
///单例来接收微信请求的回调
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
// -- 根据接口返回的预支付信息,构造支付请求
+ (PayReq *)getPayRequest:(NSDictionary *)prepayData {
if (prepayData) {
PayReq *req = [[PayReq alloc] init];
req.partnerId = [prepayData stringForKey:@"partnerid"]; // -- 商家id
req.prepayId = [prepayData stringForKey:@"prepayid"];
req.nonceStr = [prepayData stringForKey:@"noncestr"];
req.timeStamp = [[prepayData stringForKey:@"timestamp"] intValue];
req.package = [prepayData stringForKey:@"package"];
req.sign = [prepayData stringForKey:@"sign"];
//日志输出
NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[prepayData stringForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign);
return req;
}
return nil;
}
///处理非支付请求的回调
- (void)onRespCallBack:(void(^)(BaseResp * resp))callback {
self.RespCallBack = callback;
}
///从服务器端获取到微信返回的支付请求用到的参数来发起支付请求
- (void)startPayWithReq:(PayReq *)req callback:(void(^)(BaseResp * resp))callback {
NSAssert(req !=nil , @"未成功创建微信支付请求");
self.RespCallBack = callback;
if ([WXApi isWXAppInstalled]) { // -- 判断是否安装微信应用
//发起微信支付,设置参数
[WXApi sendReq:req];
}else {
self.RespCallBack(nil);
}
}
#pragma mark WXApiDelegate
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) { // -- 判断是否为支付的回调
self.RespCallBack(resp);
}
}
@end
调用
在应用启动时还是先配置微信支付的AppKey
- (void)setupWXPay {
[WXApi registerApp:@"your appkey" withDescription:@"description"];
}
使用
- (void)WXPay {
// -- first check 微信是否安装
if (![WXApi isWXAppInstalled]) {
NSLog(@"微信应用未安装");
return;
}
// -- second 调用服务器接口获取预支付数据
[_service getPrepayData:^(id prepayData) {
// -- 构造支付请求PayReq
PayReq *req = [WXPayService getPayRequest:prepayData];
// -- 调起微信支付sdk
[[WXPayService sharedInstance] startPayWithReq:req callback:^(BaseResp *resp) {
if (!resp) {
return ;
}
if (resp.errCode == WXSuccess) {
NSLog(@"支付成功");
}else {
NSLog(@"支付失败");
}
}];
}];
}
在AppDelegate中的回调处理
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[self handleOpenURL:url];
return YES;
}
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
[self handleOpenURL:url];
return YES;
}
- (void)handleOpenURL:(NSURL*)url {
if ([url.host isEqualToString:@"pay"]) { // -- 微信支付
[WXApi handleOpenURL:url delegate:[WXPayService sharedInstance]];
}
}
写在最后:
如果我的文章对你有所帮助,请帮忙点个赞👍,谢谢!