最近有了點時間總結(jié)一下支付寶支付的問題,以免以后忘了。
我這里寫的是把主要業(yè)務(wù)邏輯都放后臺實現(xiàn)的方法,移動端直接調(diào)接口就行了,也是官方推薦的方法。
關(guān)于微信支付
官方文檔
AliPaySDK和友盟阿里云推送UTDID的沖突問題
如果你的項目還集成了阿里云推送,這里推薦使用手動集成SDK,不然會有UTDID沖突的問題。
代碼部分
#import "AppDelegate.h"
#import <AlipaySDK/AlipaySDK.h>
// NOTE: iOS9.0以前使用的API接口
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
// NOTE: iOS9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"safepay"]) {
//跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
//如果還集成了微信支付的SDK,就寫在一起
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
//微信
BOOL result = [WXApi handleOpenURL:url delegate:self];
if (!result) {
//支付寶
if ([url.host isEqualToString:@"safepay"]) {
//跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
NSLog(@"支付寶客戶端支付結(jié)果result = %@",resultDic);
[PHTitleAlertView showWithAlerTitle:resultDic[@"memo"]];
/*
9000 訂單支付成功
8000 正在處理中
4000 訂單支付失敗
6001 用戶中途取消
6002 網(wǎng)絡(luò)連接出錯
*/
if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {
// 發(fā)通知帶出支付成功結(jié)果
[[NSNotificationCenter defaultCenter] postNotificationName:@"alpayResult" object:resultDic];
} else {
// 發(fā)通知帶出支付失敗結(jié)果
[[NSNotificationCenter defaultCenter] postNotificationName:@"alpayResult" object:resultDic];
}
}];
}
}
return YES;
}
在發(fā)起支付的代碼處
1:給后臺傳支付清單獲取訂單編號orderNo。
2:用戶點擊支付寶支付按鈕的后,給后臺傳orderNo獲取orderStr。
3:喚起微信支付。
備注:AliPaySDK 付款有兩種模式:如果外部存在支付寶錢包,則直接跳轉(zhuǎn)到支付寶錢包付款;不存在的場景下,在 SDK 內(nèi)部進(jìn)行 H5 支付。測試人員需要關(guān)注這兩類測試場景,所以比微信支付少了,判斷是否安裝微信步驟.
#pragma mark - 調(diào)起支付寶支付頁面
/// 自己寫的喚起支付的方法
/// @param payOrder 后臺獲取的orderStr
- (void)SendAliPay:(NSString *)payOrder
{
//:Url_Scheme 為 app 在 info.plist 注冊的 scheme。我用的微信的:Url_Scheme 測試沒毛病
[[AlipaySDK defaultService] payOrder:payOrder fromScheme:Url_Scheme callback:^(NSDictionary *resultDic) {
if ([resultDic[@"ResultStatus"] isEqualToString:@"9000"]) {
/*
9000 訂單支付成功
8000 正在處理中
4000 訂單支付失敗
6001 用戶中途取消
6002 網(wǎng)絡(luò)連接出錯
*/
[SVProgressHUD dismiss];
}else{
//最終支付結(jié)果以后臺反饋為準(zhǔn)
NSString *str = resultDic[@"ResultStatus"];
NSInteger num = str.integerValue;
switch (num) {
case 8000:
[PHTitleAlertView showWithAlerTitle:@"正在處理"];
break;
case 4000:
[PHTitleAlertView showWithAlerTitle:@"訂單支付失敗"];
break;
case 6001:
[PHTitleAlertView showWithAlerTitle:@"用戶中途取消"];
break;
case 6002:
[PHTitleAlertView showWithAlerTitle:@"網(wǎng)絡(luò)連接出錯"];
break;
default:
break;
}
}
}];
}
至此結(jié)束。