微信_(tái)_支付App支付接入流程(二)

這是第二次集成微信支付,距上次微信支付搞定約莫快一年了猪腕,上次匆忙的把問(wèn)題搞定了舞蔽,這次呢,肯定不能簡(jiǎn)單的搞定問(wèn)題就算了码撰,必須來(lái)點(diǎn)干貨的渗柿!

注釋:親測(cè)可用!

本篇說(shuō)些什么呢脖岛?請(qǐng)看目錄:

一.導(dǎo)入的類庫(kù)
二.更改的文件
三.注意事項(xiàng)
四.微信支付流程解析
五.一點(diǎn)干貨分享

一.導(dǎo)入的類庫(kù)
1.導(dǎo)入微信支付SDK
直接把支付官方Demo中的SDKExport 導(dǎo)入自己的項(xiàng)目中即可
效果圖如下:


微信支付第三方類庫(kù).png

2.導(dǎo)入的系統(tǒng)庫(kù):(根據(jù)官方Demo)

Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
UIKit.framework
Foundation.framework

// 微信官方的庫(kù)
libWeChatSDK.a

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

導(dǎo)入
#import "WXApi.h"
遵循
<WXApiDelegate>

Code處理方面:
在didFinishLaunchingWithOptions 方法中導(dǎo)入并調(diào)用以下的方法使應(yīng)用程序一開始啟動(dòng)的時(shí)候就遠(yuǎn)程告訴微信支付等

#pragma mark - 初始化微信支付
- (void)initWpay
{
    [WXApi registerApp:@"您的AppId" withDescription:@"標(biāo)示字符串"];
}

導(dǎo)入以下方法的實(shí)現(xiàn):

- (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.要支付的文件中

導(dǎo)入
#import "WXApi.h"
#import "WXApiObject.h"
遵循
<WXApiDelegate>

Code處理方面:

當(dāng)把您的請(qǐng)求發(fā)送出去了之后朵栖,您的服務(wù)器會(huì)給您返回下單成功后的參數(shù)如下為params ,這里面至少要有6個(gè)對(duì)應(yīng)的key值柴梆,如下才可以包裝成我們的PayReq 參數(shù)陨溅,

// 判斷自己的服務(wù)器的產(chǎn)生的訂單參數(shù)返回是否正確,并返回包裝好的參數(shù)
-(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;
}

然后通過(guò)sendReq發(fā)送支付請(qǐng)求,等待跳轉(zhuǎn)微信App完成支付绍在,返回onResp方法中處理:

// 服務(wù)器返回正確的業(yè)務(wù)邏輯處理
// 1.判斷自己的服務(wù)器的產(chǎn)生的訂單參數(shù)返回是否正確
PayReq *payReq =[ws isWpayParamsIsCorrect:infoDic];
if (!payReq) {
  return ;
}
// 2.臨時(shí)記錄發(fā)送的參數(shù)
ws.paramsModel =model;

//                              [DisplayHelper displaySuccessAlert:@"請(qǐng)求微信支付訂單成功!"];
if (![WXApi isWXAppInstalled]) {
  [DisplayHelper displayWarningAlert:@"您還沒有安裝微信哦门扇,無(wú)法支付!"];
  return ;
}
// 3.調(diào)用微信API,payReq對(duì)應(yīng)的參數(shù)
[WXApi sendReq:payReq];

在完成支付的onResp方法中如果支付成功了偿渡,就去請(qǐng)求我們的服務(wù)器確定確實(shí)成功了之后就展示自己的成功邏輯界面

-(void) onResp:(BaseResp*)resp {
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回結(jié)果臼寄,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢
      switch (code) {
                case WXSuccess:

                    // 1. 包裝對(duì)應(yīng)查詢參數(shù)
                    
                    // 2. 發(fā)送查詢的是否成功的請(qǐng)求
                    
                    break;
    
                default:

                    break;
            }
    }
}

附上支付返回的狀態(tài)碼提示:

