概述
詳細
支付寶和微信都是業界的老大哥,相信大家都有所覺得文檔、SDK都是各種坑吧(純粹吐槽而已),這是繼上篇支付寶支付集成后接着的微信支付集成。

一、准備工作
1、微信商戶申請步驟
申請步驟: http://kf.qq.com/faq/120911VrYVrA150906F3qqY3.html
2、申請成功后說明
官方支付賬戶說明文檔: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
3、微信支付集成包
4、開發步驟
官方開發步驟文擋:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
二、微信支付集成
1、 添加微信支付SDK

2、 添加庫

3、項目設置APPID,在工程項目中添加商戶自己的APPID
商戶在微信開放平台申請開發APP應用后,微信開放平台會生成APP的唯一標識APPID。在Xcode中打開項目,設置項目屬性中的URL Schemes為您的APPID

4、iOS 9.0以上的系統如果要正常調起微信,還需要添加白名單,在工程項目的plist文件中添加

5、注冊APPID
商戶APP工程中引入微信lib庫和頭文件,調用API前,需要先向微信注冊您的APPID,代碼如下:
// 在appDelegate.m中,注冊微信應用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//向微信注冊
[WXApi registerApp:@"您的APPID"];
}
6、調起支付
商戶服務器生成支付訂單,先調用【統一下單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];
賬戶參數說明:

7、支付結果回調
照微信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;
}
}
}
8、在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;
}
9、在使用微信支付的當前控制器里, 調起微信支付,接收通知
// 微信支付
- (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);
// }];
}
三、運行效果及壓縮文件截圖
1、運行時的效果圖:

2、壓縮文件截圖:

3、項目文件截圖:

四、其他補充
目前是項目中直接操作, 在項目里補充上你們的后台接口請求,
具體可參考代碼, 項目則能夠直接運行!
如果需要微信支付, 請移步:iOS微信支付集成 http://www.demodashi.com/demo/10729.html
注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權
