iOS 綁定支付寶和支付寶支付(一)

前言

??前段時間公司的 APP 加了一些新需求,其中我負責的錢包模塊多增加了支付寶綁定和支付寶支付的功能。所以研究了一番,在此做個記錄,如果有說的不對的地方,歡迎大佬指出并糾正。

支付寶授權

??支付寶授權其實就是使用支付寶第三方登錄,需要用戶同意授權,使用支付寶登錄你的 APP,這樣你的 APP 就可以通過支付寶 SDK 提供的接口去獲取對應的支付寶信息。例如:你的支付寶賬戶的唯一標示等。

  • 支付寶授權流程圖


    授權流程
  • 支付寶授權流程

  1. APP 向自己后臺發起授權請求,后臺給 APP 返回授權碼,其實就是一個帶著私鑰的字符串。
  2. APP 拿著后臺返回的授權碼去向支付寶發起授權請求。
  3. 支付寶返回給 APP 當次授權的授權碼app_auth_code和開發者的app_id
  4. 拿到支付寶返回的當前授權的授權碼app_auth_code發送給自己的后臺去換取app_auth_token
  5. 用換取的app_auth_token去調用支付寶提供的alipay.open.auth.token.app接口去獲取授權用戶的userId
  • 支付寶授權代碼示例
    ??首先你需要去下載支付寶提供的官方 Demo,然后把官方 Demo 里的APAuthInfo拷貝到你的項目里。
#import <Foundation/Foundation.h>

@interface APAuthInfo : NSObject

/*********************************授權必傳參數*********************************/

//服務接口名稱,常量com.alipay.account.auth。
@property (nonatomic, copy) NSString *apiname;

//調用方app標識 ,mc代表外部商戶。
@property (nonatomic, copy) NSString *appName;

//調用業務類型,openservice代表開放基礎服務
@property (nonatomic, copy) NSString *bizType;

//產品碼,目前只有WAP_FAST_LOGIN
@property (nonatomic, copy) NSString *productID;


//簽約平臺內的appid
@property (nonatomic, copy) NSString *appID;

//商戶簽約id
@property (nonatomic, copy) NSString *pid;

//授權類型,AUTHACCOUNT:授權;LOGIN:登錄
@property (nonatomic, copy) NSString *authType;

//商戶請求id需要為unique,回調使用
@property (nonatomic, copy) NSString *targetID;


/*********************************授權可選參數*********************************/

//oauth里的授權范圍,PD配置,默認為kuaijie
@property (nonatomic, copy) NSString *scope;

//固定值,alipay.open.auth.sdk.code.get
@property (nonatomic, copy) NSString *method;

@end

??其中APAuthInfo中的appIDpidtargetID這三個參數是需要我們自己去賦值的。appID就是你申請的 APP 在支付寶平臺的唯一標識,pid是你申請的 APP 在支付寶平臺對應的商戶號,targetID是保證每次請求的時候它的值是唯一的,所以一般賦值為當前時間的時間戳。

 APAuthInfo *authInfo = [APAuthInfo new];
 authInfo.pid = AliPayPid;
 authInfo.appID = AliPayID;
 authInfo.targetID = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
    
  // 將授權信息拼接成字符串
 NSString *authInfoStr = [authInfo description];
 NSLog(@"authInfoStr = %@",authInfoStr);

??然后向自己后臺去請求獲取私鑰和私鑰加密方式,拿到私鑰以及私鑰加密方式只后拼接成指定格式的字符串,拿這個字符串去發起支付寶授權。

authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, sign, @"RSA2"];
[[AlipaySDK defaultService] auth_V2WithInfo:authInfoStr fromScheme:appScheme callback:^(NSDictionary *resultDic) {
                NSLog(@"resultDic = %@", resultDic);
                // 解析 auth code
                NSString *result = resultDic[@"result"];
                [self handlderAliPayAuthInfo:result];   
}];

??最后,拿到支付寶授權接口的返回值,取result字段所對應的字符串,然后截取出我們需要的auth_codealipay_open_id。然后再把這兩個值傳給后端,由后端去調取支付寶接口去獲取用戶信息。

- (void)handlderAliPayAuthInfo:(NSString *)result {
    
    NSString *authCode = nil;
    NSString *openId = nil;
    
    if (result.length > 0) {
        NSArray *resultArr = [result componentsSeparatedByString:@"&"];
        for (NSString *subResult in resultArr) {
            if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
                authCode = [subResult substringFromIndex:10];
            }
            if (subResult.length > 32 && [subResult hasPrefix:@"alipay_open_id="]) {
                openId = [subResult substringFromIndex:15];
            }
            
            if (openId.length != 0 && authCode.length != 0) {
                break;
            }
        }
    }
    
    NSLog(@"授權結果 authCode = %@, openId = %@", authCode?:@"", openId?:@"");
}

注意

  • 應用授權的app_auth_code是唯一的;app_auth_code使用一次后就會失效,一天(從生成app_auth_code開始的24小時)未被使用就會自動過期; app_auth_token有效期為365天,刷新后重新計時。
  • 支付寶的私鑰必須存放在后端,不能存放在前段。因為在支付寶平臺申請 APP 的時候就會生產一對私鑰和公鑰,只有當你穿的私鑰和支付寶平臺存放的公鑰相配對成功之后,授權請求才會成功。所以,如果把私鑰存放在前段會存在很大的危險漏洞,因此只能把私鑰存放在后端。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容