支付__解讀我的微信和支付寶封裝類庫(三)

千呼萬喚始出來,終于經(jīng)過近10天努力浦马,對微信和支付寶支付方面文檔以及自己的項目多次研究和嘗試时呀,終搞定了支付的技術(shù)并有了以下的成果!
感謝開源的環(huán)境晶默,可以共享我的項目谨娜,如果不錯的話,請給個星星哦磺陡!
干貨:本篇最后會附上自己封裝的微信和支付寶支付的類庫趴梢,歡迎指點漠畜,共同進步!

我的家鄉(xiāng)歡迎您.jpg

本篇說些什么呢垢油?

首先附上目錄:
一.微信和支付寶支付異同點分析
二.我封裝的支付類庫原理講解
三.集成我的支付類庫的步驟
四.注意事項
五.附上我的演示Demo中的流程圖

一.微信和支付寶支付異同點分析
1.二者申請的異同
微信支付申請過程中需要¥300審核費盆驹,而支付寶的申請必須提供公司資質(zhì)才能申請使用;
也就是說滩愁,個人申請微信支付您需要是土豪躯喇,而申請支付寶支付您需要有靠山,哈哈硝枉,開個玩笑廉丽!

2.二者的支付整個流程異同
簡單來說:

相同的地方:
下訂單 —>調(diào)支付客戶端(微信或者支付寶)—>真正的支付—>通知支付成功

不同的地方:
支付寶:支付成功后,支付寶后臺主動把支付情況—>支付寶客戶端—>告知我們的商家妻味,這里我稱為主動性支付正压!
微信:支付成功后,
微信后臺異步通知—>商戶后臺
微信App 通知—> 商戶App 查詢—>商戶后臺—>告知我們的商家 這里我稱為被動性支付责球!

匯總:
支付寶:主動性支付
微信:被動性支付

3.其他異同
調(diào)啟支付客戶端并回去的異同:如下
支付寶支付:在urlScheme中加入自定義字符串標示回來的應用
微信支付:在url中寫申請的AppId標示回來的應用
如下:


支付寶和微信urlScheme設(shè)置位置.png

微信支付成功下訂單是至少7個參數(shù)焦履,支付需要用到
支付寶成功下訂單是一串字符串,支付需要
這里的不同點就是我封裝的類庫的入口處雏逾!

支付成功后的回調(diào)方式:
微信支付是代理回調(diào)
支付寶支付是Block回調(diào)

二.我封裝的支付類庫原理講解
以上以支付寶和微信的支付不同點作為入口嘉裤,來解析我封裝的類庫,即為WechatAliPay
在這個項目中栖博,關(guān)于支付的有以下3個文件

1.CMWechatAliPayManager 的.h 和.m文件
一個發(fā)送支付請求的單例類屑宠,其中含有分別處理微信和支付寶的下訂單成功后執(zhí)行真正的支付是通過返回過來的訂單參數(shù)
如果是字符串則證明是支付寶的返回,就用下面的方法

// 調(diào)用支付寶的支付接口
  [[AlipaySDK defaultService] payOrder:infoStr fromScheme:appScheme callback:^(NSDictionary *resultDic) {
      NSLog(@"reslut = %@",resultDic);
      NSString *resultStatus = resultDic[@"resultStatus"];
      [ws.delegate Wpay:ws andPayKind:WAPayKindAliPay andPayResult:[resultStatus intValue]];

  }];

調(diào)用支付寶的接口完成支付仇让;
如果是字典則證明是微信的返回典奉,則通過下面的方法包裝PayReq 的參數(shù),調(diào)用

