iOS開(kāi)發(fā) - 支付寶/微信第三方支付工具類

調(diào)用方式

// 支付結(jié)果監(jiān)聽(tīng)
[YWPayHepler shareHelper].payResultBlock = ^(BOOL result, NSString * _Nonnull resultMsg) {
    NSLog(@"結(jié)果回調(diào):%@ ---> %@", (result ? @"支付成功" : @"支付失敗"), resultMsg);
};

YWPayHepler .h

#import <Foundation/Foundation.h>

#import <AlipaySDK/AlipaySDK.h>
#import "WXApi.h"

#define YWPayResultNotice           @"MGPayResultNotice"            // 支付結(jié)果通知

NS_ASSUME_NONNULL_BEGIN

@interface YWPayHepler : NSObject

/** 回調(diào) result支付結(jié)果狀態(tài)(成功/失敗) resultMsg支付結(jié)果消息 */
@property (nonatomic, copy) void (^payResultBlock)(BOOL result, NSString *resultMsg);

+ (instancetype)shareHelper;

/**
 支付寶支付
 拉起本地客戶端支付成功后在[AppDelegate application:openURL:options:]中回調(diào)支付結(jié)果

 @param paySign     支付簽名
 @param resultBlock 支付結(jié)果回調(diào)(H5網(wǎng)頁(yè)支付回調(diào))
 */
+ (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 -- 支付回調(diào)(微信支付回調(diào) & 支付寶支付回調(diào))
- (void)payResultHandleNotification:(NSNotification *)notification {
    
    BOOL result = NO;
    NSString *resultMsgStr = @"支付結(jié)果";
    
    //支付寶支付 - 回調(diào)(用userInfo)
    if (notification.userInfo) {
        // 支付結(jié)果解析
        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 = @"支付失敗 - 網(wǎng)絡(luò)連接出錯(cuò)";
                break;
            case 8000:
                resultMsgStr = @"正在處理中";
                break;
            default:
                resultMsgStr = @"支付失敗 - 未知原因";
                break;
        }
        
    }
    
    //微信支付 - 回調(diào)(用object)
    if (notification.object) {
        //回調(diào)消息
        PayResp *payResp = notification.object;
        switch (payResp.errCode) {
            case WXSuccess:
                result = YES;
                resultMsgStr = @"支付成功";
                break;
            case WXErrCodeCommon:
                resultMsgStr = @"支付失敗";//簽名錯(cuò)誤、未注冊(cè)APPID馒稍、項(xiàng)目設(shè)置APPID不正確择卦、注冊(cè)的APPID與設(shè)置的不匹配、其他異常等
                break;
            case WXErrCodeUserCancel:
                resultMsgStr = @"支付取消";
                break;
            case WXErrCodeSentFail:
                resultMsgStr = @"發(fā)送失敗";
                break;
            case WXErrCodeUnsupport:
                resultMsgStr = @"支付不支持";
                break;
            case WXErrCodeAuthDeny:
                resultMsgStr = @"支付授權(quán)失敗";
                break;
            default:
                resultMsgStr = @"支付失敗 - 未知原因";
                break;
        }
    }
    
    // 彈窗支付結(jié)果
    [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發(fā)起支付
    [[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(@"微信操作請(qǐng)求成功(并非支付成功妻熊,成功后會(huì)在Appdelegate里面回調(diào))");
}
*/
#pragma mark - * * * * * AppDelegate.m 中的支付回調(diào) * * * * *
// 只適用于iOS9以上灶轰,會(huì)優(yōu)先走這個(gè)方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {

    if ([url.host isEqualToString:@"safepay"]) {
        // 支付跳轉(zhuǎn)支付寶錢包進(jìn)行支付羡洁,處理支付結(jié)果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            MGLog(@"支付跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果回調(diào):result = %@",resultDic);
            [[NSNotificationCenter defaultCenter] postNotificationName:YWPayResultNotice object:nil userInfo:resultDic];
        }];
        return YES;
    }else if ([url.scheme isEqualToString:WX_KEY]) {
        // 微信支付回調(diào)處理(處理后走代理方法:- (void)onResp:(BaseResp *)resp)
        return [WXApi handleOpenURL:url delegate:self];
    }
    return YES;

}

// 微信回調(diào)處理
- (void)onResp:(BaseResp *)resp {
    //微信支付回調(diào)
    PayResp *payResp = (PayResp *) resp;
    [[NSNotificationCenter defaultCenter] postNotificationName: YWPayResultNotice object:payResp userInfo:nil];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苛蒲,一起剝皮案震驚了整個(gè)濱河市喜滨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撤防,老刑警劉巖虽风,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寄月,居然都是意外死亡辜膝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門漾肮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厂抖,“玉大人,你說(shuō)我怎么就攤上這事克懊〕栏ǎ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵谭溉,是天一觀的道長(zhǎng)墙懂。 經(jīng)常有香客問(wèn)我,道長(zhǎng)扮念,這世上最難降的妖魔是什么损搬? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上巧勤,老公的妹妹穿的比我還像新娘嵌灰。我一直安慰自己,他們只是感情好颅悉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布沽瞭。 她就那樣靜靜地躺著,像睡著了一般剩瓶。 火紅的嫁衣襯著肌膚如雪驹溃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天儒搭,我揣著相機(jī)與錄音,去河邊找鬼芙贫。 笑死搂鲫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磺平。 我是一名探鬼主播魂仍,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拣挪!你這毒婦竟也來(lái)了擦酌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菠劝,失蹤者是張志新(化名)和其女友劉穎赊舶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赶诊,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笼平,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舔痪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寓调。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锄码,靈堂內(nèi)的尸體忽然破棺而出夺英,到底是詐尸還是另有隱情,我是刑警寧澤滋捶,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布痛悯,位于F島的核電站,受9級(jí)特大地震影響重窟,放射性物質(zhì)發(fā)生泄漏灸蟆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炒考。 院中可真熱鬧可缚,春花似錦、人聲如沸斋枢。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓤帚。三九已至描姚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戈次,已是汗流浹背轩勘。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怯邪,地道東北人绊寻。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悬秉,于是被迫代替她去往敵國(guó)和親澄步。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353