前言
前段時(shí)間由于項(xiàng)目需求,移除了項(xiàng)目中的微信支付SDK和支付寶支付SDK,這種情況下需要自己搞定支付,第一時(shí)間考慮到的是使用openshare,但是當(dāng)下載openshare下來(lái)后發(fā)現(xiàn),openshare的支付接口,并不能直接替換官方SDK支付接口,
官方SDK的實(shí)現(xiàn)邏輯是后臺(tái)訂單簽名完成后,客服端傳簽名信息及參數(shù)給支付SDK,支付SDK生成協(xié)議url,然后拉起第三方支付APP,
而openshare的支付接口是直接傳拉起支付的協(xié)議url地址,將生成協(xié)議url地址的操作也交給后臺(tái)來(lái)生成,
這樣的話后臺(tái)需要修改代碼,
能否不修改后臺(tái)代碼,弄一個(gè)支付接口直接替換官方SDK支付接口,實(shí)現(xiàn)無(wú)縫對(duì)接呢,于是就研究了下微信和支付寶支付時(shí)APP間通訊關(guān)系,最后封裝成XHPayKit.
特性:
1.XHPayKit擁有和官方SDK類(lèi)似接口,可以直接替換官方SDK支付接口,如果你使用過(guò)官方SDK,那么轉(zhuǎn)換為本庫(kù)你只需花費(fèi)極短時(shí)間.
2.XHPayKit只有10kb大小,不用導(dǎo)入任何依賴庫(kù),便可實(shí)現(xiàn)微信支付花颗、支付寶支付,如果你想為項(xiàng)目瘦身或由于某種原因,不想使用官方SDK實(shí)現(xiàn)支付功能,此庫(kù)將是一個(gè)不錯(cuò)的選擇.
3.XHPayKit使用時(shí),不需要配置微信等平臺(tái)appid等信息,服務(wù)端配置就可以了,因?yàn)楹笈_(tái)簽名訂單時(shí)會(huì)返回appid等信息給客戶端.
注意:
1.先在微信颂斜、支付寶開(kāi)放平臺(tái)注冊(cè)你的應(yīng)用,并獲得支付能力
2.導(dǎo)入此庫(kù),并請(qǐng)將 weixin 、 alipay 字段添加到info.plist白名單
3.添加自己APP URL Schemes,和微信回調(diào)URL Schemes,詳見(jiàn)README文檔
使用方法:
1.微信支付
//微信支付參數(shù),下面7個(gè)參數(shù),由后臺(tái)簽名訂單后生成,并返回給客服端(與官方SDK一致)
//注意:請(qǐng)將下面參數(shù)設(shè)置為你自己真實(shí)訂單簽名后服務(wù)器返回參數(shù),便可進(jìn)行實(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.支付寶支付
//支付寶訂單簽名,此簽名由后臺(tái)簽名訂單后生成,并返回給客戶端(與官方SDK一致)
//注意:請(qǐng)將下面值設(shè)置為你自己真實(shí)訂單簽名,便可進(jìn)行實(shí)際支付
NSString *orderSign = @"很長(zhǎng)的一串支付寶訂單簽名";
//傳入支付寶訂單簽名 和 自己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;
}
其它接口:
/**
是否安裝微信
@return 已安裝YES,未安裝NO
*/
+(BOOL)isWxAppInstalled;
/**
是否安裝支付寶
@return 已安裝YES,未安裝NO
*/
+(BOOL)isAliAppInstalled;
支付結(jié)果resultDict釋義:
微信
{
"errCode":0,
"errStr":"成功"
}
//以下?tīng)顟B(tài)碼含義與官方SDK一致
errCode = 0,成功
errCode = -1,普通錯(cuò)誤類(lèi)型
errCode = -2,用戶點(diǎn)擊取消并返回
errCode = -3,發(fā)送失敗
errCode = -4,授權(quán)失敗
errCode = -5,微信不支持
支付寶
{
"result":"",
"resultStatus":"9000",
"memo":"支付成功"
}
//以下?tīng)顟B(tài)碼含義與官方SDK一致
resultStatus = 9000,支付成功
resultStatus = 8000,正在處理中伴郁,支付結(jié)果未知(有可能已經(jīng)支付成功),請(qǐng)查詢商戶訂單列表中訂單的支付狀態(tài)
resultStatus = 4000,支付失敗
resultStatus = 5000,重復(fù)請(qǐng)求
resultStatus = 6001,用戶中途取消
resultStatus = 6002,網(wǎng)絡(luò)連接出錯(cuò)
resultStatus = 6004,支付結(jié)果未知(有可能已經(jīng)支付成功)焊傅,請(qǐng)查詢商戶訂單列表中訂單的支付狀態(tài)
小結(jié):
XHPayKit的實(shí)現(xiàn)非常簡(jiǎn)單,感興趣的同學(xué)可以下載下來(lái)研究下支付時(shí)APP間通訊.
代碼地址:https://github.com/CoderZhuXH/XHPayKit