iOS 微信支付開發流程

一:介紹

項目中要用到支付功能,需要支付寶支付支付寶網頁支付、微信支付、銀聯支付Apple_pay,所以打算總結一下,方便以後的查閱,也方便大家, 用到的地方避免再次被坑。
今天我們就主要介紹一下微信支付,其他支付也寫了對應教程,並且給出了連接。

集成前首先要看看文檔,微信支付開發文檔裏面有詳細的字段和說明。
微信支付是需要簽名的,跟支付寶一樣,可以在客戶端簽名,也可以在後臺簽名(當然,爲了安全還是推薦在服務器上做簽名,邏輯也比較好理解)

二:業務流程

以下是交互時序圖,統一下單API、支付結果通知API和查詢訂單API等都涉及簽名過程,調用都必須在商戶服務器端完成。

交互時序圖

商戶系統和微信支付系統主要交互說明:

  • 1.用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
  • 2.商戶後臺收到用戶支付單,調用微信支付統一下單接口。
  • 3.統一下單接口返回正常的prepay_id,再按簽名規範重新生成簽名後,將數據傳輸給APP。參與簽名的字段名爲appid,partnerid,prepayid,noncestr,timestamp,package。
  • 4.商戶APP調起微信支付。
  • 5.商戶後臺接收支付通知。
  • 6.商戶後臺查詢支付結果。

三:下載微信SDK

如果集成了友盟分享裏的微信,那就不用下載,也不用配置環境,因爲配置友盟分享的時候已經把微信支付的環境都配置好了(包括框架,schema跳轉,白名單)如果沒有集成過友盟分享那麼請到微信開放平臺下載SDK

下載微信SDK

建議把iOS頭文件和支付示例都現在下來

四:導入庫集成SDK

4.1 導入SDK庫

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

  • SystemConfiguration.framework
  • libz.tbd
  • libsqlite3.0.tbd
  • CoreTelephony.framework
  • QuartzCore.framework

導入SDK庫

4.2 設置URL Scheme

商戶在微信開放平臺申請開發APP應用後,微信開放平臺會生成APP的唯一標識APPID,在APP端開發步驟裏面說得很清楚了,需要填在URL Schemes這個地方。

URL Scheme

4.2 在Appdelegate中註冊APPID

首先要在Appdelegate中引用頭文件

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

然後註冊APPID

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

//    向微信終端註冊ID

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

在支付成功之後,支付結果返回,需要獲取url,也需要在Appdelegate中完成,代碼如下:

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

微信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;
        }
    }
}

4.3 調用支付接口

在調用微信支付類裏面,首先增加頭文件引用。

#import "WXApi.h"

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

#pragma mark 微信支付方法
- (void)WechatPay{
    
    //需要創建這個支付對象
    PayReq *req   = [[PayReq alloc] init];
    //由用戶微信號和AppID組成的唯一標識,用於校驗微信用戶
    req.openID = appid;
    // 商家id,在註冊的時候給的
    req.partnerId = partnerid;
    // 預支付訂單這個是後臺跟微信服務器交互後,微信服務器傳給你們服務器的,你們服務器再傳給你
    req.prepayId  = prepayid;
    // 根據財付通文檔填寫的數據和簽名
    req.package  = package;
    // 隨機編碼,爲了防止重複的,在後臺生成
    req.nonceStr  = noncestr;
    // 這個是時間戳,也是在後臺生成的,爲了驗證支付的
    NSString * stamp = timestamp;
    req.timeStamp = stamp.intValue;
    // 這個簽名也是後臺做的
    req.sign = sign;
    //發送請求到微信,等待微信返回onResp
    [WXApi sendReq:req];
    
}

4.4 判斷手機是否安裝微信客戶端

在需要微信支付的地方調用封裝的類方法之後會跳轉到微信app,如果沒有安裝則沒有任何反應。這裏需要注意,因爲沒有安裝微信,必須要提供webview的方式登錄微信來支付,否則蘋果公司會拒絕應用上架。但是微信又不自帶webview的方式,(支付寶是自帶的)所以要判斷用戶有沒有安裝微信,如果沒有安裝微信就不顯示微信支付這個按鈕。

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

到這裏微信支付就基本完成了,如果小夥伴們在集成過程中遇到什麼問題,可以留言給我或者添加qq,在線幫你解決。

後續:常見問題解決

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

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

3.微信支付的單位是分。

4.工程->build setttings -> 搜索other linker flags 添加-Objc -all_load ,運行工程可能會崩潰,原因是程序沒有找到sdk庫。

5.白名單:不配置白名單也可以調起支付,如果調不起支付,查看是否是白名單的問題。
打開工程裏的info.plist文件 添加LSApplicationQueriesSchemes數組並添加wechat 和 weixin字符串。
或者info.plist右鍵->source code打開添加下面這段代碼

<key>LSApplicationQueriesSchemes</key>
<array><string>wechat</string>
  <string>weixin </string>
</array>

6.中文名的工程會報這個錯誤,英文名則不會,這是因爲缺少UIKit庫 在WXApiObject.h裏導入庫

#import <UIKit/UIKit.h>

希望可以幫助大家
如果哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
iOS技術交流羣:668562416

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章