close
X

iOS 微信和支付寶的最新整理(客戶端和後臺兩種demo)


一.微信支付

前提:在微信開發者平臺註冊APP這樣的事一般的是經理給你做好的,這個可以忽略,如果需要做的話,可以參考別人的這篇文章,微信支付沒有想象的那麼困難,下面我會寫兩種:一種在客戶端(app)完成,一種在後臺完成

  • 1.開發前你需要看看微信開發的文件和微信的app開發步驟
    微信的支付互動圖

    微信的支付互動圖

  • 2.先要理清楚支付的流程(下面的過程雖然複雜但是支付時很簡單,稍後會採用客戶端後臺的兩種方式去講解,也會有demo展示):

  • 3.客戶端需要做的是呼叫支付,顯示支付結果

    客戶端需要做的是呼叫支付,顯示支付結果

  • 4.下面開始講解整合微信支付


    • 1.先對微信SDK的下載拖進工程

    微信SDK的下載

    • 2.匯入微信支付SDK庫
      Target —> BuildPhases —> Link Binary With Libraries— 點選+號 -> 搜尋你需要的系統庫。

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

        匯入微信支付SDK庫

    • 3.匯入WechatTool

      匯入WechatTool

    • 4.設定URL Scheme


      設定URL Scheme

    • 5.在Appdelegate中註冊APPID

       - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [WXApi registerApp:MXWechatAPPID];    return YES; }// NOTE: 9.0以後使用新API介面- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{      if ([url.host isEqualToString:@"safepay"]) {          NSLog(@"這裡做支付寶操作");      }else{        return  [WXApi handleOpenURL:url delegate:[JKApiManager sharedManager]];      }    return YES;}#pragma mark - 微信支付回撥- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{    return [WXApi handleOpenURL:url delegate:[JKApiManager sharedManager]];}
    • 6.在使用的地方呼叫(你需要把一些引數傳進去6個)

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

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

        //發起微信支付

        [JKWechatPayHandler jumpToWxPay];
    • 7.下面開始講解後臺來做操作給我們生成上面的六個引數以及新的呼叫

      • 1.遵守協定WXApiDelegate

      • 2.在AppDelegate裡面呼叫

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [WXApi registerApp:MXWechatAPPID];    return YES;}// NOTE: 9.0以後使用新API介面- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{     if ([url.host isEqualToString:@"safepay"]) {           NSLog(@"這裡做支付寶操作"); }else{   /*    *  後臺生成六個引數呼叫時    */    // return  [WXApi handleOpenURL:url delegate:self];   /*    *  app自己生成六個引數呼叫時    */   return  [WXApi handleOpenURL:url delegate:self];    }   return YES; }#pragma mark - 微信支付回撥- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{   /*    *  後臺生成六個引數呼叫時    */    // return  [WXApi handleOpenURL:url delegate:self];    /*     *  app自己生成六個引數呼叫時     */    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 = @"JK支付結果:成功!";             NSLog(@"%@",payResoult);          break;          case -1:             payResoult = @"JK支付結果:失敗!";             NSLog(@"%@",payResoult);          break;          case -2:            payResoult = @"JK使用者已經退出支付!";            NSLog(@"%@",payResoult);         break;        default:           payResoult = [NSString stringWithFormat:@"JK支付結果:失敗!retcode = %d, retstr = %@", resp.errCode,resp.errStr];           NSLog(@"%@",payResoult);         break;       }    }}
        • 3.在使用時呼叫

          /* *  自己寫的支付 */ - (void)WXPay{ 在這裡把價格和商品的資訊傳送給伺服器伺服器會生成上面的6個引數(我們後臺生成的是一個字典,裡面是6個鍵值,對應的是6個引數值)在此呼叫下面的方法傳到下面去 } -(void)payDictionary:(NSDictionary *)dict{   //需要建立這個支付對象      PayReq *req   = [[PayReq alloc] init];   //由使用者微訊號和AppID組成的唯一標識,用於校驗微信使用者      req.openID = [NSString stringWithFormat:@"%@",dict[@"appid"]];   // 商家id,在註冊的時候給的      req.partnerId = [NSString stringWithFormat:@"%@",dict[@"partnerid"]];   // 預支付訂單這個是後臺跟微信伺服器互動後,微信伺服器傳給你們伺服器的,你們伺服器再傳給你      req.prepayId  = [NSString stringWithFormat:@"%@",dict[@"prepayid"]];   // 根據財付通文件填寫的資料和簽名   //這個比較特殊,是固定的,只能是即req.package = Sign=WXPay      req.package = @"Sign=WXPay";   // 隨機編碼,為了防止重複的,在後臺生成      req.nonceStr  = [NSString stringWithFormat:@"%@",dict[@"noncestr"]];   // 這個是時間戳,也是在後臺生成的,為了驗證支付的       NSString * stamp = [NSString stringWithFormat:@"%@",dict[@"timestamp"]];       req.timeStamp = stamp.intValue;   // 這個簽名也是後臺做的      req.sign = [NSString stringWithFormat:@"%@",dict[@"sign"]];   //傳送請求到微信,等待微信返回onResp   [WXApi sendReq:req];  }
        • 4.支付成功與否在AppDelegate裡面會有微信的回撥可以看出支付成功還是失敗

  • 5.下面奉上兩個demo,裡面有執行除錯 偵錯的說明,在圖片裡面有說明
    微信的兩種支付方式demo 密碼: tp8q

  • 6.你可能遇到的問題

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

    • 2.能夠開啟微信客戶端,但是開啟後只有中間一個白色的 「確定按鈕」,點選後會回到客戶端上,如果是這樣,那應該是prepayid 引數的問題,過期了,或者不是真實的id。程式碼沒有問題的。特別注意的是,微信要兩次簽名

    • 3.微信支付的部門是分

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

    二.支付寶支付
  • 1.支付寶的問題大家可以參考我的另外一篇文章支付寶的整合以及詳解

  • 2.於此同時奉上支付寶的兩個demo,一個是客戶端(app做操作的),一個是後臺對訂單加密簽約等等做操作的,不懂得可以加群群號:584599353或者私信我一起交流成長

    客戶端後臺的兩種操作的demo 密碼: djgu

    喜歡的話給個喜歡!!!!謝謝


分享是一種美德,喜歡就幫我們讚一下支持吧~

為你推薦