iOS微信支付

(一)微信支付流程:

1377427-359d12bff546cf2f.png

簡略版的


屏幕快照 2017-11-16 10.05.20.png
詳細的支付過程

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

Tips1:
  • 2個返回結果:(8和9)
    1 )微信返回結果代表扣款成功(你微信的錢沒有了);
    2 )App返回結果代表真實的扣款成功(你的app后臺收到了錢);
    為了安全起見,應該以第2個為準,因為可能出現微信已經扣款,但是你的app還沒有收到錢的情況出現;
Tips2:
  • 調用微信支付前,需要下單、簽名等操作,以便獲取微信支付所必要的參數。為了提高安全性,下單、簽名操作一般是在后臺完成,在前臺做的話可能被捕獲該信息。

需要的參數包括:appid、partid(商戶號)、prepayid(預支付訂單ID)、noncestr(參與簽名的隨機字符串)、timestamp(參與簽名的時間戳)、sign(簽名字符串)這六個。

(二)iOS端的代碼

注1:其中前4步用戶是無法看到的。
上面是完整的一個支付的流程,但是對于iOS開發者來說,其實并沒有這么復雜,你需要做的就3步
1.注冊微信Appkey
2.從App服務器獲取預支付信息的Prepay_id,調起微信客戶端,完成支付。
3.設置微信回調代理,打開你的app;
4.接收回調信息,對回調結果進行處理。
注2:導入微信SDK我是使用Cocoapods做的,總體來說比較簡單,但是需要注意的是你需要在Linked Frameworks and Libraries 中導入CoreTelephone.framework,不然會出問題。

準備工作:注冊微信Appkey

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"測試demo"];
    return YES;
}

2.獲取服務器發來的prepayid和sign簽名等信息后調用下面的方法去喚起微信SDK支付

- (void)wxPay:(NSDictionary *)info{
    NSString *appid = info[@"appid"];
    BOOL isok = [WXApi registerApp:appid?:kWXAppID];
    if (isok) {
        NSLog(@"注冊微信成功");
    }else{
        NSLog(@"注冊微信失敗");
    }
    //構造支付請求
    PayReq *request = [[PayReq alloc]init];
    request.partnerId = [info objectForKey:@"partnerid"];
    request.prepayId = [info objectForKey:@"prepayid"];
    request.package = [info objectForKey:@"package"];
    request.nonceStr = [info objectForKey:@"noncestr"];
    request.timeStamp = [[info objectForKey:@"timestamp"] integerValue];
    request.sign = [info objectForKey:@"sign"];

//調用這個方法之后,app會調起微信客戶端(對應第5步)
    BOOL paySucceed  = [WXApi sendReq:request];
    if(paySucceed == NO){
        BSLog(@"支付失敗");
    }
}

2.微信回調代理設置,打開你的app

//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,)
     //處理微信通過URL啟動App時傳遞的數據,delegate代表在哪個類接收返回的請求,有時為了簡化AppDelegate可以delegate設置為一個單利類,在單獨的一個類處理微信回調的數據

     //這個方法調起之后在點擊返回商戶之后會打開你的app,(對應第9步)
        return  [WXApi handleOpenURL:url delegate:self];
}

4.微信回調信息接收的地方

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

注:第三步需要注意的是:在最新的系統中只有點擊微信界面的返回商戶才會執行(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options這個方法,所以還是需要在重新喚起app的方法中去服務器請求下支付信息。

http://www.lxweimin.com/p/1c1c834b6d52

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言:本篇文章目的在于梳理知識,鞏固思想,學習總結。有什么好的建議,都可以留言。互相促進!總觀,微信支付,也沒心思...
    麥穗0615閱讀 10,087評論 8 70
  • 最近公司需要開發支付功能,經過這兩天的工作成功集成了app微信支付、支付寶支付。本文主要講述微信支付的流程和在集成...
    予獨愛秋天的梅花閱讀 2,124評論 0 5
  • 微信支付的流程 注冊微信開放平臺,創建應用獲取appid,appSecret,申請支付功能,申請成功之后會返回一些...
    管家頗閱讀 1,552評論 2 5
  • 一:介紹 項目中要用到支付功能,需要支付寶支付、支付寶網頁支付、微信支付、銀聯支付、Apple_pay,所以打算總...
    Swift社區閱讀 10,538評論 5 25
  • 悠閑時光, 順便將開發過程中, 經常使用到的一些功能, 記錄分享出來,比如支付!本想寫一篇銀聯支付,不過看了之前轉...
    樹根曰閱讀 1,274評論 0 6