這是第二次集成微信支付,距上次微信支付搞定約莫快一年了猪腕,上次匆忙的把問(wèn)題搞定了舞蔽,這次呢,肯定不能簡(jiǎn)單的搞定問(wèn)題就算了码撰,必須來(lái)點(diǎn)干貨的渗柿!
注釋:親測(cè)可用!
本篇說(shuō)些什么呢脖岛?請(qǐng)看目錄:
一.導(dǎo)入的類庫(kù)
二.更改的文件
三.注意事項(xiàng)
四.微信支付流程解析
五.一點(diǎn)干貨分享
一.導(dǎo)入的類庫(kù)
1.導(dǎo)入微信支付SDK
直接把支付官方Demo中的SDKExport 導(dǎo)入自己的項(xiàng)目中即可
效果圖如下:
2.導(dǎo)入的系統(tǒng)庫(kù):(根據(jù)官方Demo)
Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
UIKit.framework
Foundation.framework
// 微信官方的庫(kù)
libWeChatSDK.a
二.更改的文件
1.AppDelegate中
頭文件和代理:
導(dǎo)入
#import "WXApi.h"
遵循
<WXApiDelegate>
Code處理方面:
在didFinishLaunchingWithOptions 方法中導(dǎo)入并調(diào)用以下的方法使應(yīng)用程序一開始啟動(dòng)的時(shí)候就遠(yuǎn)程告訴微信支付等
#pragma mark - 初始化微信支付
- (void)initWpay
{
[WXApi registerApp:@"您的AppId" withDescription:@"標(biāo)示字符串"];
}
導(dǎo)入以下方法的實(shí)現(xiàn):
- (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]];
}
2.要支付的文件中
導(dǎo)入
#import "WXApi.h"
#import "WXApiObject.h"
遵循
<WXApiDelegate>
Code處理方面:
當(dāng)把您的請(qǐng)求發(fā)送出去了之后朵栖,您的服務(wù)器會(huì)給您返回下單成功后的參數(shù)如下為params ,這里面至少要有6個(gè)對(duì)應(yīng)的key值柴梆,如下才可以包裝成我們的PayReq 參數(shù)陨溅,
// 判斷自己的服務(wù)器的產(chǎn)生的訂單參數(shù)返回是否正確,并返回包裝好的參數(shù)
-(PayReq *)isWpayParamsIsCorrect:(NSDictionary *)params {
if ([params allKeys].count >=6) {
PayReq *req =[[PayReq alloc]init];
req.openID =@"您的AppId";
req.partnerId =params[@"partnerid"];
req.prepayId =params[@"prepayid"];
req.nonceStr =params[@"noncestr"];
req.timeStamp =[params[@"timestamp"] intValue];
req.package =params[@"package"];
req.sign =params[@"sign"];
return req;
}
return nil;
}
然后通過(guò)sendReq發(fā)送支付請(qǐng)求,等待跳轉(zhuǎn)微信App完成支付绍在,返回onResp方法中處理:
// 服務(wù)器返回正確的業(yè)務(wù)邏輯處理
// 1.判斷自己的服務(wù)器的產(chǎn)生的訂單參數(shù)返回是否正確
PayReq *payReq =[ws isWpayParamsIsCorrect:infoDic];
if (!payReq) {
return ;
}
// 2.臨時(shí)記錄發(fā)送的參數(shù)
ws.paramsModel =model;
// [DisplayHelper displaySuccessAlert:@"請(qǐng)求微信支付訂單成功!"];
if (![WXApi isWXAppInstalled]) {
[DisplayHelper displayWarningAlert:@"您還沒有安裝微信哦门扇,無(wú)法支付!"];
return ;
}
// 3.調(diào)用微信API,payReq對(duì)應(yīng)的參數(shù)
[WXApi sendReq:payReq];
在完成支付的onResp方法中如果支付成功了偿渡,就去請(qǐng)求我們的服務(wù)器確定確實(shí)成功了之后就展示自己的成功邏輯界面
-(void) onResp:(BaseResp*)resp {
if([resp isKindOfClass:[PayResp class]]){
//支付返回結(jié)果臼寄,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢
switch (code) {
case WXSuccess:
// 1. 包裝對(duì)應(yīng)查詢參數(shù)
// 2. 發(fā)送查詢的是否成功的請(qǐng)求
break;
default:
break;
}
}
}
附上支付返回的狀態(tài)碼提示:
enum WXErrCode {
WXSuccess = 0, /**< 成功 */
WXErrCodeCommon = -1, /**< 普通錯(cuò)誤類型 */
WXErrCodeUserCancel = -2, /**< 用戶點(diǎn)擊取消并返回 */
WXErrCodeSentFail = -3, /**< 發(fā)送失敗 */
WXErrCodeAuthDeny = -4, /**< 授權(quán)失敗 */
WXErrCodeUnsupport = -5, /**< 微信不支持 */
};
三.注意事項(xiàng)
1.urlschemes 的設(shè)置,注意在如下的地方設(shè)置微信支付完成后的回到應(yīng)用程序中溜宽,注意:不設(shè)置的話就無(wú)法返回我的應(yīng)用
2.微信app的白名單加入(自己踩的就是這里的坑)
因?yàn)橹暗腶pp集成支付前要集成分享功能吉拳,http://www.reibang.com/p/5539cdac6097
(shareSDK的集成分享)
眾所周知的,iOS9之后要加白名單如下:(在info.plist 中加入)
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
<string>mqq</string>
<string>mqqapi</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqconnect</string>
<string>mqqopensdkdataline</string>
<string>mqqopensdkgrouptribeshare</string>
<string>mqqopensdkfriend</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqzoneopensdk</string>
<string>wtloginmqq</string>
<string>wtloginmqq2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqzonev2</string>
<string>mqzoneshare</string>
<string>wtloginqzone</string>
<string>mqzonewx</string>
<string>mqzoneopensdkapiV2</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqqbrowser</string>
<string>mttbrowser</string>
</array>
而這次沒集成分享功能适揉,所以沒有把上面weixin這個(gè)value加入進(jìn)去留攒,造成無(wú)法調(diào)啟微信客戶端完成支付的尷尬局面煤惩,吸取了教訓(xùn),切記炼邀!
3.微信支付成功后魄揉,回調(diào)到onResp方法的時(shí)候時(shí),一定要記得去自己的商戶后臺(tái)查詢是否真正支付成功拭宁,而不是直接展示成功什猖,切記!
四.微信支付流程解析
1.下單過(guò)程
商戶App發(fā)送下單的信息 --->商戶后臺(tái)發(fā)送給 --->微信后臺(tái)返回訂單 --->商戶后臺(tái)返回訂單 --->商戶App
2.支付過(guò)程
商戶App發(fā)送sendReq方法--->微信App發(fā)起支付請(qǐng)求--->微信后臺(tái)授權(quán)支付--->微信App輸入密碼完成支付
3.支付完成之后
微信后臺(tái)異步通知--->商戶后臺(tái)
微信App發(fā)送支付成功信息--->商戶App去查詢是否真正支付成功--->商戶后臺(tái)(如果此時(shí)未收到微信后臺(tái)異步通知商戶后臺(tái)則會(huì)調(diào)用查詢API--->微信后臺(tái)返回支付結(jié)果--->商戶后臺(tái))否則红淡,直接根據(jù)微信后臺(tái)異步通知商戶支付成功與否給--->商戶App確認(rèn)
附上:
五.一點(diǎn)干貨分享
1.我的微信支付寶Demo功能展示:
溫馨提示:根據(jù)使用者反饋不狮,由于自己微信支付寶都集成完畢,就把自己集成的微信庫(kù)文件給刪除了在旱,所以接下來(lái)要集成支付寶和微信的小伙伴請(qǐng)移步參考這個(gè)新的鏈接:http://www.reibang.com/p/ef6d74a2b6c3
當(dāng)然摇零,如果還是只集成微信的話,請(qǐng)先下載Demo鏈接為:https://github.com/zxwIsCode/WechatAliPay
接著打開Demo桶蝎,按步驟集成如下圖所示
拖拽左側(cè)的4個(gè)類庫(kù)到您的文件中驻仅,只有微信支付的話,就屏蔽到如上圖的支付寶支付代碼登渣,以及屏蔽下面導(dǎo)入的2個(gè)頭文件:
#import "RSADataSigner.h"
#import <AlipaySDK/AlipaySDK.h>
2.我的微信支付的使用辦法:
注意:這里支付流程中所發(fā)送的支付網(wǎng)絡(luò)請(qǐng)求是從開始購(gòu)買噪服,也就是下單前的處理,具體的如上的sendReq:和onResp:方法在我已經(jīng)封裝好的類中胜茧,可以直接使用的粘优!
拖拽我上面說(shuō)的微信支付的4個(gè)文件夾到您的工程中,之后屏蔽到支付寶支付的有關(guān)代碼和類庫(kù)等呻顽;
再按照上面的步驟分別把不同的系統(tǒng)類庫(kù)導(dǎo)入您的項(xiàng)目中雹顺;
集成完畢了之后,怎么用呢廊遍,請(qǐng)看下面:
直接在您要支付的類里面嬉愧,
導(dǎo)入
#import "CMWechatPayManager.h"
#import "WXApiObject.h"
#import "CMWpaySearchResultDelegate.h"
遵循
CMWpaySearchResultDelegate
按照下面的模式調(diào)用,CMHttpRequestModel的使用可以參考我的空項(xiàng)目對(duì)于網(wǎng)絡(luò)請(qǐng)求庫(kù)的使用簡(jiǎn)介:
http://www.reibang.com/p/c8b6b8660693
(我的空項(xiàng)目的使用喉前,有關(guān)于CMHttpRequestModel的類庫(kù)的介紹等)
NSMutableDictionary *dic =[NSMutableDictionary dictionary];
[dic setValue:@"123"forKey:@"userid"];
// 充值直接調(diào)微信充值
CMHttpRequestModel *model =[[CMHttpRequestModel alloc]init];
model.appendUrl = kSendTask_GetWechatPayParams;
model.paramDic =dic;
model.callback = ^(CMHttpResponseModel * result, NSError *error) {
if (result.state ==CMReponseCodeState_Success) {
}else {
[CMHttpStateTools showHtttpStateView:result.state];
}
};
[[CMWechatPayManager sharedWpayManager] sendWeChatRequestParam:model];
導(dǎo)入以下代理的方法没酣,做自己的成功后的業(yè)務(wù)處理邏輯
#pragma mark - CMWpaySearchResultDelegate
-(void)Wpay:(CMWechatPayManager *)manager andPayResult:(int)code {
switch (code) {
case WXSuccess:
// 1. 包裝對(duì)應(yīng)查詢參數(shù)
// 2. 發(fā)送查詢的是否成功的請(qǐng)求
break;
default:
break;
}
}
附上:
1.微信支付官方文檔:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5#
2.支付寶接入流程分享:
http://www.reibang.com/p/d8edb82e51a7
3.我的微信支付寶支付集成Demo:
https://github.com/zxwIsCode/WechatAliPay
下一篇:支付__解讀我的微信和支付寶封裝類庫(kù)(三):http://www.reibang.com/p/ef6d74a2b6c3
整理了微信和支付寶支付的異同點(diǎn)和注意事項(xiàng),也有了支付成果卵迂,供參考!
有任何問(wèn)題裕便,歡迎聯(lián)系QQ:1824496534,備注:支付狭握;
或者@我闪金,隨時(shí)提供技術(shù)支持!期待中吧论颅,小伙伴哎垦,感謝支持!
本篇于2017年07月27日第一次修改:由使用者反饋恃疯,之前只有微信支付的文件找不到了漏设,故而修改部分集成流程方面等。