iOS 微信支付開(kāi)發(fā)流程

一:介紹

項(xiàng)目中要用到支付功能窄刘,需要支付寶支付窥妇、支付寶網(wǎng)頁(yè)支付、微信支付娩践、銀聯(lián)支付活翩、Apple_pay,所以打算總結(jié)一下翻伺,方便以后的查閱材泄,也方便大家, 用到的地方避免再次被坑吨岭。
今天我們就主要介紹一下微信支付拉宗,其他支付也寫(xiě)了對(duì)應(yīng)教程,并且給出了連接。

集成前首先要看看文檔旦事,微信支付開(kāi)發(fā)文檔里面有詳細(xì)的字段和說(shuō)明魁巩。
微信支付是需要簽名的,跟支付寶一樣姐浮,可以在客戶端簽名谷遂,也可以在后臺(tái)簽名(當(dāng)然,為了安全還是推薦在服務(wù)器上做簽名卖鲤,邏輯也比較好理解)

更多iOS干貨Demo源碼獲取方法

關(guān)注 【網(wǎng)羅開(kāi)發(fā)】微信公眾號(hào)埋凯,選取需要的文章類別,根據(jù)序號(hào)便可領(lǐng)取扫尖。
網(wǎng)羅天下方法白对,方便你我開(kāi)發(fā),所有文檔會(huì)持續(xù)更新换怖,歡迎關(guān)注一起成長(zhǎng)甩恼!

二:業(yè)務(wù)流程

以下是交互時(shí)序圖,統(tǒng)一下單API沉颂、支付結(jié)果通知API和查詢訂單API等都涉及簽名過(guò)程条摸,調(diào)用都必須在商戶服務(wù)器端完成。

交互時(shí)序圖

商戶系統(tǒng)和微信支付系統(tǒng)主要交互說(shuō)明:

    1. 用戶在商戶APP中選擇商品铸屉,提交訂單钉蒲,選擇微信支付。
    1. 商戶后臺(tái)收到用戶支付單彻坛,調(diào)用微信支付統(tǒng)一下單接口顷啼。
    1. 統(tǒng)一下單接口返回正常的prepay_id,再按簽名規(guī)范重新生成簽名后昌屉,將數(shù)據(jù)傳輸給APP钙蒙。參與簽名的字段名為appid,partnerid间驮,prepayid躬厌,noncestr,timestamp竞帽,package扛施。
    1. 商戶APP調(diào)起微信支付。
    1. 商戶后臺(tái)接收支付通知屹篓。
    1. 商戶后臺(tái)查詢支付結(jié)果疙渣。

三:下載微信SDK

如果集成了友盟分享里的微信,那就不用下載,也不用配置環(huán)境抱虐,因?yàn)榕渲糜衙朔窒淼臅r(shí)候已經(jīng)把微信支付的環(huán)境都配置好了(包括框架昌阿,schema跳轉(zhuǎn),白名單)如果沒(méi)有集成過(guò)友盟分享那么請(qǐng)到微信開(kāi)放平臺(tái)下載SDK

下載微信SDK

建議把iOS頭文件和支付示例都下載下來(lái)

四:導(dǎo)入庫(kù)集成SDK

4.1 導(dǎo)入SDK庫(kù)

導(dǎo)入上面那個(gè)iOS頭文件和庫(kù)下載下載出來(lái)的SDK包的就行懦冰,然后需要鏈接上依賴庫(kù)灶轰,在Target —> BuildPhases —> Link Binary With Libraries— 點(diǎn)擊+號(hào) -> 搜索你需要的系統(tǒng)庫(kù)。

  • SystemConfiguration.framework
  • libz.tbd
  • libsqlite3.0.tbd
  • CoreTelephony.framework
  • QuartzCore.framework
導(dǎo)入SDK庫(kù)

4.2 設(shè)置URL Scheme

商戶在微信開(kāi)放平臺(tái)申請(qǐng)開(kāi)發(fā)APP應(yīng)用后刷钢,微信開(kāi)放平臺(tái)會(huì)生成APP的唯一標(biāo)識(shí)APPID笋颤,在APP端開(kāi)發(fā)步驟里面說(shuō)得很清楚了,需要填在URL Schemes這個(gè)地方内地。

URL Scheme

4.2 在Appdelegate中注冊(cè)APPID

首先要在Appdelegate中引用頭文件

//微信支付
#import "WXApi.h"

