支付寶和微信都是業界的老大哥,相信你們都有所以爲文檔、SDK都是各類坑吧(純粹吐槽而已),這是繼上篇支付寶支付集成後接着的微信支付集成。php
一、微信商戶申請步驟html
申請步驟: http://kf.qq.com/faq/120911VrYVrA150906F3qqY3.htmljson
二、申請成功後說明api
官方支付帳戶說明文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=3_1安全
官方業務流程文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3服務器
三、微信支付集成包微信
四、開發步驟app
官方開發步驟文擋:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5函數
一、 添加微信支付SDK
二、 添加庫
三、項目設置APPID,在工程項目中添加商戶本身的APPID
商戶在微信開放平臺申請開發APP應用後,微信開放平臺會生成APP的惟一標識APPID。在Xcode中打開項目,設置項目屬性中的URL Schemes爲您的APPID
四、iOS 9.0以上的系統若是要正常調起微信,還須要添加白名單,在工程項目的plist文件中添加
五、註冊APPID
商戶APP工程中引入微信lib庫和頭文件,調用API前,須要先向微信註冊您的APPID,代碼以下:
// 在appDelegate.m中,註冊微信應用 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //向微信註冊 [WXApi registerApp:@"您的APPID"]; }
六、調起支付
商戶服務器生成支付訂單,先調用【統一下單API】生成預付單,獲取到prepay_id後將參數再次簽名傳輸給APP發起支付。如下是調起微信支付的關鍵代碼:
爲了安全性,如下字段最好從服務器去獲取
// 調起微信支付 PayReq *request = [[PayReq alloc] init]; /** 微信分配的公衆帳號ID -> APPID */ request.partnerId = APPID; /** 預支付訂單 從服務器獲取 */ request.prepayId = @"1101000000140415649af9fc314aa427"; /** 商家根據財付通文檔填寫的數據和簽名 <暫填寫固定值Sign=WXPay>*/ request.package = @"Sign=WXPay"; /** 隨機串,防重發 */ request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c"; /** 時間戳,防重發 */ request.timeStamp= @「1397527777"; /** 商家根據微信開放平臺文檔對數據作的簽名, 可從服務器獲取,也可本地生成*/ request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256"; /* 調起支付 */ [WXApi sendReq:request];
帳戶參數說明:
七、支付結果回調
照微信SDK Sample,在類實現onResp函數,支付完成後,微信APP會返回到商戶APP並回調onResp函數,開發者須要在該函數中接收通知,判斷返回錯誤碼,若是支付成功則去後臺查詢支付結果再展現用戶實際支付結果。
注意: 必定不能以客戶端返回做爲用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果爲準。
// 支付返回結果,實際支付結果須要去微信服務器端查詢 -(void)onResp:(BaseResp *)resp { if([resp isKindOfClass:[PayResp class]]){ switch (resp.errCode) { case WXSuccess:{ NSlog(@"支付成功"); // 發通知帶出支付成功結果 [[NSNotificationCenter defaultCenter] postNotificationName:ZLWXReturnSucceedPayNotification object:resp]; } break; default:{ NSlog(@「支付失敗:%d」,resp.errCode); // 發通知帶出支付失敗結果 [[NSNotificationCenter defaultCenter] postNotificationName:ZLWXReturnFailedPayNotification object:resp]; } break; } } }
八、在appDelegate.m中整理判斷回調
/** 這裏處理微信/支付寶支付完成以後跳轉回來 */ - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // 微信的支付回調 if ([url.host isEqualToString:@"pay"]) { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; } return YES; } // NOTE: 9.0之後使用新API接口 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { // 微信的支付回調 if ([url.host isEqualToString:@"pay"]) { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; } return YES; }
九、在使用微信支付的當前控制器裏, 調起微信支付,接收通知
// 微信支付 - (void)weChatPay { // 1.拼接請求參數 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"orderid"] = [self generateTradeNO]; params[@"userIp"] = [ZLGetIPTool deviceIPAdress]; // 獲取當前設備的ip // 2.發送請求 // TODO: 這裏用本身後臺接口替換請求便可 __weak __typeof(self) weakSelf = self; // [ZLHttpTool post:ZL_weChatPay_url params:params success:^(id json) { // ZLLog(@"微信支付返回參數接口 請求成功-%@", json); // if ([json[@"success"] isEqual:@(YES)]) { NSMutableDictionary *wechatDic = @{@"":@"", @"":@"", @"":@"", }.mutableCopy;// json[@"data"]; [WXApi registerApp:[wechatDic objectForKey:@"appid"]]; PayReq *request = [[PayReq alloc] init]; request.partnerId = [wechatDic objectForKey:@"mch_id"]; // 商家向財付通申請的商家id request.prepayId= [wechatDic objectForKey:@"prepay_id"]; // 支付訂單 request.package = @"Sign=WXPay"; // Sign=WXPay 商家根據財付通文檔填寫的數據和簽名 request.nonceStr= [wechatDic objectForKey:@"nonce_str"]; // 隨機串,防重發 request.timeStamp= [[wechatDic objectForKey:@"timestamp"] intValue]; //時間戳,防重發 request.sign= [wechatDic objectForKey:@"sign2"]; // 商家根據微信開放平臺文檔對數據作的簽名 二次簽名 if ([WXApi sendReq:request]) { [ZLNotificationCenter addObserver:self selector:@selector(paySucceed) name:ZLWXReturnSucceedPayNotification object:nil]; [ZLNotificationCenter addObserver:self selector:@selector(payFailed) name:ZLWXReturnFailedPayNotification object:nil]; } else { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付失敗" message:@"未安裝微信客戶端,請使用其餘支付方式" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"肯定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]; [alert addAction:okAction]; [self presentViewController:alert animated:YES completion:nil]; } // } else { // [MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]]; // } // [weakSelf.tableView reloadData]; // } failure:^(NSError *error) { // // [MBProgressHUD showError:@"暫無網絡,稍後再試"]; // ZLLog(@"微信支付返回參數接口 請求失敗-%@", error); // }]; }
一、運行時的效果圖:
二、壓縮文件截圖:
三、項目文件截圖:
目前是項目中直接操做, 在項目裏補充上大家的後臺接口請求,
具體可參考代碼, 項目則可以直接運行!
若是須要微信支付, 請移步:iOS微信支付集成 http://www.demodashi.com/demo/10729.html