iOS 開發(fā)之微信支付集成

兩個月前app中集成了微信支付功能,現(xiàn)在準(zhǔn)備看著項(xiàng)目中自己寫的代碼和之前參考的文章記錄下來,方便以后開發(fā)方便。之前是參考華之曦的文章履因。

1.準(zhǔn)備工作

先要在微信開放平臺注冊申請一個商戶號,好像是要300RMB盹愚,一般一到兩個禮拜栅迄,時間比較久,后臺弄的具體不是很清楚皆怕。

去微信公眾平臺下載微信SDK毅舆,將


1EF653AA-13F4-4C8E-8DC0-3A89FB44B169.png

這幾個拖到項(xiàng)目中去,readme可以不要(里面寫的是每個版本的修改什么的端逼,可以看一下)朗兵。將需要用上的庫導(dǎo)入


9C833149-1C8A-49A0-9F87-0E351700273E.png

(dylib的就是tbd的),具體流程還是不寫了吧顶滩,微信開放平臺——>資源中心>——接入指南——>iOS接入指南余掖,里面寫的很詳細(xì)了,在Info下面URL_type 添加url_scheme,填寫微信開放平臺注冊的APPID盐欺。

2.Appdelegate代碼

導(dǎo)入WXApi.h赁豆、WXApiObject頭文件,然后注冊
[WXApi registerApp:WX_AppID];
還有支付回調(diào)方法

-(void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[PayResp class]]) {
        PayResp*response=(PayResp*)resp;  // 微信終端返回給第三方的關(guān)于支付結(jié)果的結(jié)構(gòu)體
        switch (response.errCode) {
            case WXSuccess:
            {// 支付成功冗美,向后臺發(fā)送消息
                NSLog(@"支付成功");
                [[NSNotificationCenter defaultCenter] postNotificationName:@"WX_PaySuccess" object:nil];
            }
                break;
            case WXErrCodeCommon:
            { //簽名錯誤魔种、未注冊APPID、項(xiàng)目設(shè)置APPID不正確粉洼、注冊的APPID與設(shè)置的不匹配节预、其他異常等
                //                [MBProgressHUD showError:@"支付失敗"];
                NSLog(@"支付失敗");
            }
                break;
            case WXErrCodeUserCancel:
            { //用戶點(diǎn)擊取消并返回
                NSLog(@"取消支付");
                //                [MBProgressHUD showError:@"取消支付"];
            }
                break;
            case WXErrCodeSentFail:
            { //發(fā)送失敗
                NSLog(@"發(fā)送失敗");
                //                [MBProgressHUD showError:@"發(fā)送失敗"];
            }
                break;
            case WXErrCodeUnsupport:
            { //微信不支持
                NSLog(@"微信不支持");
                //                [MBProgressHUD showError:@"微信不支持"];
            }
                break;
            case WXErrCodeAuthDeny:
            { //授權(quán)失敗
                NSLog(@"授權(quán)失敗");
                //                [MBProgressHUD showError:@"授權(quán)失敗"];
            }
                break;
            default:
                break;
        }
    }
}

