最近的一個項目涉及到支付,這裏就先說一下微信支付,像微信開發者申請,APP申請相信大家都非常熟悉,設計到支付,還需要申請支付功能,按照微信所要求的提供相關材料即可,接下來就等待審覈結果吧。
微信支付流程及注意事項:
一.所需導入的類庫
1.導入微信SDK
直接將微信SDK拉入工程即可,若使用了其他第三方如友盟,則可以忽略,因爲友盟已經包含微信支付所需的相關文件,如下圖
2.導入需要類庫:根據微信開發文檔
Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
UIKit.framework
Foundation.framework
// 微信官方的庫
libWeChatSDK.a
二.注意事項
1.urlschemes 的設置
2.微信app的白名單加入
如果APP只涉及支付,不涉及第三方登錄分享,這兩個切記不要忘記填寫
三.所需更改的文件
1.AppDelegate.h
導入#import "WXApi.h"當然還有<WXApiDelegate>
在didFinishLaunchingWithOptions 方法中初始化微信支付
[WXApi registerApp:@"你在微信開發者平臺註冊的APPId"];
在以下方法回調:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
#pragma mark - WXApiDelegate
-(void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) {
PayResp*response=(PayResp*)resp; // 微信終端返回給第三方的關於支付結果的結構體
switch (response.errCode) {
case WXSuccess:
{// 支付成功,向後臺發送消息
NSLog(@"支付成功");
[[NSNotificationCenter defaultCenter] postNotificationName:@"WeiXinPaysucceed" object:nil userInfo:nil];
}
break;
case WXErrCodeCommon:
{ //簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等
[SVProgressHUD showErrorWithStatus:@"支付失敗"];
NSLog(@"支付失敗");
}
break;
case WXErrCodeUserCancel:
{ //用戶點擊取消並返回
NSLog(@"取消支付");
[SVProgressHUD showErrorWithStatus:@"取消支付"];
}
break;
case WXErrCodeSentFail:
{ //發送失敗
NSLog(@"發送失敗");
[SVProgressHUD showErrorWithStatus:@"發送失敗"];
}
break;
case WXErrCodeUnsupport:
{ //微信不支持
NSLog(@"微信不支持");
[SVProgressHUD showErrorWithStatus:@"微信不支持"];
}
break;
case WXErrCodeAuthDeny:
{ //授權失敗
NSLog(@"授權失敗");
[SVProgressHUD showErrorWithStatus:@"授權失敗"];
}
break;
default:
break;
}
}
}
2.在支付頁面
導入#import "WXApi.h",#import "WXApiObject.h",注意代理<WXApiDelegate>
在微信支付的地方調用,所需參數有服務器提供
PayReq *request = [[PayReq alloc]init];
//商家id
request.partnerId = MCH_id;
request.partnerId = self.payDic[@"partnerid"];
//訂單id
request.prepayId = self.payDic[@"prepayid"];
//擴展字段(官方文檔:暫時填寫固定值)
request.package = @"Sign=WXPay";
//隨機字符串 noncestr
request.nonceStr = self.payDic[@"noncestr"];
//時間戳
request.timeStamp = [self.payDic[@"timestamp"] intValue];
//
//sign參數(很經常出現的問題:就是調起支付到微信那邊只出現一個確定按鈕,單擊確認按鈕直接返回到app,出現這個問題100%是sign參數的問題)
//參數依次是: appid_key、partnerid_key、prepayid_key、固定值Sign=WXPay、預支付的隨機數(跟上面得到預支付訂單的隨機數要一致)、支付時間(秒)
// request.sign = self.payDic[@"sign"];
request.sign = self.payDic[@"sign"];
NSLog(@"sign是%@",request.sign);
//調用微信支付
[WXApi sendReq:request];
不管是否支付,都會向服務器返回一條信息在AppDelegate.m微信代理方法中可詳細查看
回調中errCode值列表:
名稱 | 描述 | 解決方案 |
---|---|---|
0 | 成功 | 展示成功頁面 |
-1 | 錯誤 | 可能的原因:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等。 |
-2 | 用戶取消 | 無需處理。發生場景:用戶不支付了,點擊取消,返回APP。 |
四.支付流程解析
商戶系統和微信支付系統主要交互說明:
步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
步驟2:商戶後臺收到用戶支付單,調用微信支付統一下單接口。參見【統一下單API】。
步驟3:統一下單接口返回正常的prepay_id,再按簽名規範重新生成簽名後,將數據傳輸給APP。參與簽名的字段名爲appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式爲Sign=WXPay
步驟4:商戶APP調起微信支付。api參見本章節【app端開發步驟說明】
步驟5:商戶後臺接收支付通知。api參見【支付結果通知API】
步驟6:商戶後臺查詢支付結果。,api參見【查詢訂單API】
交互時序圖