// 判斷自己的服務(wù)器的產(chǎn)生的訂單參數(shù)返回是否正確,并返回包裝好的參數(shù)
-(PayReq *)isWpayParamsIsCorrect:(NSDictionary *)params {
    
    if ([params allKeys].count >=6) {
        PayReq *req =[[PayReq alloc]init];
#warning 微信支付的訂單參數(shù)(AppId等)丧叽,不要忘記更改了
        req.openID =@"wxe9beac44b65d4815";
        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方法卫玖,等待返回onResp 方法

2.CMWpaySearchResultDelegate.h文件
這是設(shè)定一個協(xié)議,當支付成功之后蠢正,會根據(jù)這個協(xié)議調(diào)用對應的方法完成支付后的工作:
如:當微信支付成功骇笔,走到 onResp ,我的代理就會調(diào)用 CMWpaySearchResultDelegate.h的Wpay:andPayKind:andPayResult: 如下


#pragma mark - 微信支付成功后返回

-(void) onResp:(BaseResp*)resp {
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回結(jié)果嚣崭,實際支付結(jié)果需要去微信服務(wù)器端查詢
        if ([self.delegate respondsToSelector:@selector(Wpay:andPayKind:andPayResult:)]) {
            [self.delegate Wpay:self andPayKind:WAPayKindWechat andPayResult:resp.errCode];
        }

       
    }
}

告訴我的客戶端支付成功了
而當支付寶支付成功后,就會走到其設(shè)置的block種同樣由我的代理調(diào)用Wpay:andPayKind:andPayResult: 如下


支付寶支付成功Block回調(diào).png

完成支付完成后的事情懦傍。

3.支付完成后走到如下Wpay:andPayKind:andPayResult: 中雹舀,然后展示如下:

#pragma mark - CMWpaySearchResultDelegate
-(void)Wpay:(CMWechatAliPayManager *)manager andPayKind:(WAPayKind)payKind andPayResult:(int)code {
    DDLog(@"走到回調(diào)的地方了");
    if (payKind ==WAPayKindWechat) { // 微信
        switch (code) {
            case WXSuccess:
                
                // 1. 包裝對應查詢參數(shù)
                [DisplayHelper displaySuccessAlert:@"微信支付成功!"];
                // 2. 發(fā)送查詢的是否成功的請求
                break;
                
            default:
                
                break;
        }
    }else { // 支付寶
        switch (code) {
            case 9000:// 成功
                [DisplayHelper displaySuccessAlert:@"支付寶支付成功!"];

                break;
            case 6001:// 取消
                break;
            default:
                break;
        }
    }
    
   
}

三.集成我的支付類庫的步驟(具體部分詳情請參照最后附帶我另外2篇講的關(guān)于微信和支付寶支付集成)

1.導入的庫
導入的SDK如下:


導入的SDK最終效果.png

導入的系統(tǒng)庫如下:
在Build Phases選項卡的Link Binary With Libraries中加入以下的依賴:

libc++.tbd
libz.tbd
SystemConfiguration.framework
CoreTelephony.framework
QuartzCore.framework
CoreText.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
CoreMotion.framework
CFNetwork.framework
Security.framework
libsqlite3.0.dylib
UIKit.framework

// 支付寶依賴的
AlipaySDK.framework

// 微信官方的庫
libWeChatSDK.a

導入我的3個文件夾


導入我封裝的庫.png

2.更改的文件
AppDelegate中頭文件和代理:

導入
#import "WXApi.h"
遵循
<WXApiDelegate>

AppDelegate中Code處理方面:
初始化微信支付方法如下:

#pragma mark - 初始化微信支付
- (void)initWpay
{
    #warning 記得更改微信Appid為您的
    [WXApi registerApp:@"wx685a5f98e4497044" withDescription:@"com.zzdlwx.com"];
}

Application的代理方法實現(xiàn)如下:

#pragma mark - UIApplicationDelegate

- (BOOL)application:(UIApplication *)application
      handleOpenURL:(NSURL *)url
{
    return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    if ([url.host isEqualToString:@"safepay"]) {
        // 支付跳轉(zhuǎn)支付寶錢包進行支付,處理支付結(jié)果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
            NSString *resultStatus = resultDic[@"resultStatus"];
            switch (resultStatus.integerValue) {
                case 9000:// 成功
                    break;
                case 6001:// 取消
                    break;
                default:
                    break;
            }
        }];
        
        // 授權(quán)跳轉(zhuǎn)支付寶錢包進行支付粗俱,處理支付結(jié)果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
            // 解析 auth code
            NSString *result = resultDic[@"result"];
            NSString *authCode = nil;
            if (result.length>0) {
                NSArray *resultArr = [result componentsSeparatedByString:@"&"];
                for (NSString *subResult in resultArr) {
                    if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
                        authCode = [subResult substringFromIndex:10];
                        break;
                    }
                }
            }
            NSLog(@"授權(quán)結(jié)果 authCode = %@", authCode?:@"");
        }];
    }
    return [WXApi handleOpenURL:url delegate:self];
}

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    if ([url.host isEqualToString:@"safepay"]) {
        // 支付跳轉(zhuǎn)支付寶錢包進行支付说榆,處理支付結(jié)果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
        }];
        
        // 授權(quán)跳轉(zhuǎn)支付寶錢包進行支付,處理支付結(jié)果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
            // 解析 auth code
            NSString *result = resultDic[@"result"];
            NSString *authCode = nil;
            if (result.length>0) {
                NSArray *resultArr = [result componentsSeparatedByString:@"&"];
                for (NSString *subResult in resultArr) {
                    if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
                        authCode = [subResult substringFromIndex:10];
                        break;
                    }
                }
            }
            NSLog(@"授權(quán)結(jié)果 authCode = %@", authCode?:@"");
        }];
    }
    return [WXApi handleOpenURL:url delegate:self];
}