enum  WXErrCode {
    WXSuccess           = 0,    /**< 成功    */
    WXErrCodeCommon     = -1,   /**< 普通錯(cuò)誤類型    */
    WXErrCodeUserCancel = -2,   /**< 用戶點(diǎn)擊取消并返回    */
    WXErrCodeSentFail   = -3,   /**< 發(fā)送失敗    */
    WXErrCodeAuthDeny   = -4,   /**< 授權(quán)失敗    */
    WXErrCodeUnsupport  = -5,   /**< 微信不支持    */
};

三.注意事項(xiàng)
1.urlschemes 的設(shè)置,注意在如下的地方設(shè)置微信支付完成后的回到應(yīng)用程序中溜宽,注意:不設(shè)置的話就無(wú)法返回我的應(yīng)用


微信支付完成后回應(yīng)用程序標(biāo)示.png

2.微信app的白名單加入(自己踩的就是這里的坑)
因?yàn)橹暗腶pp集成支付前要集成分享功能吉拳,http://www.reibang.com/p/5539cdac6097
(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這個(gè)value加入進(jìn)去留攒,造成無(wú)法調(diào)啟微信客戶端完成支付的尷尬局面煤惩,吸取了教訓(xùn),切記炼邀!

3.微信支付成功后魄揉,回調(diào)到onResp方法的時(shí)候時(shí),一定要記得去自己的商戶后臺(tái)查詢是否真正支付成功拭宁,而不是直接展示成功什猖,切記!

四.微信支付流程解析
1.下單過(guò)程
商戶App發(fā)送下單的信息 --->商戶后臺(tái)發(fā)送給 --->微信后臺(tái)返回訂單 --->商戶后臺(tái)返回訂單 --->商戶App

2.支付過(guò)程
商戶App發(fā)送sendReq方法--->微信App發(fā)起支付請(qǐng)求--->微信后臺(tái)授權(quán)支付--->微信App輸入密碼完成支付

3.支付完成之后
微信后臺(tái)異步通知--->商戶后臺(tái)
微信App發(fā)送支付成功信息--->商戶App去查詢是否真正支付成功--->商戶后臺(tái)(如果此時(shí)未收到微信后臺(tái)異步通知商戶后臺(tái)則會(huì)調(diào)用查詢API--->微信后臺(tái)返回支付結(jié)果--->商戶后臺(tái))否則红淡,直接根據(jù)微信后臺(tái)異步通知商戶支付成功與否給--->商戶App確認(rèn)

附上:


微信官方支付流程圖.png

五.一點(diǎn)干貨分享
1.我的微信支付寶Demo功能展示:
溫馨提示:根據(jù)使用者反饋不狮,由于自己微信支付寶都集成完畢,就把自己集成的微信庫(kù)文件給刪除了在旱,所以接下來(lái)要集成支付寶和微信的小伙伴請(qǐng)移步參考這個(gè)新的鏈接:http://www.reibang.com/p/ef6d74a2b6c3

當(dāng)然摇零,如果還是只集成微信的話,請(qǐng)先下載Demo鏈接為:https://github.com/zxwIsCode/WechatAliPay
接著打開Demo桶蝎,按步驟集成如下圖所示

我的Demo支付功能展示說(shuō)明.png

拖拽左側(cè)的4個(gè)類庫(kù)到您的文件中驻仅,只有微信支付的話,就屏蔽到如上圖的支付寶支付代碼登渣,以及屏蔽下面導(dǎo)入的2個(gè)頭文件:

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

2.我的微信支付的使用辦法:
注意:這里支付流程中所發(fā)送的支付網(wǎng)絡(luò)請(qǐng)求是從開始購(gòu)買噪服,也就是下單前的處理,具體的如上的sendReq:和onResp:方法在我已經(jīng)封裝好的類中胜茧,可以直接使用的粘优!
拖拽我上面說(shuō)的微信支付的4個(gè)文件夾到您的工程中,之后屏蔽到支付寶支付的有關(guān)代碼和類庫(kù)等呻顽;
再按照上面的步驟分別把不同的系統(tǒng)類庫(kù)導(dǎo)入您的項(xiàng)目中雹顺;

集成完畢了之后,怎么用呢廊遍,請(qǐng)看下面:
直接在您要支付的類里面嬉愧,

導(dǎo)入
#import "CMWechatPayManager.h"
#import "WXApiObject.h"
#import "CMWpaySearchResultDelegate.h"
遵循
CMWpaySearchResultDelegate

按照下面的模式調(diào)用,CMHttpRequestModel的使用可以參考我的空項(xiàng)目對(duì)于網(wǎng)絡(luò)請(qǐng)求庫(kù)的使用簡(jiǎn)介:
http://www.reibang.com/p/c8b6b8660693
(我的空項(xiàng)目的使用喉前,有關(guān)于CMHttpRequestModel的類庫(kù)的介紹等)

NSMutableDictionary *dic =[NSMutableDictionary dictionary];

    [dic setValue:@"123"forKey:@"userid"];
    
    // 充值直接調(diào)微信充值
    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];

