iOS開發集成微信支付

来源:http://www.cnblogs.com/allencelee/archive/2016/06/21/5603963.html
-Advertisement-
Play Games

首先需要理清楚流程: 雖然看起來有點多,但是理解起來並不複雜,跟我們平時手機上買東西是一樣的。我們客戶端需要做的就是 調起微信客戶端發起支付 顯示支付結果 集成過程 微信SDK下載 微信SDK下載 建議頭文件和示例都下載出來看看。(吐槽下,官方的示例難看死了,看的眼暈!註釋都沒幾個。。。鄙視之) 導 ...


首先需要理清楚流程

  1. 用戶使用APP客戶端,選擇商品下單。
  2. 商戶客戶端(就是你做的APP)將用戶的商品數據傳給商戶伺服器,請求生成支付訂單。
  3. 商戶後臺調用統一下單API向微信的伺服器發送請求,微信伺服器生成預付單,並生成一個prepay_id返回給商戶後臺。
  4. 商戶後臺將這個prepay_id返回給商戶客戶端。
  5. 用戶點擊確認支付,這時候商戶客戶端調用SDK打開微信客戶端,進行微信支付。
  6. 微信客戶端向微信伺服器發起支付請求並返回支付結果(他們之間交互用的就是prepay_id這個參數,微信的伺服器要驗證微信客戶端傳過去的參數是否跟第三步中生成的那個id一致)。
  7. 用戶輸入支付密碼後,微信客戶端提交支付授權,跟微信伺服器交互,完成支付
  8. 微信伺服器給微信客戶端發送支付結果提示,並非同步給商戶伺服器發送支付結果通知。
  9. 商戶客戶端通過支付結果回調介面查詢支付結果,並向後臺檢查支付結果是否正確,後臺返回支付結果。
  10. 商戶客戶端顯示支付結果,完成訂單,發貨。

雖然看起來有點多,但是理解起來並不複雜,跟我們平時手機上買東西是一樣的。我們客戶端需要做的就是

  • 調起微信客戶端發起支付
  • 顯示支付結果

集成過程

首先是要下載SDK

微信SDK下載


建議頭文件和示例都下載出來看看。(吐槽下,官方的示例難看死了,看的眼暈!註釋都沒幾個。。。鄙視之)

導入微信支付SDK庫

導入上面那個iOS頭文件和庫下載下載出來的SDK包的就行啦,我這裡的是SDK1.6.2. 然後需要鏈接上依賴庫,在Target —> BuildPhases —> Link Binary With Libraries— 點擊+號 -> 搜索你需要的系統庫。

  • SystemConfiguration.framework
  • libz.tbd
  • libsqlite3.0.tbd
  • CoreTelephony.framework
  • QuartzCore.framework
設置URL Scheme

在註冊微信平臺APP的時候,會給一個唯一識別標識符(APPID),在APP端開發步驟裡面說得很清楚了,需要填在URL Schemes這個地方,


URL scheme
在Appdelegate中註冊APPID

如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    /**
     *  向微信終端註冊ID,這裡的APPID一般建議寫成巨集,容易維護。@“測試demo”不需用管。這裡的id是假的,需要改這裡還有target裡面的URL Type
     */
    [WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"測試demo"];

    return YES;
}

 

處理微信通過URL啟動時傳遞的數據

//前面的兩個方法被iOS9棄用了,如果是Xcode7.2網上的話會出現無法進入進入微信的onResp回調方法,就是這個原因。本來我是不想寫著兩個舊方法的,但是一看官方的demo上寫的這兩個,我就也寫了。。。。
//9.0前的方法,為了適配低版本 保留
- (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];
}

//9.0後的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
    //這裡判斷是否發起的請求為微信支付,如果是的話,用WXApi的方法調起微信客戶端的支付頁面(://pay 之前的那串字元串就是你的APPID,)
        return  [WXApi handleOpenURL:url delegate:self];
}


//微信SDK自帶的方法,處理從微信客戶端完成操作後返回程式之後的回調方法,顯示支付結果的
-(void) onResp:(BaseResp*)resp
{  
    //啟動微信支付的response
    NSString *payResoult = [NSString stringWithFormat:@errcode:%d, resp.errCode];
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回結果,實際支付結果需要去微信伺服器端查詢
        switch (resp.errCode) {
            case 0:
                payResoult = @支付結果:成功!;
                break;
            case -1:
                payResoult = @支付結果:失敗!;
                break;
            case -2:
                payResoult = @用戶已經退出支付!;
                break;
            default:
                payResoult = [NSString stringWithFormat:@支付結果:失敗!retcode = %d, retstr = %@, resp.errCode,resp.errStr];
                break;
        }
    }
}

 

 
最重要的來了!!

調用微信支付前,需要下單、簽名等操作,以便獲取微信支付所必要的參數。為了提高安全性,下單、簽名操作一般是在後臺完成,在前臺做的話被捕獲改信息就不開心了。。。。。

需要的參數包括:appid、partid(商戶號)、prepayid(預支付訂單ID)、noncestr(參與簽名的隨機字元串)、timestamp(參與簽名的時間戳)、sign(簽名字元串)這六個。
在點擊支付的控制器中使用核心代碼來調起微信客戶端支付,這些個參數都是後臺傳給你的。 加上了註釋,應該很好理解的。

