iOS-微信支付(三)-客戶端實現(xiàn)微信支付

前言

1.本文章是繼上篇文章iOS-微信支付關(guān)于服務(wù)器需要做的事情,這樣可以更好的了解服務(wù)的整個流程

2.微信支付的簽名和加密的工作都是在服務(wù)器端做,此篇文章只需要調(diào)用上篇的服務(wù)器的接口,得到服務(wù)器拋出的模型,模型的字段有(partnerId、prepayId、nonceStr、timeStamp、sign)數(shù)據(jù),然后直接調(diào)起微信支付,參照App開發(fā)步驟

image

3.微信的DEMO中集成了很多的功能,最新下載的DEMO中沒有(V3&V4支付流程實現(xiàn))這段代碼,從網(wǎng)上找到的這段代碼,詳情如下:

image

4.如果在工程中集成了友盟第三方(登錄、分享)等功能,所以微信支付的SDK就可以不用導(dǎo)入到項目中了(導(dǎo)入也會重復(fù)報錯),微信支付SDK

image

開始集成微信支付

1.項目設(shè)置APPID


image

2.導(dǎo)入微信支付的SDK(本工程中因為集成了友盟的第三方(登錄、分享))等功能,所以微信支付的SDK就可以不用再導(dǎo)入到項目中了)

image

3.導(dǎo)入相關(guān)的庫

  • SystemConfiguration.framework
  • libz.dylib
  • libsqlite3.0.dylib
  • libc++.dylib
  • Security.framework
  • CoreTelephony.framework
  • CFNetwork.framework
image

4.在appDelegate中注冊微信的APPID

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 向微信注冊wxd930ea5d5a258f4f
    [WXApi registerApp:@"wxb4ba3c02awiiwiow" withDescription:@"demo 2.0"];

    return YES;
}

5.先發(fā)送網(wǎng)絡(luò)請求到自己的服務(wù)器,進行簽名認(rèn)證,獲得支付的參數(shù)(partnerId、prepayId、nonceStr、timeStamp、sign)成功后調(diào)起微信支付

/**
 * 點擊微信支付按鈕,走下面的方法
 * 去服務(wù)器請求數(shù)據(jù)(partnerId、prepayId、nonceStr、timeStamp)
 */
[[HQNetworkTools sharedTools] requestPingTaiDataWithRootCode:rootCode parameters:para finished:^(id result, NSError *error) {

    if (error) {

        HQLog(@"%@", error);

    } else {

        [MBProgressHUD hideHUD];
        int success = [result[@"success"] intValue];
        if (success == 1) {

            HQBaseModel *model = [HQBaseModel mj_objectWithKeyValues:result[@"data"]];

            if ([payType_str isEqualToString:@"1"]) {               // wepay

                PayReq *request    = [[PayReq alloc] init];
                request.partnerId  = model.partnerid;
                request.prepayId   = model.prepayid;
                request.package    = @"Sign=WXPay";
                request.nonceStr   = model.noncestr;
                // 注意時間戳一定是10位的(最開始我們后臺返回的就是13位的,一直報錯),而且后臺返回的是String,要轉(zhuǎn)換類型
                request.timeStamp  = [model.timestamp intValue];
                request.sign       = model.sign;

                /**
                 * 調(diào)起微信支付的方法
                 */
                [WXApi sendReq:request];

            } else if ([payType_str isEqualToString:@"2"]) {        // alipay


            }

        } else {

            [MBProgressHUD showText:result[@"errorInfo"]];
        }
    }
}];

6.微信支付的回調(diào)

  • 參照微信的demo,要實現(xiàn)onResp函數(shù),支付完成后,微信APP會返回到商戶APP并回調(diào)onResp函數(shù),開發(fā)者需要在該函數(shù)中接收通知,判斷返回錯誤碼,如果支付成功則去后臺查詢支付結(jié)果再展示用戶實際支付結(jié)果。注意 一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。為了避免AppDelegate中的代碼太多,新建一個WXApiManager管理類,來處理支付的回調(diào)


    image

7.處理支付的回調(diào)AppDelegate里操作
首先在AppDelegate里面導(dǎo)入頭文件

#import <WXApi.h>
#import "WXApiManager.h"
  • 處理微信的回調(diào),在這里建議將三個方法都加上:
#pragma mark - 設(shè)置微信回調(diào)
// 支持所有iOS系統(tǒng)(被廢棄的方法.但是在低版本中會用到.建議寫上)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    /**
     * 微信支付回調(diào)
     */
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

// 僅支持iOS9以上系統(tǒng),iOS8及以下系統(tǒng)不會回調(diào)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
    /**
     * 微信支付回調(diào)
     */
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

// 支持目前所有iOS系統(tǒng)
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    /**
     * 微信支付回調(diào)
     */
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

在代理的類中WXApiManager處理支付成功或者失敗的回調(diào)(這里可以給支付的控制器發(fā)送通知,然后跳轉(zhuǎn)到”已付款訂單頁面“或者”待付款訂單頁面“)

#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp
{
    if([resp isKindOfClass:[PayResp class]]) {

        // 支付返回結(jié)果,實際支付結(jié)果需要去微信服務(wù)器端查詢
        NSString *strMsg = [NSString stringWithFormat:@"支付結(jié)果"];

        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付結(jié)果:成功!";
                HQLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                /** 發(fā)送支付成功的通知 */
                [[NSNotificationCenter defaultCenter] postNotificationName:HQPaySuccessNotification object:nil userInfo:nil];
                break;

            default:
                strMsg = [NSString stringWithFormat:@"支付失敗"];
                HQLog(@"錯誤,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                /** 發(fā)送支付失敗的通知 */
                [[NSNotificationCenter defaultCenter] postNotificationName:HQCancelPayNotification object:nil userInfo:nil];
                break;
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,570評論 2 379

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

  • 實現(xiàn)支付寶支付的準(zhǔn)備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后,支付寶會提供一些必要的數(shù)據(jù)給我們 商戶...
    Anson楊春安閱讀 8,243評論 0 6
  • 一.移動支付 什么叫移動支付:移動支付也稱為手機支付,就是允許用戶使用其移動終端(通常是手機)對所消費的商品或服務(wù)...
    川農(nóng)鑒黃師閱讀 1,921評論 8 16
  • 悠閑時光, 順便將開發(fā)過程中, 經(jīng)常使用到的一些功能, 記錄分享出來,比如支付!本想寫一篇銀聯(lián)支付,不過看了之前轉(zhuǎn)...
    樹根曰閱讀 1,253評論 0 6
  • 我天生對人名和數(shù)字的記憶最易忘記的,唯獨對氣息特別敏感,只要聞過一次就會記憶深刻,經(jīng)年不忘。 大約1...
    風(fēng)之末端閱讀 362評論 0 4
  • 這是今年5月的最后一天,清晨5點30分,我是被空調(diào)的冷氣凍醒的,火車車廂里人已剩的不多,有乘客直接掀開座位的套布,...
    大牙惠閱讀 297評論 4 3