要支付的文件中的頭文件導入
(注意CMHttpRequestModel 這個類我已經(jīng)加入我的Pch中,沒加入的話签财,您也要導入)

#import "CMWechatAliPayManager.h"

要支付的文件中的Code處理方面
發(fā)送下訂單的請求

-(void)yesPayBtnClick:(UIButton *)button {
    
    CMHttpRequestModel *paramsModel =[[CMHttpRequestModel alloc]init];
    paramsModel.localHost =kTestHttpHost;
    paramsModel.appendUrl =kPay_topay;
    // 參數(shù)設(shè)置

    [paramsModel.paramDic setValue:@"e1370e6a9995a7010ded1596308acfc6" forKey:@"token"];
    [paramsModel.paramDic setValue:@"Z20170421114853LK8pc" forKey:@"orderid"];
    
    
    // 3.發(fā)送的網(wǎng)絡(luò)請求
    
    if (self.selectedTableView.indexKind==0) {// 支付寶支付
        [paramsModel.paramDic setValue:@(3) forKey:@"paytype"];

    }else if (self.selectedTableView.indexKind==1) {// 微信支付
        [paramsModel.paramDic setValue:@(4) forKey:@"paytype"];

    }else {// 銀聯(lián)支付
        
    }
    [[CMWechatAliPayManager sharedWpayManager] sendWeChatAliPayRequestParam:paramsModel];
   
}

支付成功后的回調(diào)處理

#pragma mark - CMWpaySearchResultDelegate
-(void)Wpay:(CMWechatAliPayManager *)manager andPayKind:(WAPayKind)payKind andPayResult:(int)code {
    DDLog(@"走到回調(diào)的地方了");
    if (payKind ==WAPayKindWechat) { // 微信
        switch (code) {
            case WXSuccess:
                
                // 1. 包裝對應查詢參數(shù)
                [DisplayHelper displaySuccessAlert:@"微信支付成功!"];
                // 2. 發(fā)送查詢的是否成功的請求
                break;
                
            default:
                
                break;
        }
    }else { // 支付寶
        switch (code) {
            case 9000:// 成功
                [DisplayHelper displaySuccessAlert:@"支付寶支付成功!"];

                break;
            case 6001:// 取消
                break;
            default:
                break;
        }
    }
    
   
}

3.注意更改以下地方
全局搜索 “#warning” 找到下面的5個地方串慰,分別按照提示更改為您的信息


按照要求修改為您的信息.png

4.其他要更改的

在info.plist中把微信加入白名單等

urlType中分別加入微信和支付寶的urlScheme

支付寶導入SDK后報錯 : #include <openssl/asn1.h> 找不到
解決方案:
在Build Settings選項卡中搜索 header search添加新的路徑為$(PROJECT_DIR)/FarmAndAnimal/Vendor/AliPaySDK/
其中這里的AliPaySDK 指的是openssl 的上一級文件為止,不一定是AliPaySDK唱蒸, 切記邦鲫!

四.注意事項
1.注意修改以上集成步驟中“#warning”搜索后要改的內(nèi)容

