iOS不用官方SDK實現微信和支付寶支付XHPayKit

朱曉輝Allen發表於2018-02-24

微信、支付寶支付

前言

前段時間由於專案需求,移除了專案中的微信支付SDK和支付寶支付SDK,這種情況下需要自己搞定支付,第一時間考慮到的是使用openshare,但是當下載openshare下來後發現,openshare的支付介面,並不能直接替換官方SDK支付介面,
官方SDK的實現邏輯是後臺訂單簽名完成後,客服端傳簽名資訊及引數給支付SDK,支付SDK生成協議url,然後拉起第三方支付APP,
而openshare的支付介面是直接傳拉起支付的協議url地址,將生成協議url地址的操作也交給後臺來生成, 這樣的話後臺需要修改程式碼,
能否不修改後臺程式碼,弄一個支付介面直接替換官方SDK支付介面,實現無縫對接呢,於是就研究了下微信和支付寶支付時APP間通訊關係,最後封裝成XHPayKit.

特性:

1.XHPayKit擁有和官方SDK類似介面,可以直接替換官方SDK支付介面,如果你使用過官方SDK,那麼轉換為本庫你只需花費極短時間.
2.XHPayKit只有10kb大小,不用匯入任何依賴庫,便可實現微信支付、支付寶支付,如果你想為專案瘦身或由於某種原因,不想使用官方SDK實現支付功能,此庫將是一個不錯的選擇.
3.XHPayKit使用時,不需要配置微信等平臺appid等資訊,服務端配置就可以了,因為後臺簽名訂單時會返回appid等資訊給客戶端.

注意:

1.先在微信、支付寶開放平臺註冊你的應用,並獲得支付能力
2.匯入此庫,並請將 weixin 、 alipay 欄位新增到info.plist白名單
3.新增自己APP URL Schemes,和微信回撥URL Schemes,詳見README文件

使用方法:

1.微信支付


//微信支付引數,下面7個引數,由後臺簽名訂單後生成,並返回給客服端(與官方SDK一致)
 //注意:請將下面引數設定為你自己真實訂單簽名後伺服器返回引數,便可進行實際支付
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(@"支付結果:\n%@",resultDict);
          NSInteger code = [resultDict[@"errCode"] integerValue];
          if(code == 0){//支付成功
                
          }
}];

複製程式碼

2.支付寶支付


//支付寶訂單簽名,此簽名由後臺簽名訂單後生成,並返回給客戶端(與官方SDK一致)
//注意:請將下面值設定為你自己真實訂單簽名,便可進行實際支付
NSString *orderSign = @"很長的一串支付寶訂單簽名";
        
//傳入支付寶訂單簽名 和 自己App URL Scheme,拉起支付寶支付
[[XHPayKit defaultManager] alipayOrder:orderSign fromScheme:@"XHPayKitExample" completed:^(NSDictionary *resultDict) {
    NSLog(@"支付結果:\n%@",resultDict);
    NSInteger status = [resultDict[@"ResultStatus"] integerValue];
    if(status == 9000){//支付成功
                
    }
}];

複製程式碼

3.在Appdelegate中新增以下程式碼 - 處理第三方支付跳回商戶app攜帶的支付結果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;

複製程式碼

支付結果resultDict釋義:

微信

{
    "errCode":0,
    "errStr":"成功"
}

//以下狀態碼含義與官方SDK一致
errCode = 0,成功
errCode = -1,普通錯誤型別
errCode = -2,使用者點選取消並返回
errCode = -3,傳送失敗
errCode = -4,授權失敗 
errCode = -5,微信不支援
複製程式碼

支付寶

{
    "result":"",
    "resultStatus":"9000",
    "memo":"支付成功"
}

//以下狀態碼含義與官方SDK一致
resultStatus = 9000,支付成功
resultStatus = 8000,正在處理中,支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態
resultStatus = 4000,支付失敗
resultStatus = 5000,重複請求
resultStatus = 6001,使用者中途取消
resultStatus = 6002,網路連線出錯
resultStatus = 6004,支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態

複製程式碼

小結:

XHPayKit的實現非常簡單,感興趣的同學可以下載下來研究下支付時APP間通訊.
程式碼地址:github.com/CoderZhuXH/…

相關文章