然后注冊(cè)APPID

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//    向微信終端注冊(cè)ID

    [WXApi registerApp:@"wxd930ea5d5a258f4f"];
    
    return YES;
}

在支付成功之后伴澄,支付結(jié)果返回,需要獲取url阱缓,也需要在Appdelegate中完成非凌,代碼如下:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    
    if ([url.host isEqualToString:@"safepay"]) {
        //跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
        }];
    }else if ([url.host isEqualToString:@"pay"]) {
        // 處理微信的支付結(jié)果
        [WXApi handleOpenURL:url delegate:self];
    }
    return YES;
}

// NOTE: 9.0以后使用新API接口
- (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) {
            NSLog(@"result = %@",resultDic);
        }];
    }else if ([url.host isEqualToString:@"pay"]) {
        // 處理微信的支付結(jié)果
        [WXApi handleOpenURL:url delegate:self];
    }
    return YES;
}

微信SDK自帶的方法敞嗡,處理從微信客戶端完成操作后返回程序之后的回調(diào)方法,顯示支付結(jié)果的:

-(void) onResp:(BaseResp*)resp
{
    //啟動(dòng)微信支付的response
    NSString *payResoult = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回結(jié)果,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢
        switch (resp.errCode) {
            case 0:
                payResoult = @"支付結(jié)果:成功航背!";
                break;
            case -1:
                payResoult = @"支付結(jié)果:失敽磴病!";
                break;
            case -2:
                payResoult = @"用戶已經(jīng)退出支付玖媚!";
                break;
            default:
                payResoult = [NSString stringWithFormat:@"支付結(jié)果:失敾唷!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                break;
        }
    }
}

4.3 調(diào)用支付接口

在調(diào)用微信支付類里面今魔,首先增加頭文件引用勺像。

#import "WXApi.h"

在調(diào)起支付的方法中,需要上傳的參數(shù)包括:appid涡贱、partid(商戶號(hào))咏删、prepayid(預(yù)支付訂單ID)惹想、noncestr(參與簽名的隨機(jī)字符串)问词、timestamp(參與簽名的時(shí)間戳)、sign(簽名字符串)這六個(gè)嘀粱。
在點(diǎn)擊支付的控制器中使用核心代碼來(lái)調(diào)起微信客戶端支付,這些個(gè)參數(shù)都是后臺(tái)傳給你的激挪。 加上了注釋,應(yīng)該很好理解的锋叨。代碼如下:

#pragma mark 微信支付方法
- (void)WechatPay{
    
    //需要?jiǎng)?chuàng)建這個(gè)支付對(duì)象
    PayReq *req   = [[PayReq alloc] init];
    //由用戶微信號(hào)和AppID組成的唯一標(biāo)識(shí)垄分,用于校驗(yàn)微信用戶
    req.openID = appid;
    // 商家id,在注冊(cè)的時(shí)候給的
    req.partnerId = partnerid;
    // 預(yù)支付訂單這個(gè)是后臺(tái)跟微信服務(wù)器交互后娃磺,微信服務(wù)器傳給你們服務(wù)器的薄湿,你們服務(wù)器再傳給你
    req.prepayId  = prepayid;
    // 根據(jù)財(cái)付通文檔填寫(xiě)的數(shù)據(jù)和簽名
    req.package  = package;
    // 隨機(jī)編碼,為了防止重復(fù)的,在后臺(tái)生成
    req.nonceStr  = noncestr;
    // 這個(gè)是時(shí)間戳豺瘤,也是在后臺(tái)生成的吆倦,為了驗(yàn)證支付的
    NSString * stamp = timestamp;
    req.timeStamp = stamp.intValue;
    // 這個(gè)簽名也是后臺(tái)做的
    req.sign = sign;
    //發(fā)送請(qǐng)求到微信,等待微信返回onResp
    [WXApi sendReq:req];
    
}

4.4 判斷手機(jī)是否安裝微信客戶端

在需要微信支付的地方調(diào)用封裝的類方法之后會(huì)跳轉(zhuǎn)到微信app,如果沒(méi)有安裝則沒(méi)有任何反應(yīng)坐求。這里需要注意蚕泽,因?yàn)闆](méi)有安裝微信,必須要提供webview的方式登錄微信來(lái)支付桥嗤,否則蘋(píng)果公司會(huì)拒絕應(yīng)用上架须妻。但是微信又不自帶webview的方式,(支付寶是自帶的)所以要判斷用戶有沒(méi)有安裝微信泛领,如果沒(méi)有安裝微信就不顯示微信支付這個(gè)按鈕荒吏。