2.微信支付需要和項目Bundle綁定在一起,支付寶任何應用都可以完成支付功能

3.關(guān)于微信和支付寶的應用跳轉(zhuǎn)和返回應用:
微信注意3個地方
應用啟動時注冊AppId
urlScheme中添加AppId
支付發(fā)送PayReq中帶上對應的AppId

支付寶注意2個地方
urlScheme中添加自定義字符串
發(fā)送支付請求時加上appScheme 標示應用程序

五.附上我的演示Demo中的流程圖
1.支付寶流程:


1我的主界面.png
2支付寶的入口.png
調(diào)啟支付寶客戶端支付.png

1.微信流程:


1我的主界面.png
調(diào)啟微信客戶端.png
微信支付失敗.png

納尼神汹,微信為什么會支付失敗呢庆捺,就是因為微信的AppId必須綁定到對應的BundleId才能生效
ps:微信支付正在申請中,嘿嘿屁魏!

附上:

1.支付寶接入流程分享:
http://www.reibang.com/p/d8edb82e51a7
2.微信支付接入流程分享:
http://www.reibang.com/p/8205595a932d
3.我的支付寶和微信分享Demo:
https://github.com/zxwIsCode/WechatAliPay

支付模塊暫時告一段落滔以,以后有時間有機會會整理一下關(guān)于銀聯(lián)支付甚至第三方Ping++等有關(guān)支付的問題!
有任何問題氓拼,歡迎聯(lián)系QQ:1824496534你画,備注:支付。
期待中吧桃漾,小伙伴坏匪,感謝支持!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呈队,一起剝皮案震驚了整個濱河市剥槐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宪摧,老刑警劉巖粒竖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異几于,居然都是意外死亡蕊苗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門沿彭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朽砰,“玉大人,你說我怎么就攤上這事喉刘∏迫幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵睦裳,是天一觀的道長造锅。 經(jīng)常有香客問我,道長廉邑,這世上最難降的妖魔是什么哥蔚? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任倒谷,我火速辦了婚禮,結(jié)果婚禮上糙箍,老公的妹妹穿的比我還像新娘渤愁。我一直安慰自己,他們只是感情好深夯,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布抖格。 她就那樣靜靜地躺著,像睡著了一般塌西。 火紅的嫁衣襯著肌膚如雪他挎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天捡需,我揣著相機與錄音办桨,去河邊找鬼。 笑死站辉,一個胖子當著我的面吹牛呢撞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饰剥,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼殊霞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汰蓉?” 一聲冷哼從身側(cè)響起绷蹲,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顾孽,沒想到半個月后祝钢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡若厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年拦英,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测秸。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡疤估,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霎冯,到底是詐尸還是另有隱情铃拇,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布沈撞,位于F島的核電站锚贱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏关串。R本人自食惡果不足惜拧廊,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晋修。 院中可真熱鬧吧碾,春花似錦、人聲如沸墓卦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽落剪。三九已至睁本,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忠怖,已是汗流浹背呢堰。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凡泣,地道東北人枉疼。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鞋拟,于是被迫代替她去往敵國和親骂维。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,744評論 25 707
  • 實現(xiàn)支付寶支付的準備工作: 1.向支付寶簽約贺纲,成為支付寶的商戶 簽約完成后航闺,支付寶會提供一些必要的數(shù)據(jù)給我們 商戶...
    Anson楊春安閱讀 8,190評論 0 6
  • 一潦刃、前言 1、之前寫了一篇支付寶支付——統(tǒng)一wap和支付寶錢包回調(diào),然后有需求說也弄一個微信支付的稠肘,block回調(diào)...
    gitKong閱讀 20,448評論 53 214
  • 自己總結(jié)的微信支付寶支付流程和注意點: 準備工作: 需要公司的營業(yè)執(zhí)照福铅,稅務(wù)信息,等老板的身份證信息等项阴,我記得滑黔,用...
    Www劉閱讀 18,558評論 2 50
  • 1.1、File基本介紹 1.2环揽、使用File類操作文件 1略荡、創(chuàng)建一個新文件 File f =new File("...
    子玲2017閱讀 391評論 0 0