iOS不用官方SDK實現(xiàn)微信和支付寶支付XHPayKit
前言
前段時間由于項目需求,移除了項目中的微信支付SDK和支付寶支付SDK,這種情況下需要自己搞定支付,***時間考慮到的是使用openshare,但是當下載openshare下來后發(fā)現(xiàn),openshare的支付接口,并不能直接替換官方SDK支付接口。
官方SDK的實現(xiàn)邏輯是后臺訂單簽名完成后,客服端傳簽名信息及參數(shù)給支付SDK,支付SDK生成協(xié)議url,然后拉起第三方支付APP,而openshare的支付接口是直接傳拉起支付的協(xié)議url地址,將生成協(xié)議url地址的操作也交給后臺來生成。
這樣的話后臺需要修改代碼,能否不修改后臺代碼,弄一個支付接口直接替換官方SDK支付接口,實現(xiàn)無縫對接呢,于是就研究了下微信和支付寶支付時APP間通訊關(guān)系,***封裝成XHPayKit。
微信、支付寶支付
特性:
- XHPayKit擁有和官方SDK類似接口,可以直接替換官方SDK支付接口,如果你使用過官方SDK,那么轉(zhuǎn)換為本庫你只需花費極短時間.
- XHPayKit只有10kb大小,不用導(dǎo)入任何依賴庫,便可實現(xiàn)微信支付、支付寶支付,如果你想為項目瘦身或由于某種原因,不想使用官方SDK實現(xiàn)支付功能,此庫將是一個不錯的選擇.
- XHPayKit使用時,不需要配置微信等平臺appid等信息,服務(wù)端配置就可以了,因為后臺簽名訂單時會返回appid等信息給客戶端.
注意:
- 先在微信、支付寶開放平臺注冊你的應(yīng)用,并獲得支付能力
- 導(dǎo)入此庫,并請將 weixin 、 alipay 字段添加到info.plist白名單
- 添加自己APP URL Schemes,和微信回調(diào)URL Schemes,詳見README文檔
使用方法:
1.微信支付
- //微信支付參數(shù),下面7個參數(shù),由后臺簽名訂單后生成,并返回給客服端(與官方SDK一致)
- //注意:請將下面參數(shù)設(shè)置為你自己真實訂單簽名后服務(wù)器返回參數(shù),便可進行實際支付
- XHPayWxReq *req = [[XHPayWxReq alloc] init];
- req.openID = @"";
- req.partnerId = @"";
- req.prepayId = @"";
- req.nonceStr = @"";
- req.timeStamp = 1518156229;
- req.package = @"";
- req.sign = @"";
- //傳入訂單模型,拉起微信支付
- [[XHPayKit defaultManager] wxpayOrder:req completed:^(NSDictionary *resultDict) {
- NSLog(@"支付結(jié)果:\n%@",resultDict);
- NSInteger code = [resultDict[@"errCode"] integerValue];
- if(code == 0){//支付成功
- }
- }];
2.支付寶支付
- //支付寶訂單簽名,此簽名由后臺簽名訂單后生成,并返回給客戶端(與官方SDK一致)
- //注意:請將下面值設(shè)置為你自己真實訂單簽名,便可進行實際支付
- NSString *orderSign = @"很長的一串支付寶訂單簽名";
- //傳入支付寶訂單簽名 和 自己App URL Scheme,拉起支付寶支付
- [[XHPayKit defaultManager] alipayOrder:orderSign fromScheme:@"XHPayKitExample" completed:^(NSDictionary *resultDict) {
- NSLog(@"支付結(jié)果:\n%@",resultDict);
- NSInteger status = [resultDict[@"ResultStatus"] integerValue];
- if(status == 9000){//支付成功
- }
- }];
3.在Appdelegate中添加以下代碼 - 處理第三方支付跳回商戶app攜帶的支付結(jié)果Url
- #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
- /** iOS9及以后 */
- - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<uiapplicationopenurloptionskey, id> *)options
- {
- BOOL result = [[XHPayKit defaultManager] handleOpenURL:url];
- if (!result) {//這里處理其他SDK(例如QQ登錄,微博登錄等)
- }
- return result;
- }
- #endif
- /** iOS9以下 */
- - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- {
- BOOL result = [[XHPayKit defaultManager] handleOpenURL:url];
- if (!result) {//這里處理其他SDK(例如QQ登錄,微博登錄等)
- }
- return result;
- }</uiapplicationopenurloptionskey, id>
其它接口:
- /**
- 是否安裝微信
- @return 已安裝YES,未安裝NO
- */
- +(BOOL)isWxAppInstalled;
- /**
- 是否安裝支付寶
- @return 已安裝YES,未安裝NO
- */
- +(BOOL)isAliAppInstalled;
支付結(jié)果resultDict釋義:
微信
- {
- "errCode":0,
- "errStr":"成功"
- }
- //以下狀態(tài)碼含義與官方SDK一致
- errCode = 0,成功
- errCode = -1,普通錯誤類型
- errCode = -2,用戶點擊取消并返回
- errCode = -3,發(fā)送失敗
- errCode = -4,授權(quán)失敗
- errCode = -5,微信不支持
支付寶
- {
- "result":"",
- "resultStatus":"9000",
- "memo":"支付成功"
- }
- //以下狀態(tài)碼含義與官方SDK一致
- resultStatus = 9000,支付成功
- resultStatus = 8000,正在處理中,支付結(jié)果未知(有可能已經(jīng)支付成功),請查詢商戶訂單列表中訂單的支付狀態(tài)
- resultStatus = 4000,支付失敗
- resultStatus = 5000,重復(fù)請求
- resultStatus = 6001,用戶中途取消
- resultStatus = 6002,網(wǎng)絡(luò)連接出錯
- resultStatus = 6004,支付結(jié)果未知(有可能已經(jīng)支付成功),請查詢商戶訂單列表中訂單的支付狀態(tài)
小結(jié):
XHPayKit的實現(xiàn)非常簡單,感興趣的同學(xué)可以下載下來研究下支付時APP間通訊.
代碼地址:https://github.com/CoderZhuXH/XHPayKit