// 判斷手機(jī)有沒(méi)有微信
    if ([WXApi isWXAppInstalled]) {
        wechatButton.hidden = NO;
    }else{
        wechatButton.hidden = YES;
    }

到這里微信支付就基本完成了,如果小伙伴們?cè)诩蛇^(guò)程中遇到什么問(wèn)題渊鞋,可以留言給我或者添加qq司倚,在線幫你解決。

后續(xù):常見(jiàn)問(wèn)題解決

  1. 如果支付完成后篓像,一直留在微信动知,那就檢查下URLType中的Scheme設(shè)置問(wèn)題。
  2. 能夠打開(kāi)微信客戶端员辩,但是打開(kāi)后只有中間一個(gè)白色的 “確定按鈕”盒粮,點(diǎn)擊后會(huì)回到客戶端上,如果是這樣奠滑,那應(yīng)該是prepayid 參數(shù)的問(wèn)題丹皱,過(guò)期了,或者不是真實(shí)的id宋税。
  3. 微信支付的單位是分
  4. 工程->build setttings -> 搜索other linker flags 添加-Objc -all_load 摊崭,運(yùn)行工程可能會(huì)崩潰,原因是程序沒(méi)有找到sdk庫(kù)杰赛。
  5. 白名單:不配置白名單也可以調(diào)起支付呢簸,如果調(diào)不起支付,查看是否是白名單的問(wèn)題乏屯。
    打開(kāi)工程里的info.plist文件 添加LSApplicationQueriesSchemes數(shù)組并添加wechat 和 weixin字符串根时。
    或者info.plist右鍵->source code打開(kāi)添加下面這段代碼
<key>LSApplicationQueriesSchemes</key>
<array><string>wechat</string>
  <string>weixin </string>
</array>
  1. 中文名的工程會(huì)報(bào)這個(gè)錯(cuò)誤,英文名則不會(huì)辰晕,這是因?yàn)槿鄙賃IKit庫(kù) 在WXApiObject.h里導(dǎo)入庫(kù)#import <UIKit/UIKit.h>蛤迎。

希望可以幫助大家
如果哪里有什么不對(duì)或者不足的地方,還望讀者多多提意見(jiàn)或建議
iOS技術(shù)交流群:668562416

源碼Demo獲取方法

關(guān)注「網(wǎng)羅開(kāi)發(fā)」公眾號(hào) 含友,有iOS demo替裆、RN 視頻以及demo校辩、Android demo等你領(lǐng)取。


小專欄:https://xiaozhuanlan.com/u/fanbaoying

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辆童,一起剝皮案震驚了整個(gè)濱河市召川,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胸遇,老刑警劉巖荧呐,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纸镊,居然都是意外死亡倍阐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)逗威,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)峰搪,“玉大人,你說(shuō)我怎么就攤上這事凯旭「懦埽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵罐呼,是天一觀的道長(zhǎng)鞠柄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嫉柴,這世上最難降的妖魔是什么厌杜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮计螺,結(jié)果婚禮上夯尽,老公的妹妹穿的比我還像新娘。我一直安慰自己登馒,他們只是感情好匙握,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著陈轿,像睡著了一般圈纺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上济欢,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天赠堵,我揣著相機(jī)與錄音,去河邊找鬼法褥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酬屉,可吹牛的內(nèi)容都是我干的半等。 我是一名探鬼主播揍愁,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杀饵!你這毒婦竟也來(lái)了莽囤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤切距,失蹤者是張志新(化名)和其女友劉穎朽缎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谜悟,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡话肖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葡幸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最筒。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔚叨,靈堂內(nèi)的尸體忽然破棺而出床蜘,到底是詐尸還是另有隱情,我是刑警寧澤蔑水,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布邢锯,位于F島的核電站,受9級(jí)特大地震影響搀别,放射性物質(zhì)發(fā)生泄漏弹囚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一领曼、第九天 我趴在偏房一處隱蔽的房頂上張望鸥鹉。 院中可真熱鬧,春花似錦庶骄、人聲如沸毁渗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灸异。三九已至,卻和暖如春羔飞,著一層夾襖步出監(jiān)牢的瞬間肺樟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工逻淌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留么伯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓卡儒,卻偏偏與公主長(zhǎng)得像田柔,于是被迫代替她去往敵國(guó)和親俐巴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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