-(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{
    return [WXApi handleOpenURL:url delegate:self];
}

3.調(diào)起支付的頁面

將這幾個用宏定義


9E3B264C-8D16-4BEC-BBE0-5731839EABFE.png

還有獲取ip、轉(zhuǎn)換xml字符創(chuàng)属韧、簽名加密都是用的華之曦的工具類安拟,哈哈哈,這宵喂。糠赦。。锅棕。全是竊取別人的現(xiàn)有成果啊拙泽,好尷尬。哈哈哈

然后就是喚起支付的按鈕點(diǎn)擊事件了裸燎,還是看代碼

-(void)payClicked{
    
    NSString *appid,*mch_id,*nonce_str,*sign,*body,*out_trade_no,*total_fee,*spbill_create_ip,*notify_url,*trade_type,*partner;
    //應(yīng)用APPID
    appid = WX_AppID;
    //微信支付商戶號
    mch_id = MCH_ID;
    //產(chǎn)生隨機(jī)字符串
    nonce_str = [self generateTradeNO];
    body = _dic[@"xxx"];
    //訂單號
    out_trade_no = _dic[@"xxx"];
    //交易金額        交易金額1表示0.01顾瞻,所以乘100
    total_fee = @([_dic[@"xxx"]floatValue]*100).stringValue;
    
    //獲取本機(jī)ip   這個就要用到工具類了
    spbill_create_ip = [getIPhoneIP getIPAddress];
   //交易通知網(wǎng)站      問下后臺
    notify_url = @"xxxxxxxxx";
    trade_type = @"APP";
    partner = WX_ParterKey;
   //簽名   也是工具類
    DataMD5 *data = [[DataMD5 alloc]initWithAppid:appid mch_id:mch_id nonce_str:nonce_str partner_id:partner body:body out_trade_no:out_trade_no total_fee:total_fee spbill_create_ip:spbill_create_ip notify_url:notify_url trade_type:trade_type];
    sign = [data getSignForMD5];
    
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    [dic setValue:appid forKey:@"appid"];//公眾賬號ID
    [dic setValue:mch_id forKey:@"mch_id"];//商戶號
    [dic setValue:nonce_str forKey:@"nonce_str"];//隨機(jī)字符串
    [dic setValue:sign forKey:@"sign"];//簽名
    [dic setValue:body forKey:@"body"];//商品描述
    [dic setValue:out_trade_no forKey:@"out_trade_no"];//訂單號
    [dic setValue:total_fee forKey:@"total_fee"];//金額
    [dic setValue:spbill_create_ip forKey:@"spbill_create_ip"];//終端IP
    [dic setValue:notify_url forKey:@"notify_url"];//通知地址
    [dic setValue:trade_type forKey:@"trade_type"];//交易類型
    // 轉(zhuǎn)換成xml字符串
    NSString *string = [dic XMLString];
    [self http:string];
    
}


#pragma mark - 拿到轉(zhuǎn)換好的xml發(fā)送請求
- (void)http:(NSString *)xml {
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    MBProgressHUD *_hud = [MBProgressHUD showHUDAddedTo:delegate.window animated:YES];
    _hud.labelText = @"正在獲取支付訂單...";
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //這里傳入的xml字符串只是形似xml,但是不是正確是xml格式德绿,需要使用af方法進(jìn)行轉(zhuǎn)義
    manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
    [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
   //這個是統(tǒng)一下單那個api
    [manager.requestSerializer setValue:@"https://api.mch.weixin.qq.com/pay/unifiedorder" forHTTPHeaderField:@"SOAPAction"];
    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
        return xml;
    }];
    //發(fā)起請求
    [manager POST:@"https://api.mch.weixin.qq.com/pay/unifiedorder" parameters:xml progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding] ;
        NSLog(@"responseString is %@",responseString);
        //將微信返回的xml數(shù)據(jù)解析轉(zhuǎn)義成字典
        NSDictionary *dic = [NSDictionary dictionaryWithXMLString:responseString];
        //判斷返回的許可
        if ([[dic objectForKey:@"result_code"] isEqualToString:@"SUCCESS"] &&[[dic objectForKey:@"return_code"] isEqualToString:@"SUCCESS"] ) {
            //發(fā)起微信支付朋其,設(shè)置參數(shù)
            PayReq *request = [[PayReq alloc] init];
            request.openID = [dic objectForKey:@"appid"];
            request.partnerId = [dic objectForKey:@"mch_id"];
            request.prepayId= [dic objectForKey:@"prepay_id"];
            request.package = @"Sign=WXPay";
            request.nonceStr= [dic objectForKey:@"nonce_str"];
            //將當(dāng)前事件轉(zhuǎn)化成時間戳
            NSDate *datenow = [NSDate date];
            NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
            UInt32 timeStamp =[timeSp intValue];
            request.timeStamp = timeStamp;
            // 簽名加密
            DataMD5 *md5 = [[DataMD5 alloc] init];
            request.sign=[md5 createMD5SingForPay:request.openID partnerid:request.partnerId prepayid:request.prepayId package:request.package noncestr:request.nonceStr timestamp:request.timeStamp];
            // 調(diào)用微信
            [WXApi sendReq:request];
            //            [MBProgressHUD hideHUD];
            
        }else{
            //            LXLog(@"參數(shù)不正確,請檢查參數(shù)");
            //            [MBProgressHUD hideHUD];
            //            [MBProgressHUD showError:@"支付錯誤脆炎!"];
            _hud.labelText = @"支付錯誤!";
        }
        [_hud hide:YES afterDelay:0.5];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        _hud.labelText = @"請檢查網(wǎng)絡(luò)連接";
        [_hud hide:YES afterDelay:0.5];
    }];
    
}

