调用方式
// 支付结果监听
[YWPayHepler shareHelper].payResultBlock = ^(BOOL result, NSString * _Nonnull resultMsg) {
NSLog(@"结果回调:%@ ---> %@", (result ? @"支付成功" : @"支付失败"), resultMsg);
};
YWPayHepler .h
#import <Foundation/Foundation.h>
#import <AlipaySDK/AlipaySDK.h>
#import "WXApi.h"
#define YWPayResultNotice @"MGPayResultNotice" // 支付结果通知
NS_ASSUME_NONNULL_BEGIN
@interface YWPayHepler : NSObject
/** 回调 result支付结果状态(成功/失败) resultMsg支付结果消息 */
@property (nonatomic, copy) void (^payResultBlock)(BOOL result, NSString *resultMsg);
+ (instancetype)shareHelper;
/**
支付宝支付
拉起本地客户端支付成功后在[AppDelegate application:openURL:options:]中回调支付结果
@param paySign 支付签名
@param resultBlock 支付结果回调(H5网页支付回调)
*/
+ (void)aliPayOrderWithSign:(NSString *)paySign
resultBlock:(void (^)(NSDictionary *resultDic))resultBlock;
@end
YWPayHepler .m
#import "YWPayHepler.h"
static YWPayHepler *helper = nil;
@implementation YWPayHepler
+ (instancetype)shareHelper
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
helper = [[YWPayHepler alloc] init];
});
return helper;
}
- (id)init
{
self = [super init];
if (self) {
[self _initHelper];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark - init
- (void)_initHelper
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payResultHandleNotification:) name:YWPayResultNotice object:nil];
}
#pragma mark -- 支付回调(微信支付回调 & 支付宝支付回调)
- (void)payResultHandleNotification:(NSNotification *)notification {
BOOL result = NO;
NSString *resultMsgStr = @"支付结果";
//支付宝支付 - 回调(用userInfo)
if (notification.userInfo) {
// 支付结果解析
NSInteger resultStatus = [notification.userInfo[@"resultStatus"] integerValue];
switch (resultStatus) {
case 9000:
{
result = YES;
resultMsgStr = @"支付成功";
// 更新用户余额
[MGUserNetworkManager updateUserBalanceBlock:^(BOOL success) {}];
}
break;
case 4000:
resultMsgStr = @"支付失败";
break;
case 6001:
resultMsgStr = @"用户中途取消支付";
break;
case 6002:
resultMsgStr = @"支付失败 - 网络连接出错";
break;
case 8000:
resultMsgStr = @"正在处理中";
break;
default:
resultMsgStr = @"支付失败 - 未知原因";
break;
}
}
//微信支付 - 回调(用object)
if (notification.object) {
//回调消息
PayResp *payResp = notification.object;
switch (payResp.errCode) {
case WXSuccess:
result = YES;
resultMsgStr = @"支付成功";
break;
case WXErrCodeCommon:
resultMsgStr = @"支付失败";//签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
break;
case WXErrCodeUserCancel:
resultMsgStr = @"支付取消";
break;
case WXErrCodeSentFail:
resultMsgStr = @"发送失败";
break;
case WXErrCodeUnsupport:
resultMsgStr = @"支付不支持";
break;
case WXErrCodeAuthDeny:
resultMsgStr = @"支付授权失败";
break;
default:
resultMsgStr = @"支付失败 - 未知原因";
break;
}
}
// 弹窗支付结果
[self showAlertWithResultMessage:resultMsgStr result:result];
}
#pragma mark - * * * * * private * * * * *
- (void)showAlertWithResultMessage:(NSString *)msgStr result:(BOOL)result {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:msgStr preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
if (self.payResultBlock) {
self.payResultBlock(result, msgStr);
}
}];
[alertController addAction:okAction];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIViewController *rootViewController = window.rootViewController;
[rootViewController presentViewController:alertController animated:YES completion:nil];
}
+ (void)aliPayOrderWithSign:(NSString *)paySign resultBlock:(void (^)(NSDictionary * _Nonnull))resultBlock {
// 拿着支付宝订单签名使用SDK发起支付
[[AlipaySDK defaultService] payOrder:paySign fromScheme:YWPayURLScheme callback:resultBlock];
}
@end
### 其他demo参考
/* 微信支付
Log(@"微信支付签名信息 - %@",signDic);
PayReq *request = [[PayReq alloc] init];
request.partnerId = [signDic[@"partnerid"] mutableCopy];
request.prepayId = [signDic[@"prepayid"] mutableCopy];
request.package = [signDic[@"package"] mutableCopy];
request.nonceStr = [signDic[@"noncestr"] mutableCopy];
int ivalue = [[signDic[@"timestamp"] mutableCopy] intValue];
request.timeStamp = ivalue;
request.sign = [signDic[@"sign"] mutableCopy];
if (![WXApi sendReq: request]) {
NSLog(@"微信支付失败");
} else {
NSLog(@"微信操作请求成功(并非支付成功,成功后会在Appdelegate里面回调)");
}
*/
#pragma mark - * * * * * AppDelegate.m 中的支付回调 * * * * *
// 只适用于iOS9以上,会优先走这个方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {
if ([url.host isEqualToString:@"safepay"]) {
// 支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
MGLog(@"支付跳转支付宝钱包进行支付,处理支付结果回调:result = %@",resultDic);
[[NSNotificationCenter defaultCenter] postNotificationName:YWPayResultNotice object:nil userInfo:resultDic];
}];
return YES;
}else if ([url.scheme isEqualToString:WX_KEY]) {
// 微信支付回调处理(处理后走代理方法:- (void)onResp:(BaseResp *)resp)
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
// 微信回调处理
- (void)onResp:(BaseResp *)resp {
//微信支付回调
PayResp *payResp = (PayResp *) resp;
[[NSNotificationCenter defaultCenter] postNotificationName: YWPayResultNotice object:payResp userInfo:nil];
}
网友评论