#pragma mark 微信支付方法
- (void)WXPay{

        //需要創建這個支付對象
        PayReq *req   = [[PayReq alloc] init];
        //由用戶微信號和AppID組成的唯一標識,用於校驗微信用戶
        req.openID = @"";

        // 商家id,在註冊的時候給的
        req.partnerId = @"";

        // 預支付訂單這個是後臺跟微信伺服器交互後,微信伺服器傳給你們伺服器的,你們伺服器再傳給你
        req.prepayId  = @"";

        // 根據財付通文檔填寫的數據和簽名
        //這個比較特殊,是固定的,只能是即req.package = Sign=WXPay
        req.package   = @"";

        // 隨機編碼,為了防止重覆的,在後臺生成
        req.nonceStr  = @"";

        // 這個是時間戳,也是在後臺生成的,為了驗證支付的
        NSString * stamp = @"";
        req.timeStamp = stamp.intValue;

        // 這個簽名也是後臺做的
        req.sign = @"";

        //發送請求到微信,等待微信返回onResp
        [WXApi sendReq:req];
}
這個JSON裡面的數據(上面的參數)就是後臺需要傳給你的,至於怎麼來,也有後臺的文檔,讓他去看下就行啦~~~

{
  "appid": "wxb4ba3c02aa476ea1",
  "noncestr": "d1e6ecd5993ad2d06a9f50da607c971c",
  "package": "Sign=WXPay",
  "partnerid": "10000100",
  "prepayid": "wx20160218122935e3753eda1f0066087993",
  "timestamp": "1455769775",
  "sign": "F6DEE4ADD82217782919A1696500AF06"
}

 

到這裡,不出意外的話應該都能正常的支付了。流程最重要,理解了就知道怎麼做了,強烈建議需要做的朋友們先理理思路,不要急著下手。


PS:這篇文章中,簽名都是在後臺做的,如果需要在你客戶端做,可以參考下這篇文章,和這篇文章,他們的簽名在客戶端做的,寫的也比較詳細了。

可能遇到的問題

1.如果支付完成後,一直留在微信,那就檢查下URLType中的Scheme設置問題。

2.能夠打開微信客戶端,但是打開後只有中間一個白色的 “確定按鈕”,點擊後會回到客戶端上,如果是這樣,那應該是prepayid 參數的問題,過期了,或者不是真實的id。代碼沒有問題的。特別註意的是,微信要兩次簽名,兩次~~~~

3.如果APP裡面使用了友盟或者ShareSDK做分享,那就不用再導入SDK了,否則會出現一些詭異的問題,例如無法調起手機微信客戶端、無法調起微信客戶端web頁面,調起了但是一閃而過。。。這都基本上都是因為分享的SDK裡面已經包括了微信的SDK。所以如果出現詭異的錯誤了看看是不是兩個衝突了!

4.微信支付的單位是分,被坑過的人都知道了。。。。哎,

如果在集成過程中遇到什麼問題,大家可以一起討論下,我記錄這些如果有什麼錯誤的話也請告訴我!謝謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UITextViewDelegate> { UITextView *p ...
  • 通常情況下,只有高端用戶才會經常用到終端應用。這並不意味著命令行非常難學,有的時候命令行可以輕鬆、快速的解決問題。相信所有Mac用戶都嘗試過命令行,今天為大家帶來9個非常實用的命令行操作。一些命令行需要安裝Xcode之後才可以實用,Xcode在Mac App Store中免費供應。1.使用caffe ...
  • 1.Android控制項架構下圖是UI界面架構圖,每個Activity都有一個Window對象,通常是由PhoneWindow類來實現的。PhoneWindow將DecorView作為整個應用視窗的根View,DecorView將屏幕分成兩部分:TitleView和ContentView。Conten ...
  • 之前學習swift時的個人筆記,根據github: "the swift programming language in chinese" 學習、總結,將重要的內容提取,加以理解後整理為學習筆記,方便以後查詢用。詳細可以參考 "the swift programming language in ch ...
  • 本篇涉及例子下載:Github 本篇講android 3.0引入的屬性動畫框架,上篇寫視圖動畫View Animation時就說過ViewAnimation的缺點,那就是動畫作用的是view本身的視覺部分,view實際屬性並沒有隨著動畫的改變而變化。很多時候就需要額外去出來由於動畫引起的事件不同步, ...
  • 安卓廣播分為兩類:1.普通廣播, broadcast,廣播發出之後所有滿足條件的應用都能獲取到廣播裡面的數據,缺點是應用獲取廣播中的數據修改之後不能傳遞給其它接收廣播的應用;2.有序廣播,orderbroadcast,廣播發出之後各應用根據應用的優先順序依次接收廣播,優先順序高的應用接收廣播之後修改的數 ...
  • “階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。 最近學到解析JSON格式的網路數據,而作業也要求自己找一個天氣預報的API地址,然後解析其中JSON格式的數據。可能是因為找的是免費的API地址,在百度APIStore里的,它那JSON返回示例的數據,跟我獲取之後 ...
  • iOS9全新的聯繫人相關框架——Contacts Framework 一、引言 在以前iOS開發中,涉及聯繫人相關的編程,代碼都非常繁瑣,並且框架的設計也不是Objective-C風格的,這使開發者用起來非常的難受。在iOS9中,apple終於解決了這個問題,全新的Contacts Framewor ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...