- (NSString *)generateTradeNO {
    static int kNumber = 15;
    
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned)time(0));
    for (int i = 0; i < kNumber; i++) {
        unsigned index = rand() % [sourceStr length];
        NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
        [resultStr appendString:oneStr];
    }
    return resultStr;
}

-(void)paysuccess{

    for (UIViewController *temp in self.navigationController.viewControllers) {
        if ([temp isKindOfClass:[要跳轉(zhuǎn)的頁面 class]])
        {
            [self.navigationController popToViewController:temp animated:YES];
        }
    }
}

-(void)dealloc{
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}

因?yàn)閍ppdelegate里面支付回調(diào)里支付成功發(fā)送通知了氓辣,這里監(jiān)聽通知做處理秒裕,dealloc刪除。

DataMD5這個工具類中要拼接商戶密匙

2DB17843-0F5E-4FE3-91B3-1D0B80AD3144.png

好像就這樣了钞啸,還是要多看官方SDK吧几蜻,之前看集成教程都是看不懂的,看了官方SDK之后再看教程就好了体斩。記錄下來加深一下印象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梭稚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子絮吵,更是在濱河造成了極大的恐慌弧烤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬敲,死亡現(xiàn)場離奇詭異暇昂,居然都是意外死亡莺戒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門急波,熙熙樓的掌柜王于貴愁眉苦臉地迎上來从铲,“玉大人,你說我怎么就攤上這事澄暮∶危” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵泣懊,是天一觀的道長伸辟。 經(jīng)常有香客問我,道長嗅定,這世上最難降的妖魔是什么自娩? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮渠退,結(jié)果婚禮上忙迁,老公的妹妹穿的比我還像新娘。我一直安慰自己碎乃,他們只是感情好姊扔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梅誓,像睡著了一般恰梢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梗掰,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天嵌言,我揣著相機(jī)與錄音,去河邊找鬼及穗。 笑死摧茴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埂陆。 我是一名探鬼主播苛白,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焚虱!你這毒婦竟也來了购裙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹃栽,失蹤者是張志新(化名)和其女友劉穎躏率,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禾锤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年私股,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恩掷。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡倡鲸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黄娘,到底是詐尸還是另有隱情峭状,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布逼争,位于F島的核電站优床,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏誓焦。R本人自食惡果不足惜胆敞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杂伟。 院中可真熱鬧移层,春花似錦、人聲如沸赫粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽越平。三九已至频蛔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秦叛,已是汗流浹背晦溪。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挣跋,地道東北人尼变。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像浆劲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哀澈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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

  • 在被支付寶牌借、銀聯(lián)坑過之后,發(fā)現(xiàn)其實(shí)微信支付的集成并沒有想象中的那么困難割按,像支付寶那樣簡單地調(diào)用個方法就行膨报,重要的難...
    petry閱讀 703評論 2 2
  • 前言:本篇文章目的在于梳理知識,鞏固思想,學(xué)習(xí)總結(jié)现柠。有什么好的建議院领,都可以留言」环裕互相促進(jìn)比然!總觀,微信支付周循,也沒心思...
    麥穗0615閱讀 10,043評論 8 70
  • 首先需要理清楚流程: 1强法、用戶使用APP客戶端,選擇商品下單湾笛。 2饮怯、商戶客戶端(就是你做的APP)將用戶的商品數(shù)據(jù)...
    _____七年砍柴閱讀 1,444評論 1 7
  • 實(shí)現(xiàn)支付寶支付的準(zhǔn)備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后嚎研,支付寶會提供一些必要的數(shù)據(jù)給我們 商戶...
    Anson楊春安閱讀 8,204評論 0 6
  • 這兩天蓖墅,隨緣叔一直在吃自己的無碳飲食。突然想到還有任務(wù)沒有完成临扮,匆匆忙忙在家附近找了一下有沒有沙拉可以吃论矾。 大眾點(diǎn)...
    羅隨緣閱讀 409評論 5 4