前言
1.本文章是繼上篇文章iOS-微信支付關(guān)于服務(wù)器需要做的事情,這樣可以更好的了解服務(wù)的整個流程
2.微信支付的簽名和加密的工作都是在服務(wù)器端做,此篇文章只需要調(diào)用上篇的服務(wù)器的接口,得到服務(wù)器拋出的模型,模型的字段有(partnerId、prepayId、nonceStr、timeStamp、sign)數(shù)據(jù),然后直接調(diào)起微信支付,參照App開發(fā)步驟
3.微信的DEMO中集成了很多的功能,最新下載的DEMO中沒有(V3&V4支付流程實現(xiàn))這段代碼,從網(wǎng)上找到的這段代碼,詳情如下:
4.如果在工程中集成了友盟第三方(登錄、分享)等功能,所以微信支付的SDK就可以不用導(dǎo)入到項目中了(導(dǎo)入也會重復(fù)報錯),微信支付SDK
開始集成微信支付
1.項目設(shè)置APPID
2.導(dǎo)入微信支付的SDK(本工程中因為集成了友盟的第三方(登錄、分享))等功能,所以微信支付的SDK就可以不用再導(dǎo)入到項目中了)
3.導(dǎo)入相關(guān)的庫
- SystemConfiguration.framework
- libz.dylib
- libsqlite3.0.dylib
- libc++.dylib
- Security.framework
- CoreTelephony.framework
- CFNetwork.framework
4.在appDelegate中注冊微信的APPID
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 向微信注冊wxd930ea5d5a258f4f
[WXApi registerApp:@"wxb4ba3c02awiiwiow" withDescription:@"demo 2.0"];
return YES;
}
5.先發(fā)送網(wǎng)絡(luò)請求到自己的服務(wù)器,進行簽名認(rèn)證,獲得支付的參數(shù)(partnerId、prepayId、nonceStr、timeStamp、sign)成功后調(diào)起微信支付
/**
* 點擊微信支付按鈕,走下面的方法
* 去服務(wù)器請求數(shù)據(jù)(partnerId、prepayId、nonceStr、timeStamp)
*/
[[HQNetworkTools sharedTools] requestPingTaiDataWithRootCode:rootCode parameters:para finished:^(id result, NSError *error) {
if (error) {
HQLog(@"%@", error);
} else {
[MBProgressHUD hideHUD];
int success = [result[@"success"] intValue];
if (success == 1) {
HQBaseModel *model = [HQBaseModel mj_objectWithKeyValues:result[@"data"]];
if ([payType_str isEqualToString:@"1"]) { // wepay
PayReq *request = [[PayReq alloc] init];
request.partnerId = model.partnerid;
request.prepayId = model.prepayid;
request.package = @"Sign=WXPay";
request.nonceStr = model.noncestr;
// 注意時間戳一定是10位的(最開始我們后臺返回的就是13位的,一直報錯),而且后臺返回的是String,要轉(zhuǎn)換類型
request.timeStamp = [model.timestamp intValue];
request.sign = model.sign;
/**
* 調(diào)起微信支付的方法
*/
[WXApi sendReq:request];
} else if ([payType_str isEqualToString:@"2"]) { // alipay
}
} else {
[MBProgressHUD showText:result[@"errorInfo"]];
}
}
}];
6.微信支付的回調(diào)
-
參照微信的demo,要實現(xiàn)onResp函數(shù),支付完成后,微信APP會返回到商戶APP并回調(diào)onResp函數(shù),開發(fā)者需要在該函數(shù)中接收通知,判斷返回錯誤碼,如果支付成功則去后臺查詢支付結(jié)果再展示用戶實際支付結(jié)果。注意 一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。為了避免AppDelegate中的代碼太多,新建一個WXApiManager管理類,來處理支付的回調(diào)
image
7.處理支付的回調(diào)AppDelegate
里操作
首先在AppDelegate
里面導(dǎo)入頭文件
#import <WXApi.h>
#import "WXApiManager.h"
- 處理微信的回調(diào),在這里建議將三個方法都加上:
#pragma mark - 設(shè)置微信回調(diào)
// 支持所有iOS系統(tǒng)(被廢棄的方法.但是在低版本中會用到.建議寫上)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
/**
* 微信支付回調(diào)
*/
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
// 僅支持iOS9以上系統(tǒng),iOS8及以下系統(tǒng)不會回調(diào)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
/**
* 微信支付回調(diào)
*/
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
// 支持目前所有iOS系統(tǒng)
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
/**
* 微信支付回調(diào)
*/
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
在代理的類中WXApiManager
處理支付成功或者失敗的回調(diào)(這里可以給支付的控制器發(fā)送通知,然后跳轉(zhuǎn)到”已付款訂單頁面“或者”待付款訂單頁面“)
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp
{
if([resp isKindOfClass:[PayResp class]]) {
// 支付返回結(jié)果,實際支付結(jié)果需要去微信服務(wù)器端查詢
NSString *strMsg = [NSString stringWithFormat:@"支付結(jié)果"];
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付結(jié)果:成功!";
HQLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
/** 發(fā)送支付成功的通知 */
[[NSNotificationCenter defaultCenter] postNotificationName:HQPaySuccessNotification object:nil userInfo:nil];
break;
default:
strMsg = [NSString stringWithFormat:@"支付失敗"];
HQLog(@"錯誤,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
/** 發(fā)送支付失敗的通知 */
[[NSNotificationCenter defaultCenter] postNotificationName:HQCancelPayNotification object:nil userInfo:nil];
break;
}
}
}