首先你需要申請微信支付,申請相關(guān)支付參考:
申請資料填寫界面預(yù)覽
申請到微信支付相關(guān)以后身笤,下面這些東西對我們很重要。
前提條件:
//APPID 一般以wx開頭
static NSString *const JHAppID = @"APPID";
//appsecret
static NSString *const JHAppSecret = @"appsecret";
//商戶號数苫,填寫商戶對應(yīng)參數(shù)
static NSString *const JHMchID = @"商戶號";
//商戶API密鑰仪壮,填寫相應(yīng)參數(shù)
static NSString *const JHPartnerID = @"商戶API密鑰";
// 預(yù)支付請求路徑固定可以不改變
static NSString *const JHPrePayURL = @"https://api.mch.weixin.qq.com/pay/unifiedorder";
// // 支付回調(diào)頁面(異步) (https://api.mch.weixin.qq.com/pay/unifiedorder)(異步處理支付調(diào)用返回數(shù)據(jù))
static NSString *const JHPayNotifyURL = @"支付回調(diào)頁面";
注意:
微信支付的單位為分处面,整數(shù)類型才可以(int)
流程簡述
支付要保證安全性斤斧,就要使用加密捂刺。微信當然也是這樣,微信為了防止中間有人加入竊取信息或者改變價格囚痴。有自己的加密方式——生成預(yù)支付Id叁怪,我們通過封裝數(shù)據(jù)形成XML格式(中間加密)以字符串類型傳給微信,獲取預(yù)支付Id深滚。緊接著奕谭,獲取以后通過預(yù)支付等信息再次加密。APP將參數(shù)傳給微信痴荐,付款成功血柳!回調(diào)信息說明支付情況。(關(guān)于加密具體怎么實現(xiàn)我會在下面詳細說明)生兆。接入步驟以及代碼
1难捌、在做微信支付以前導(dǎo)入:
libc++.tbd
libsqlite3.0.tbd
libz.tbd
SystemConfiguration.framework
CoreTelephony.framework
Security.framework
2鸦难、在AppDelegate 的導(dǎo)入頭文件 #import "WXApi.h" 掛上代理 WXApiDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//這里是你自己寫的一些其他代碼 實例化window 設(shè)置根視圖云云
[WXApi registerApp:@"APPID" withDescription:@"應(yīng)用描述"];
}
//支付回調(diào)
- (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];
}
#pragma mark 微信回調(diào)的代理方法
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) {
PayResp *response = (PayResp *)resp;
switch (response.errCode) {
case WXSuccess:
NSLog(@"suceess");
break;
default:
NSLog(@"failed");
break;
}
}
}
如果集成里支付寶以及微信支付等 根吁,走的回調(diào)方法是相同的 ,我們是通過 回調(diào)中字符串sourceApplication 進行判斷的 例如支付寶支付 為com.alipay.iphoneclient 微信支付為 com.tencent.xin
3合蔽、在targets的info中添加 urltypes添加一個在 identifier自己起一個名稱(最好軟件英文名字) 在 URL schemes 中寫下APPID
4击敌、觸發(fā)支付
觸發(fā)支付,就要對自己的訂單號價格等進行加密 在這里就可以分成兩種加密 拴事,一種是在APP端進行加密沃斤,第二種是在服務(wù)端進行加密。一般使用的在服務(wù)端加密比較安全挤聘。一個個進行說明。
- 服務(wù)端進行加密
服務(wù)端加密我們不需要知道具體加密怎么進行的捅彻。我們只是需要將所需參數(shù)傳過去 我是用的AFN
//初始化一個請求管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//接口地址
NSString *urlString = [NSString stringWithFormat:@"%@%@",@"地址頭",@"其他"];
//參數(shù)字典
NSDictionary *parameters =@{@"fcode": @"賬號",
@"password": @"密碼",@"out_trade_no":@"訂單號",@"total_fee":@"金額(分為單位)",@"attach":@"商品詳情"};
//post請求
[manager POST:urlString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
//返回狀態(tài)值1表示成功 0表示失敗
NSString *state=responseObject[@"state"];
//預(yù)支付ID
NSString *prepayid=responseObject[@"prepayid"];
//返回文字信息成功或者失敗
NSString *message=responseObject[@"message"];
//請求數(shù)據(jù)成功
if ([state intValue]==1) {
//支付信息
PayReq* req = [[PayReq alloc] init];
//APPID
req.openID = [responseObject objectForKey:@"appid"];
//商戶號
req.partnerId = [responseObject objectForKey:@"partnerid"];
//預(yù)支付ID
req.prepayId = [responseObject objectForKey:@"prepayid"];
//時間戳
req.nonceStr = [responseObject objectForKey:@"noncestr"];
//支付類型(為固定字符串:Sign=WXPay)
req.timeStamp = [[responseObject objectForKey:@"timestamp"] intValue];
//加密串
req.package = [responseObject objectForKey:@"package"];
//預(yù)支付ID
req.sign = [responseObject objectForKey:@"sign"];
// 發(fā)起微信支付
[WXApi sendReq:req];;
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
后臺沒有加密錯誤组去,那么會跳轉(zhuǎn)到微信上進行支付。
- 微信支付成功以后 要通知服務(wù)端以及APP端 服務(wù)器是通過回調(diào)地址進行操作,而對于App端通過Appdelegate中回調(diào)函數(shù)調(diào)用微信代理步淹。
- (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];
}
#pragma mark 微信回調(diào)的代理方法
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) {
PayResp *response = (PayResp *)resp;
NSString *message;
switch (response.errCode) {
case WXSuccess:
{ message=@"支付成功";
[[NSNotificationCenter defaultCenter] postNotificationName:APP_PAY_SUCCESS object:nil];
}
break;
case WXErrCodeCommon:
//普通錯誤類型
message=@"支付錯誤";
break;
case WXErrCodeUserCancel:
//用戶點擊取消并且返回
message=@"您取消了交易";
break;
case WXErrCodeSentFail:
//發(fā)送失敗
message=@"信息發(fā)送失敗";
break;
case WXErrCodeAuthDeny:
//授權(quán)失敗
message=@"授權(quán)失敗";
break;
case WXErrCodeUnsupport:
//微信不不支持
message=@"您的微信版本過低";
break;
default:
NSLog(@"failed");
break;
}
}
}
支付成功以后通過通知告知用戶支付情況.
- 支付界面接收成功通知告知用戶(我這里是跳轉(zhuǎn)到新的界面)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appPaySuccess) name:APP_PAY_SUCCESS object:nil];
- 通知方法
-(void)appPaySuccess{
ZQPaySuccessVC *paySuccessVC=[[ZQPaySuccessVC alloc]init];
[self.navigationController pushViewController:paySuccessVC animated:YES];
}
- 移除通知(不移除會崩潰呦)
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self name:APP_PAY_SUCCESS object:nil];
}