導(dǎo)入以下代理的方法没酣,做自己的成功后的業(yè)務(wù)處理邏輯

#pragma mark - CMWpaySearchResultDelegate

-(void)Wpay:(CMWechatPayManager *)manager andPayResult:(int)code {
    
            switch (code) {
                case WXSuccess:

                    // 1. 包裝對(duì)應(yīng)查詢參數(shù)
                    
                    // 2. 發(fā)送查詢的是否成功的請(qǐng)求
                    
                    break;
    
                default:

                    break;
            }
}

附上:
1.微信支付官方文檔:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5#
2.支付寶接入流程分享:
http://www.reibang.com/p/d8edb82e51a7
3.我的微信支付寶支付集成Demo:
https://github.com/zxwIsCode/WechatAliPay

下一篇:支付__解讀我的微信和支付寶封裝類庫(kù)(三):http://www.reibang.com/p/ef6d74a2b6c3
整理了微信和支付寶支付的異同點(diǎn)和注意事項(xiàng),也有了支付成果卵迂,供參考!
有任何問(wèn)題裕便,歡迎聯(lián)系QQ:1824496534,備注:支付狭握;
或者@我闪金,隨時(shí)提供技術(shù)支持!期待中吧论颅,小伙伴哎垦,感謝支持!
本篇于2017年07月27日第一次修改:由使用者反饋恃疯,之前只有微信支付的文件找不到了漏设,故而修改部分集成流程方面等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末今妄,一起剝皮案震驚了整個(gè)濱河市郑口,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盾鳞,老刑警劉巖犬性,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腾仅,居然都是意外死亡乒裆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門推励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鹤耍,“玉大人,你說(shuō)我怎么就攤上這事验辞「寤疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵跌造,是天一觀的道長(zhǎng)杆怕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)壳贪,這世上最難降的妖魔是什么财著? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮撑碴,結(jié)果婚禮上撑教,老公的妹妹穿的比我還像新娘。我一直安慰自己醉拓,他們只是感情好伟姐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亿卤,像睡著了一般愤兵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上排吴,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天秆乳,我揣著相機(jī)與錄音,去河邊找鬼。 笑死屹堰,一個(gè)胖子當(dāng)著我的面吹牛肛冶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扯键,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼睦袖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了荣刑?” 一聲冷哼從身側(cè)響起馅笙,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厉亏,沒想到半個(gè)月后董习,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爱只,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年皿淋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虱颗。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沥匈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忘渔,到底是詐尸還是另有隱情高帖,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布畦粮,位于F島的核電站散址,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宣赔。R本人自食惡果不足惜预麸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儒将。 院中可真熱鬧吏祸,春花似錦、人聲如沸钩蚊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砰逻。三九已至鸣驱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝠咆,已是汗流浹背踊东。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工北滥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闸翅。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓再芋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缎脾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祝闻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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